Spring AOP
AOP(Aspect Oriented Programming)
AOP는 관점 지향 프로그래밍이라고 불린다. 관점 지향은 객체 지향, 절차 지향 과는 또 다른 패러다임으로 특정 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누고 그 관점을 기준으로 모듈화(어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것) 를 하겠다는 것이다.
AOP에서 각 관점을 기준으로 로직을 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다.
이때 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 흩어진 관심사(Crosscutting Concerns)라 부른다.
위 그림에서 A,B,C의 클래스가 있다.
클래스 A에서는 주황, 파랑, 빨간색 블록으로 구성되어 있고 클래스 B에서는 빨강, 주황 블록으로 구성되어 있으며 클래스 C에서는 주황, 파랑 블록으로 구성되어 있다. (해당 색은 하나의 로직(코드) 라고 가정)
클래스 A에서 주황색 블록을 수정하게 되면 클래스 B,C에서도 수정을 해야 하는데 이런 경우 유지보수 관점에서 모든 코드를 수정해야 하니 안좋다. 따라서 Aspect X에서는 공통 관심사인 주황색 블록을 묶어서 모듈화를 시킴으로써 코드의 재사용성과 유지 보수성을 강화하였다.
[Spring AOP 주요 용어]
- Aspect
- 공통적인 기능들을 모듈화 한 것. 주로 부가기능을 모듈화 함(로그, 트랜잭션 등)
- Target
- Aspect가 적용될 대상을 의미하며 메소드, 클래스 등이 해당됨.
- JoinPoint
- Aspect가 적용될 수 있는 시점.(메소드 실행 전, 후 등)
- Advice
- Aspect의 기능을 정의한 것으로 실질적인 부가기능을 담은 구현체
- PointCut
- Advice를 적용할 메소드의 범위를 지정하는 것
[주요 어노테이션]
- @Aspect
- 해당 클래스를 Aspect로 사용하겠다는 것을 명시
- @Before
- 타겟 메서드가 실행되기 전에 Advice를 실행
- @After
- 타겟 메서드가 실행된 후에 Advice를 실행
- @AfterReturning
- 타겟 메서드가 정상적으로 실행되고 반환된 후에 Advice를 실행
- @AfterThrowing
- 타겟 메서드에서 예외가 발생했을 때 Advice를 실행
- @Around
- 타겟 메서드 실행 전, 후 또는 예외 발생 시에 Advice를 실행
[포인트컷 표현식 & 지시자]
포인트컷은 관심 조인 포인트를 결정하므로 어드바이스가 실행되는 시기를 제어할 수 있다. AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공한다.
@Pointcut("execution(* com.example.aop.. *(..))")
private void someMethod(){}
포인트컷 표현식은 execution과 같은 포인트컷 지시자(PCD : Pointcut Designator)로 시작한다.
[포인트컷 지시자 종류]
- execution
- 메서드 실행 조인 포인트를 매칭. 가장 많이 사용하며 기능도 많음
- within
- 특정 타입 내의 조인 포인트를 매칭
- args
- 인자가 주어진 타입의 인스턴스인 조인 포인트
- this
- 스프링 AOP 프록시를 대상으로 하는 조인 포인트
- target
- Target 객체(스프링 AOP 프록시가 가리키는 실제 대상)를 대상으로 하는 조인 포인트
- @target
- 실행 객체의 클래스에 주어진 타입의 어노테이션이 있는 조인 포인트
- @within
- 주어진 어노테이션이 있는 타입 내 조인 포인트
- @annotation
- 메서드가 주어진 어노테이션을 가지고 있는 조인 포인트를 매칭
- @args
- 전달된 실제 인수의 런타임 타입이 주어진 타입의 어노테이션을 갖는 조인 포인트
- bean
- 스프링 전용 포인트컷 지시자로 빈의 이름을 포인트컷으로 지정.
[Pointcut 표현식 결합]
포인트컷 표현식은 And, Or, Not(&&, ||, !)을 사용하여 결합할 수 있으며 이름으로 pointcut 표현식을 참조할 수도 있다.
@Pointcut("execution(public * *(..))")
private void allPublicMethod(){}
@Pointcut("within(com.example.aop.service..*)")
private void inServiceMethod(){}
@Pointcut("allPublicMethod() && inServiceMethod()")
private void allPublicMethodInService(){}
[Spring] @ControllerAdvice로 요청, 응답 데이터 암/복호화 리팩터링
[리팩터링 계기] 맡은 프로젝트에서 요청 데이터들은 암호화해서 들어오고, Header에 특정 값을 통해 복호화를 해서 비즈니스 로직을 실행한 다음 다시 암호화를 해서 응답한다. 따라서 암호화된
dev-density.tistory.com
'Spring' 카테고리의 다른 글
[Spring] @ControllerAdvice로 요청, 응답 데이터 암/복호화 리팩터링 (1) | 2023.10.23 |
---|---|
[Spring] Spring IoC / DI 란? (1) | 2023.10.08 |
[Spring] Spring이란? (1) | 2023.10.03 |