Layer 안에 부가 기능들을 각 각 삽입한 단순 접근의 단점
- 비즈니스 로직과 로깅 기능을 혼합
- 관심사의 분리 원칙을 위반
- 복잡성과 상호 의존성 향상
- 느슨하게 결합 된 디자인 방지
- 반복되는 코드로 수정이 어려워진다.
Spring AOP
- AOP는 부가 기능(Logging, Transaction...)을 메인 프로그램의 비즈니스 로직과 분리
-> Spring Framework가 부가 기능들을 핵심 기능에 적용시켜준다.
AOP-Weaving
- app function 호출(Caller -> Proxy)
- 횡단 관심사(cross-cutting concern) 실행 (Proxy -> Aspect)
- app function 호출(Proxt ->Aspect -> Target)
- app function에서 return(Target -> apspect ->Proxy)
- 횡단 관심사(cross-cutting concern) 실행(Proxy -> Aspect)
- 값 Caller에 return
AOP Definitions
예시 코드
/*Aspect*/
@Aspect
public class Logger{
/*Pointcut*/
@Pointcut("execution(void 패키지명.클래스명.메서드())")
private void selectSound()
{
}
/*Advice*/
@Before("selectSound()")
public void aboutToSound(){
sysout("before: about to sound");
}
}
/*Target*/
public class Cat implements AnimalType{
String myName;
public void setMyName(String myName){
this.myName = myName;
}
/*JoinPoint*/
public void sound() {
sysout("Cat name =" + myName + ": " + "Meow!");
}
}
Annotation 설명
Aspect
- 여러 클래스를 가로 지르는 엔터프라이즈 애플리케이션 문제를 구현하는 클래스
- pointcut과 advice의 조합
- 예 : 로깅, 프로파일링, 보안, 트랜잭션
Join Point
- 애플리케이션에서 AOP 측면을 플러그인 할 수있는 지점
- application funtion == joinpoint
Advice
- 메소드 실행 전후에 수행되는 실제 조치
- joinpoint 수행되기 전에 수행되는 것 : Before advice
- 후에 수행되는 것: After advice
PointCut
- advice을 실행해야하는 일련의 Join Point 집합
- 표현식 또는 패턴을 사용하여 PointCut 지정
- joinpoint가 너무 많은 경우에 Pointcut을 사용해서 간단하게 표현 가능 ( *.f() )
Advice 타입
before: 메소드 실행 전에 advice실행
after: 결과에 관계없이 메소드 실행 후 advice실행
after-returning: 메소드가 성공적으로 완료된 경우에만 메소드 실행 후 advice 실행
after-throwing: 메소드가 예외를 throw하여 종료 된 경우에만 메소드 실행 후 advice 실행
around: advice 메소드의 호출 전후에 advice 실행
Pointcut Expression Pattern
Aspects Implementation 2가지
- regular Java classes 와 XML config로 Aspect 설정
- regular Java classes 와 annotaion로 Aspect 설정
요약
AOP key 요소들
-aspect, Pointcut, join point, advice
AOP를 사용하면 여러 클래스에 영향을 주는 기능을 재사용 가능한 모듈 (예 : aspect)로 캡슐화 할 수 있다.
AOP의 장점 :
- 관심의 분리
- 코드 재사용 및 모듈화
- 느슨하게 결합 된 디자인
reference
https://www.codejava.net/frameworks/spring/understanding-spring-aop
'Spring > 이론' 카테고리의 다른 글
MVC(Model-View-Controller) (0) | 2020.03.17 |
---|---|
DB 연동(with Spring JDBC) (0) | 2020.03.09 |
의존성 주입(Dependency Injection) (0) | 2020.03.05 |
JSP(Java Server Pages) (0) | 2020.03.05 |
Servlet (0) | 2020.03.04 |
댓글