프레임워크
스프링 프레임워크
주요 기능과 특징
POJO
DI(종속 객체 주입)
--만드는법
applicationContext.xml에서 객체를 만들어준다.
1. bean을 이용한 DAO 객체 만들기
1 2 | <bean name="articleDAO" class="com.spring.di.OracleArticleDAO"> </bean> | cs |
이를 생성자 또는 메서드에 연결하여 넘긴다.
1. 생성자의 경우
1 2 3 4 5 6 | <bean name="articleService2" class="com.spring.di.ArticleServiceImpl2"> <constructor-arg> <ref bean="articleDAO" /> </constructor-arg> </bean> | cs |
1 2 3 4 5 6 7 8 9 10 11 | <bean name="articleService3" class="com.spring.di.ArticleServiceImpl3"> <property name="articleDao" ref="articleDAO"></property> </bean> <!-- 또는 --> <bean name="articleService3" class="com.spring.di.ArticleServiceImpl3" p:articleDao-ref="articleDAO"> </bean> | cs |
이렇게 만들어진 빈을 메인에서 불러와 사용한다.
스트링 컨텍스트 로드 이용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //1) 스트링 컨텍스트 로드 ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml"); //2) 빈 얻어오기 ArticleService service2 = (ArticleService) context.getBean("articleService2"); //3) 빈 사용하기 ArticleVO vo2 = new ArticleVO(); vo2.setNo(2); vo2.setTitle("DI - 생성자 이용한 종속객체 주입"); service2.write(vo2); service2.edit(vo2); | cs |
와이어링
애플리케이션 컨텍스트
AOP(애스펙트 지향 프로그래밍)
--만드는법
공통 관심 사항을 구현한 POJO 클래스 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.ProceedingJoinPoint; public class LoggingAspect { private Log log = LogFactory.getLog(getClass()); public Object logging(ProceedingJoinPoint joinPoint) throws Throwable{ log.info("기록 시작:"+ joinPoint.toString()); long start = System.currentTimeMillis(); try { Object retValue = joinPoint.proceed(); //실제 타켓 메서드 호출 /*ProceedingJoinPoint 객체는 Aspect 가 적용되는 객체 및 메서드에 대한 정보를 담고 있으며, 이 객체를 통해서 핵심 로직을 실행할 수 있게 됨*/ return retValue; }finally { long finish = System.currentTimeMillis(); long time=finish-start; log.info("기록 종료"); log.info(joinPoint.getSignature().getName() + "메서드 실행시간:" + time +" 밀리초"); } //설정 파일에서 Aspect를 어떤 클래스의 어떤 메서드에 적용할지를 설정한다 } } | cs |
2- ProceedingJoinPoint : JoinPoint 의 하위클래스로
서 proceed() 메서드를 가지고 있다.
3- ProceedingJoinPoint 객체는 Aspect 가 적용되는 객
체 및 메서드에 대한 정보를 담고 있으며, 이 객체를 통
해서 핵심 로직을 실행할 수 있게 됨
4- proceed() 메서드를 사용하여 실제 타켓 메서드를 호
출하게 된다
공통기능 구현 후 Aspect를 어떤 클래스의 어떤 메서드에 적용할지 설정
1 2 3 4 5 6 7 8 | <aop:config> <aop:pointcut expression="execution(* *..*Service.*(..))" id="servicePointcut"/> <aop:aspect id="loggingAspect" ref="loggingAsp"> <aop:around method="logging" pointcut-ref="servicePointcut"/> </aop:aspect> </aop:config> | cs |
<aop:around> 메서드 호출 전, 수 예외 발생등 모든 시점에 적용 가능한 Adcice를 정의한다.
<aop:after> 메서드가 정상적으로 실행되는지 또는 예외 발생시키는지 여부 상관없이 적용되는 Advice를 정의. finally와 비슷함.
<aop:after-throwing> 메서드가 예외를 발생시킬 때 적용되는 Advice를 정의. catch와 비슷
<aop:after-returning> 메서드가 정상적으로 실행된 후에 적용 되는 Advice를 정의
<aop:before> 메서드 실행 전에 적용되는 Advice를 정의
2- 위 소스 중 execution(수식어패턴 리턴타입패턴 클래스이름패턴 이름패턴(파라미터패턴) 예외패턴)
수식어 - 생략 가능, public, protected
리턴타입 - 리턴 타입명시
클래스이름 - 패키지명.클래스 이름. 메서드 이름을 패턴으로 명시
파라미터 - 매칭될 파라미터 명시
각 패턴은 이용하여 모든값 표현 가능
'..'은 0개 이상이라는 의미
execution(get*(..))
이름이 get으로 시작하고 0개이상의 파라미터를 갖는 메서드 호출
리턴,이름,파라미터 제외 나머지 생략가능