Spring-(1) Spring 개념과 DI
Aspect Oriented Programming [AOP] 지원
Spring은 자체적으로 AOP를 지원하고 있기 때문에 트랜잭션이나 로깅, 보안과 같이 여러 비즈니스 모듈에서 공통적으로 필요로 하는 공통 관심 사항을 핵심 로직과 분리시켜 각 모듈에 적용할 수 있음
AOP하면 ‘중복 코드 삭제’ 무조건 암기할 것
Aspect 란 ?
보안과 로깅 모듈처럼 그 자체로 애플리케이션의 핵심 기능을 다루고 있지는 않지만, 애플리케이션을 구성하는 중요한 요소이고, 핵심 기능에 적용 되어야만 의미를 갖는 특별한 모듈을 의미 ( 공통으로 가지는 중요 기능 로직을 구성하고 있는 것을 말함)
AOP Advice 종류
Advice 종류 | XML스키마 기반의 POJO 클래스를 이용 | @Aspect애노테이션 기반 | 설명 |
---|---|---|---|
Before | <aop:before> | @Before | target 객체의 메소드 호출시 호출 전에 실행 |
AfterReturning | <aop:after-returning> | @AfterReturning | target 객체의 메소드가 예외없이 실행된 후 호출 |
AfterThrowing | <aop:after-throwing> | @AfterThrowing | target객체의 메소드가 실행하는 중 예외가 발생한 경우에 호출 |
After | <aop:after> | @After | target 객체의 메소드를 정상 또는 예외 발생 유무와 상관없이 실행 try의 finally와 흡사 |
Around | <aop:around> | @Around | target객체의 메소드 실행 전, 후 또는 예외 발생 시점에 모두 실행해야할 로직을 담아야 할 경우 |
로직구분
- 핵심 로직 : 비즈니스 로직 (core) ex. 구매와 판매
- 공통 로직 : 핵심이 아닌 공통으로 사용되는 로직 ex. 구매로직에만 적용되는 공지사항, 판매로직에만 적용되는 공지사항
핵심로직과 공통로직 적용시점
- 공통로직 반영 시점은 각 핵심 로직들이 실행 전, 실행 후 적용
- before : 핵심로직 실행전, 전처리
- after : 핵심로직 실행후, 후처리
- throwing : 예외 발생 - 핵심로직 실행중 예외 발생
- returning : 핵심 로직 정상 실행되면서 반환시 - 후처리
- around : before,after,throwing,returning 포괄적인 설정 가능
용어 및 특징
- pointcut , pointcut-ref : 공통로직을 적용받을 핵심 로직의 위치 + 시점
- 공통로직의 클래스 : ~Aspect
<!-- aop 사용을 위한 필수 설정 -->
<aop:aspectj-autoproxy />
<!-- 핵심로직(biz, core)과 공통로직(aspect)을 스프링 빈으로 등록 -->
<bean id="biz" class="step02.biz.aop.Car" />
<bean id="common" class="step02.common.aop.NoticeAspect" />
<!-- 핵심로직 실행 전, 후 공통 로직 적용
핵심의 어떤 메소드들에 공통 로직 적용할지도 결정을 해야함
어떤 핵심 로직의 메소드에 어떤 공통로직의 메소드를 정해진 시점에 적용
spring은 aspectj라는 framework 활용
- 기능을 메소드에만 적용 + 표현법은 그대로 사용
-->
<aop:config>
<aop:pointcut id="bizLogic" expression="execution(* step02.biz.aop.Car.buy*(..))"/>
<aop:aspect ref="common">
<aop:before method="noticBuyStart" pointcut-ref="bizLogic"/>
<aop:after method="noticBuyEnd" pointcut-ref="bizLogic"/>
<!-- <aop:before method="noticeBuyStart" pointcut="execution(* step02.biz.Car.buy*(..))" />
<aop:after method="noticBuyEnd" pointcut="execution(* step02.biz.Car.buy*(..))" /> -->
</aop:aspect>
</aop:config>
댓글남기기