AOP란?
- AOP는 Aspect Oriented Programming의 약자. ⇒ 관점 지향 프로그래밍
- 관점 지향이란, 어떤 로직을 핵심적인 관점과 부가적인 관점으로 나누어 보고 그 관점을 기준으로 로직을 모듈화하는 것
-
AOP의 목적은 흩어진 관심사(Crosscutting Concerns)를 하나로 모듈화 하는 것
-
위 그림에선, 클래스 A와 B, 그리고 C에서 공통적으로 사용되는 코드들이 존재
-
이러한 코드들을 방치하면, 주황색 하나의 내용을 변경하기 위해선 A,B,C 클래스 모두를 수정해야 함
=> SOLID 원칙 위배
-
이렇게 흩어진, 소스 코드에서 반복적으로 사용되는 부분을 흩어진 관심사(Crosscutting Concerns)라고 함
-
AOP에서는 이러한 흩어진 관심사를 Aspect라는 하나의 블럭으로 모듈화시켜줌
용어 | 설명 |
---|
Aspect | 흩어진 관심사를 모듈화 한 것 |
Target | Aspect를 적용하는 곳. |
Advice | 실질적으로 어떤 일을 해야 할 지에 대한 것, 실질적인 부가기능을 담은 구현체 |
Join Point | Advice가 적용될 위치 혹은 끼어들 수 있는 시점. 메서드 진입 시점, 생성자 호출 시점, 필드에서 꺼내올 시점 등 다양한 시점에 적용할 수 있음 |
Point Cut | Join Point의 상세한 스펙을 정의한 것 |
AOP 적용 방법
- 컴파일 타임 적용
: 컴파일 시점에 바이트 코드를 조작하여 AOP가 적용된 바이트 코드를 생성하는 방법
- 로드 타임 적용
: 순수하게 컴파일 한 뒤, 클래스를 로딩하는 시점에 클래스 정보를 변경하는 방법
- 런타임 적용
: Spring AOP가 주로 사용하는 방법. A라는 클래스 타입의 Bean을 만들 때 A 타입의 Proxy Bean을 만들어 Proxy Bean이 Aspect 코드를 추가하여 동작하는 방법
Spring AOP의 특징
- 프록시 패턴 기반의 AOP 구현체. 프록시 객체를 통해 접근 제어 및 부가 기능 추가
- Spring Bean에만 AOP 적용 가능
- 모든 AOP 기능을 제공하는 것이 아니라, 어플리케이션에서 가장 흔한 문제(중복 코드 방지, 로깅, 프록시 클래스 작성) 등을 해결하기 위한 것이 목적
실제 사용
- 실행 및 종료, 에러 시 작동하도록 AOP 설정
- @Before : 어드바이스 타겟 메소드가 호출되기 전 어드바이스 기능 수행
- @AfterReturning : 타겟 메소드가 성공적으로 결과값을 반환 후 어드바이스 기능 수행
- @AfterThrowing : 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능 수행
- 위 세가지 어노테이션으로 Controller단 메서드가 실행될 때 마다 입•출력값을 확인 및 시작, 종료 시간 측정
- 위 어노테이션 이외에도
- @After : 타겟 메소드의 결과에 관계없이 타겟 메소드가 완료되면 어드바이스 기능을 수행
- @Around : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출 전과 후에 어드바이스 기능을 수행
- 라는 어노테이션이 존재
참고
https://docs.spring.io/spring-framework/reference/core/aop.html
https://engkimbs.tistory.com/746
https://code-lab1.tistory.com/193