굉장히 오랜만에 개발관련 포스팅..
Spring이나 Spring기반 FW에서 쓰이는 AOP 에 대해 간단히 알아보려고 한다.
1. AOP ( Aspect Oriented Programming) 이란?
관점 지향 프로그래밍이다.
관점이란 여러 곳에서 사용되는 동일한 코드를 의미 한다.
동일한 코드가 여러 Class 파일에 혼재되어 중복사용되는 경우 관심사가 흩어졌다고 한다.
공통으로 사용하는 부분들은 모듈화시키고 각 파일은 자기의 비즈니스 로직만 딱 수행하도록 분리하는 방법이다.
결론적으로 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지다.
2. AOP 주요 개념
- Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
- Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
- Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
- JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
- PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
개념만 봐서는 잘 안와닿는다... 어노테이션과 같이 보면서 알아보자.
3. AOP 관련 어노테이션
@Aspect : 공통 코드가 모여있는 Class위에 선언하여 해당 Class가 관점 클래스라는 것을 가리킨다.
Bean이 생성되지 않기때문에 @Component 도 같이 사용해준다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Around("@PointCut") : Advice의 한 종류로 @PointCut 조건에 해당하는 로직들의 실행 전/후에 실행되기를 원하는 Function위에 선언한다.
@Before("@PointCut") : @PointCut 조건에 해당하는 로직들의 실행 전에 실행되기를 원하는 Function위에 선언한다.
@After("@PointCut") : @PointCut 조건에 해당하는 로직들의 실행 후에 실행되기를 원하는 Function위에 선언한다.
@AfterReturing("@PointCut") : @PointCut 조건에 해당하는 로직들의 성공적인 실행이 끝난 후에 실행되기를 원하는 Function위에 선언한다.
@AfterThrowing("@PointCut") : @PointCut 조건에 해당하는 로직들이 예외가 발생했을 경우에 실행되기를 원하는 Function위에 선언한다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@PointCut : @Around로 지정된 Function이 어떤 조건에 실행될지를 담는다. 표현식은 경우의 수에 따라 매우 다양하다.
예시를 보자.
@Around(execution(public void get*()))
public String fun() {
alert('실행이닷');
}
위의 코드는 @PointCut 자리에 execution(public void get*()) 가 들어갔다.
그렇다면 Around로 지정된 fun이라는 함수는
public void형태이면서 함수명이 get으로 시작하고 파라미터가 존재하지 않는 함수들의 실행 전/후에 같이 실행된다는 것이다.
@Before("within(org.springframework.web.bind.annotation.RestController)")
public String fun() {
alert('실행이닷');
}
within(경로) 는 패키지 내의 특정 타입에 속하는 함수를 명시할때 사용한다.
위의 코드는 패키지 내에서 @RestController라는 어노테이션을 사용한 모든 함수가 실행되기 전에! fun함수도 같이 실행된다.
@Around("within(com.board.web")
public String fun() {
alert('실행이닷');
}
위의 코드는 com.board.web 패키지에 속하는 클래스들의 함수가 실행될때 fun함수도 같이 실행된다는 의미이다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Order(n) : n은 자연수, 2개 이상의 Aspect들을 관리할때 적용 순서를 부여할 수 있다.
종합적인 어노테이션의 예시를 보면서 마무리하자.~~
@Aspect
@Order(1) // 1번째로 적용할 Aspect
public class FirstAspect {
@Before("within(org.springframework.web.bind.annotation.RestController)")
public String fun() {
alert('실행이닷');
}
}
@Aspect
@Order(2) // 2번째로 적용할 Aspect
public class SecondAspect {
@Before("execution(void *.run())")
public String fun() {
alert('run함수라면 날 거쳐가지');
}
}
참고자료:
https://devlog-wjdrbs96.tistory.com/398
https://engkimbs.tistory.com/746
https://galid1.tistory.com/498
'프로그래밍 > Spring Framework' 카테고리의 다른 글
[Spring] 의존성 주입, DI (Dependency Injection) 란? (0) | 2020.08.14 |
---|---|
[Spring] VO와 DTD의 차이란? (Value Object / Data Transfer Object) (0) | 2020.08.14 |
[Spring] Mybatis 연동 시 오류 해결방법 (3) | 2020.07.26 |
[Spring] 스프링 게시판 예제 (3) - DB연동 + View단 출력 (0) | 2020.07.25 |
[Spring] Maven 빌드, 인스톨 시 fatal 오류 해결법 (0) | 2020.07.25 |