사용자 도구

사이트 도구


spring:home

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
spring:home [2018/09/02 13:48] – [외부파일을 이용한 설정] taekguspring:home [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1
줄 5: 줄 5:
     * [[spring:mvcproject|Spring MVC Project]]     * [[spring:mvcproject|Spring MVC Project]]
  
 +  - [[https://www.codeproject.com/Articles/1263860/WebControls/|Spring Boot]]
 +  - [[https://start.spring.io|Spring Boot app을 쉽게 생성하는 "Spring 초기화 해주는 자":https://start.spring.io]]
 +  - [[https://goddaehee.tistory.com/204|Spring에서 jsp view사용]]
 ==== DI(Dependency Injection)와 IOC컨테이너 ==== ==== DI(Dependency Injection)와 IOC컨테이너 ====
  
줄 143: 줄 146:
  </bean>  </bean>
 </beans> </beans>
 +</code>
 +
 +<code java>
 +public class MainEnv {
 +
 + public static void main(String[] args) {
 + String config = null;
 + Scanner scanner = new Scanner(System.in);
 + String str = scanner.next();
 + if(str.contentEquals("dev")) {
 + config = "dev";
 + } else if( str.contentEquals("prod")) {
 + config = "prod";
 + }
 + scanner.close();
 +
 + GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
 + ctx.getEnvironment().setActiveProfiles(config);
 + ctx.load("applicationCTX_dev.xml","applicationCTX_prod.xml");
 +
 + ServerInfo info = ctx.getBean("serverInfo", ServerInfo.class);
 + System.out.println("serverAddress=" + info.getServerAddress());
 + System.out.println("serverPort=" + info.getServerPort());
 + ctx.close();
 + }
 +
 +}
 +</code>
 +
 +==== AOP(Aspect Oriented Promming : 관점지향프로그래밍) ====
 +프로그래밍을 하다 보면, 공통적인 기능이 많이 발생 합니다. 이러한 공통 기능을 모든 모듈에 적용하기 위한 방법으로 상속을 통한 방법이 있습니다.
 +상속도 좋은 방법이기는 하지만 몇 가지 문제가 있습니다.우선 JAVA에서는 다중 상속이 불가하므로 다양한 모듈에 상속기법을 통한 공통 기능 부여는 한계가 있습니다.
 +그리고, 기능 구현부분에 핵심 기능 코드와 공통 기능 코드가 섞여 있어 효율성이 떨어집니다.
 +
 +위의 상속을 통한 방법에 한계가 있어 AOP가 등장하게 되었습니다.
 +AOP방법은 핵심 기능과 공통 기능을 분리 시켜놓고, 공통 기능을 필요로 하는 핵심 기능들에서 사용하는 방식 입니다.
 +
 +쉽게 생각해서 아침에 밥을 짓는다고 생각해 봅니다.
 +핵심 기능은 쌀을 씻고, 깨끗한 물을 적당히 넣고, 전자밥솥에 내솥을 넣고, 취사 버튼을 누르는 기능들 일 것입니다
 +공통 기능은 수도 꼭지를 열어 물을 받고, 쌀이 깨끗이 씻겼는지 눈으로 판단하고, 물을 적당한지 판단하는 기능들 일 것입니다. 
 +이러한 기능이 공통 기능인 것은 밥을 짓는 행동이 아닐 때도 우리는 수도 꼭지를 열고, 눈으로 사물을 보고 적절한 판단을 하기 때문에 공통 기능이라고 하였습니다.
 +어쨌든, 이렇게 핵심 기능과 공통 기능을 분리해 놓고, 추후에 밥을 짓는 행동 말고 팥을 쑬 때도 핵심 기능은 변화지만, 공통 기능은 다시 적용할 수 있을 것입니다.
 +
 +AOP 기법이 바로 이러한 것입니다. 공통 기능을 핵심 기능과 분리해 놓고, 공통 기능 중에서 핵심 기능에 적용하고자 하는 부분에 적용하는 것입니다.
 +
 +=== AOP란? ===
 +Spring에서 AOP구현 방법 : proxy를 이용합니다.
 +스프링에서 AOP구현 방식
 +  * XML스키마기반의 AOP구현
 +  * @Aspect어노테이션기반의 AOP구현
 +용어정리
 +  * Aspect : 공통 기능
 +  * Advice : Aspect의 기능 자체
 +  * Jointpoint : Advice를 적용해야 되는 부분( ex, 필드, 메소드 ) (스프링에서는 메소드만 해당)
 +  * Pointcut : Jointpoint의 부분으로 실제로 Advice가 적용된 부분
 +  * Weaving : Advice를 핵심 기능에 적용 하는 행위
 +<code xml>
 +<?xml version="1.0" encoding="UTF-8"?>
 +<beans xmlns="http://www.springframework.org/schema/beans"
 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" profile="dev"
 + xmlns:aop="http://www.springframework.org/schema/aop"
 + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
 + <!-- Root Context: defines shared resources visible to all other web components -->
 + <bean id="logAop" class="com.taekgu.ex.LogAop" />
 + <aop:config>
 + <aop:aspect id="logger" ref="logAop">
 + <aop:pointcut id="publicMethod"
 + expression="within(com.taekgu.ex.*)" />
 + <aop:around pointcut-ref="publicMethod" method="loggerAop" />
 + </aop:aspect>
 + </aop:config>
 + <bean id="serverInfo" class="com.taekgu.ex.ServerInfo">
 + <property name="serverAddress" value="localhost"></property>
 + <property name="serverPort" value="8080"></property>
 + </bean>
 +
 +</beans>
 +</code>
 +
 +<code java>
 +package com.taekgu.ex;
 +
 +import org.aspectj.lang.ProceedingJoinPoint;
 +
 +public class LogAop {
 + public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
 + String signatureStr = joinpoint.getSignature().toShortString();
 + System.out.println(signatureStr + "is start.");
 + long st = System.currentTimeMillis();
 + try {
 + Object obj = joinpoint.proceed();
 + return obj;
 + } finally {
 + long et = System.currentTimeMillis();
 + System.out.println(signatureStr + " is finished.");
 + System.out.println(signatureStr + " 경과시간 " + (et - st));
 + }
 +   }
 +}
 </code> </code>
spring/home.1535896087.txt.gz · 마지막으로 수정됨: 2025/04/15 10:05 (바깥 편집)