[Spring] AOP에 대해 알아보자
- Web/Spring
- 2020. 10. 22.
스프링의 중요한 특징은
1순위 의존성 주입 (DI)
그 다음 순위는 AOP(Aspect Oriented Programming, 관점 지향 프로그램)라는 기능이다.
aop의 예시는 다음과 같다.
도시에서 지하철이나 버스를 타고 이동하면 환승을 하는 경우가 많다. 버스나 지하철을 타고 환승을 할 때는 매번 교통카드를 찍어줘야만 제대로 환승 처리가 된다. 가끔은 버스에서 내릴 때 카드를 접촉하지 않아서 환승 되지 않았던 경험이 종종 발생한다.
당연한 얘기지만, 우리는 어떤 목적지에 가기 위해 버스나 지하철과 같은 대중교통을 이용해서 목적지에 도착한다.
즉, 우리가 ㄱ버스나 지하철을 타는 행위의 가장 중요한 목적은 '어딘가에 초닥하는 것'이다.
그렇다면 환승 할 때마다 교통카드를 찍는 행위는 어떻게 해석해야 할까?
교통카드를 찍는 행위 없이 원래의 목적을 이룰수는 없지만, 교통가드를 찍는 행위 자체가 목적이 아니라는 것은 확실하다.
AOP의 'Aspect'라는 용어는 이런 상황에 어울리는 표현이다.
프로그램 개발에서 의미는 '비즈니스 로직은 아니지만, 반드시 해야 하는 작업' 정도로 해석 할 수 있다.
즉, 반드시 해야 하고 공통된 작업이다.
이런 행위를 횡단 관심사(cross-concern)이라 하고 개발 과정에는 공통이라고 할 수 있는 무언가가 포함되는 것이 일반적이다.
횡단 괌심사는 시스템의 여기저기에서 공통으로 사용되지만, 그 자체가 목적은 아니다. 오히려 시스템의 완성도를 높여주는 역할이다.
스프링의 AOP 지원은 개발의 핵심적인 비즈니스로직을 개발하는 데에만 집중하고, 나머지 부가적인 기능은 설정을 통해서 조정이다.
이제 이 기능이 개발되면, 전달된 파라미터를 로그로 기록하거나, 메소드의 수행 시간 등을 체크하기 위해서 코드를 넣거나 빼는 일은 더 이상 하지 않는다.
AOP와 관련된 용어
외부에서 특정한 객체(target)를 호출하면, 실제 객체를 감싸고 있는 바깥쪽 객체(Proxy)를 통해서 호출이 전달된다. Proxy 객체는 AOP의 기능이 적용된 상태에서 호출을 받아 사용되고, 실제 객체와 동일한 타입을 자동으로 생성할 수 있기 때문에 외부에서는 실제 객체와 동일한 타입으로 호출 할 수 있다.
용어 | 설명 |
Aspect | 공통 관심사에 대한 추상적인 명칭. 예를 들면 로깅이나 보안, 트랜잭션과 같은 기능 자체에 대한 용어 |
Advice | 실제로 기능을 구현한 객체 |
Join points | 공통 관심사를 적용할 수 있는 대상. Spring AOP에서는 각 객체의 메소드가 이에 해당 |
Pointcuts | 여러 메소드 중 실제 Advice가 적용될 대상 메소드 |
target | 대상 메소드를 가지는 객체 |
Proxy | Advice가 적용되었을 때 만들어지는 객체 |
Introduction | target에는 없는 새로운 메소드나 인스턴스 변수를 추가하는 기능 |
Weaving | Advice와 target이 결함되어서 프록시 객체를 만드는 과정 |
Advice의 종류
타입 | 기능 |
Before Advice | target의 메소드 호출 전에 적용 |
After returning | taget의 메소드 호출 이후에 적용 |
After throwing | target의 예외 발생 후 적용 |
After | target의 메소드 호출 후 예외의 발생에 관계없이 적용 |
Around | target의 메소드 호출 이전과 이후 모두 적용(가장 광범위하게 사용) |
여러 종류의 타입 중에서 가장 중요한 타입은 Around 이다.
Around 타입의 Advice는 메소드의 호출 자체를 제어 할 수 있기 때문에 가장 강력하다.
'Web > Spring' 카테고리의 다른 글
[Spring] 선택해서 해당 xml 실행하게 만들기 (0) | 2020.10.22 |
---|---|
[Spring] AOP 사용하기 (0) | 2020.10.22 |
[Spring] xml 가져오기2(줄임 방식) (0) | 2020.10.22 |
[Spring] 외부의 xml 자료를 가져오기 (0) | 2020.10.22 |
[Spring] xml 시작전, 시작후 동작하는 메소드 (0) | 2020.10.21 |