TDD 연습 프로젝트 13 - 간단한 AOP

zunzero·2022년 9월 18일
0

스프링, JPA

목록 보기
21/23

aop에 관해선 다른 글에서 설명한 바 있으니 간단하게만 설명하도록 하겠다.
aop는 핵심 관심사가 아닌 공통관심사를 처리해주는 기능이다.

멤버 저장 요청을 보냈다고 생각해보자.
Controller를 거쳐 Service, Repository로 갔다가 역순으로 다시 올라오면서 응답을 보낼 것이다.
이때 각 계층마다 소요되는 시간을 측정하고 싶다거나 로그를 남기고 싶을 때 어떻게 하면 좋을까?

각 클래스에 시간을 측정하는 기능을 작성하거나 로그를 작성하는 코드를 작성해서 할 수도 있다.
하지만 이런 기능은 주로 멤버 저장 요청에만 해당하는 것이 아니라 모든 http 요청에 대해 남겨야할 기능일 것이다.
매우 큰 프로젝트라면 몇십 혹은 몇백개의 클래스마다 해당 코드를 작성해주어야 하는 번거로움이 있다.
또한, 각 클래스는 핵심 로직 뿐만 아니라 시간을 측정하거나 로그를 남기는 등의 부가 기능까지 소화하면서 여러 책임을 지게 된다.
단일 책임원칙에 상당히 위배되는 경우가 되어 코드의 유연성이 떨어지게 될 것이다.

따라서 우리는 aop를 사용해서 이러한 공통 관심사를 처리할 수 있다.
aop에 대한 자세한 내용은 앞서 말했듯 다른 글에 자세하게 나와있으니 생략하도록 하고, 내가 작성한 코드를 바로 살펴보겠다.

시간을 측정하는 어드바이저이다.
joinPoint.proceed()를 통해 실제 객체의 메서드가 호출된다.
프록시 객체는 그 외에 작성된 코드를 실행한다.
현재 클래스의 포인트컷은 controller 패키지의 모든 클래스에 aop가 적용되어 프록시 객체가 스프링 빈으로 등록되게 되어있다.

두 가지 이상의 어드바이저를 적용하고 싶다면 순서를 정해야 한다.
순서가 정해지지 않은 어드바이저의 순서는 보장되지 않기 때문에 아래와 같은 방식으로 어드바이저를 작성할 수 있다.

위와 같이 작성한 클래스를 통해 어드바이저 적용순서를 지정할 수 있다.

멤버 저장 요청 시 흐름은 아래와 같다.

쉽죠?

profile
나만 읽을 수 있는 블로그

0개의 댓글