AOP(Asepect Oriented Programming) 기능
기존의 비즈니스로직 외 작성해야 하는 코드를 별도로 분리함으로써 개발자가 좀 더 비즈니스 로직에만 집중해서 처리할 수 있는 방법을 제공
=> 비즈니스로직이 아닌 공통적이고 반족적인 코드를 처리하기 위한 방법
AOP와 트랜잭션 처리를 통해서 다음과 같은 기능을 완성 할 수 있음
- 개발자가 원하는 코드를 실행하는데 얼마나 시간이 소모되는지 쉽게 알 수 있다.
- 개발자는 메소드에 전달되는 파라미터나 리턴 값에 대해서 로그를 기록할 수 있다.
- 데이터베이스 상에서 트랜잭션 처리를 설정하여, 성공하는 경우에만 모든 데이터가 완전하게 처리되는 방법 적용할 수 있다.
AOP에서 'Aspect'란
=> '비즈니스 로직은 아니지만, 반드시 해야하는 작업', '반드시 해야 하고 공통된 작업' 정도로 해석할 수 있다.
(개발에선 이런 행위를 '횡단 관심사(cross-concern)'라고 함)
ex) 보안, 성능 모니터링, 로그
그렇다면, 어떻게 기존의 코드를 수정하지 않고 코드의 앞이나 뒤에서 필요한 기능이 동작하도록 작성할 수 있을까?
=> 개발자가 작성한 코드와 컴파일되거나 실행 시에 동작하는 코드가 다르기 때문에 가능
이에 대한 구현 방식은 소위 '프록시(Proxy) 패턴'이라는 방식을 통해서 구현
(그림 출처 : www.java9s.com)
=> 외부에서 특정한 객체(Target)를 호출하면, 실제 객체를 감싸고 있는 바깥쪽 객체(Proxy)를 통해서 호출이 전달. Proxy객체는 AOP의 기능이 적용된 상태에서 호출을 받아 사용되고, 실제 객체와 동일한 타입을 자동으로 생성할 수 있기 때문에 외부에서는 실제 객체와 동일한 타입으로 호출 가능
AOP를 이해하기 위한 필수 AOP 용어 정리
용어 |
설명 |
Aspect |
공통 관심사에 대한 추상적인 명칭(로깅, 보안, 트랜잭션과 같은 기능 자체에 대한 용어) |
Advice |
실제로 기능을 구현한 객체 |
JointPoints |
공통 관심사를 적용할 수 있는 대상. (각 객체의 메소드가 이에 해당) (작성된 Advice가 활약할 수 있는 위치를 의미) |
Pointcuts |
여러 메소드 중 실제 Advice가 적용될 대상 메소드 (여러 Join Points 중에서 Advice를 적용할 대상을 선택하는 정보) |
Target |
대상 메소드를 가지는 객체 |
Proxy |
Advice가 적용되었을 때 만들어지는 객체 |
Introduction |
Target에는 없는 새로운 메소드나 인스턴스 변수를 추가하는 기능 |
Weaving |
Advice와 Target이 결합되어서 프록시 객체를 만드는 과정 |
좀 더 자세한 설명
- Advice : 실제 적용시키고 싶은 코드 자체, 개발자가 만드는 것은 Aspect가 아닌 클래스를 제작하고 @Advice를 적용시키는 것(로그, 파라미터 체크 같은 것을 Aspect라고 부르지만, 실제 구현 시에는 Advice를 작성한다고 표현)
- Target : 실제 비즈니스 로직을 수행하는 객체를 의미. 용어 그대로 Aspect를 적용해야 하는 대상 객체를 의미
- JoinPoints : 작성된 Advice가 활약할 수 있는 위치를 의미(예를 들어 ContractService에 계약서 등록, 수정, 삭제만을 골라서 Advice를 적용할 수 있는데, 이 때 ContractService의 모든 메소드가 JoinPoint가 됨
- Pointcuts : 여러 JoinPoints 중에서 Advice를 적용할 대상을 선택하는 정보. 이를 통해서 특정 메소드는 Advice가 적용된 형태로 동작함
아래 그림을 참고하면 이해가 쉬울 듯 하다.
(그림 출처 : http://seanzhou1023.blogspot.com/2015/10/4-spring-in-action-aspect-oriented.html)
Advice의 종류
Advice는 실제 구현된 클래스이며, 타입은 아래와 같이 분류 됨
타입 |
기능 |
Before Advice |
Target의 메소드 호출 전에 적용 |
After returning |
Target의 메소드 호출 이후에 적용 |
After throwing |
Target의 예외 발생 후 적용 |
After |
Target의 메소드 호출 후 예외의 발생에 관계없이 적용 |
Around |
Target의 메소드 호출 이전과 이후 모두 적용(가장 광범위하게 사용됨) |
참고 서적 :코드로 배우는 스프링 웹 프로젝트
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] IoC(InversionOfControl) 컨테이너 2 (0) | 2018.08.08 |
---|---|
[Spring] IoC(InversionOfControl) 컨테이너 1 (0) | 2018.08.08 |
[Spring] 스프링프레임워크의 특징 (0) | 2018.08.08 |
[Spring] 필터(filter)와 인터셉터(interceptor)의 차이 (0) | 2018.06.29 |
[Spring] 스프링 @(어노테이션) 종류 (0) | 2018.02.26 |