[Spring Boot] AOP 적용기
💁♂️ 들어가기 전
오늘은 HttpClient 도구들을 사용해서 외부 API에 요청하는 로직을 설계하고 있었다. 그러다 문득 "FeignClient, RestClient, WebClient들의 실행 시간을 측정해보면 누가 더 좋은지 우수한지 알 수 있지 않을까?"라는 생각이 들어서 직접 구현해보기로 했다. 하지만 이를 구현하기 위해서는 AOP에 대해 알아야 하는데 필자는 이번에 처음 도입해보는거라 개념은 알고 있었는데 구현은 어떻게 하는지 몰랐다. 그래서 오늘은 내가 공부하면서 배운 개념과 AOP를 구현하는 방법을 알려주려고 한다.
🤨 AOP란?
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 부른다. 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지이다.
📘 개념 정리
* Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
* Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
* Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
* JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
* PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
🪵 Aspect 구현
우선 Aspect를 구현하기 전에 아래와 같은 종속성을 추가해줘야 한다.
implementation 'org.springframework.boot:spring-boot-starter-aop'
그 다음 아래와 같이 @Aspect 어노텐션을 사용해서 AOP 적용을 명시해준다.
일단 AOP에도 다양한 방식으로 설정할 수 있는 옵션이 존재한다.
1. @Before
대상 메서드가 실행되기 전에 호출
2. @After
대상 메서드의 성공 여부와 관계없이 메서드가 끝나고 호출
3. @AfterReturning
대상 메서드가 정상 종료후 호출
4. @AfterThrowing
대상 메서드에 예외가 발생할 시 호출
5. @Around (실행 시간 측정)
위에서 말했던 것들 모두 포함 | 전, 후, 예외 다 가능
- 전 처리 : 메서드 실행 전에 무언가를 할 수 있음 (예: 로깅, 권한 체크 등)
- 후 처리 : 메서드 실행 후 결과를 가로채거나 가공 가능
- 예외 처리 : 메서드 안에서 예외 발생 시 잡아서 처리 가능
- 실행 제어 : proceed() 호출 여부로 실제로 실행할지 말지도 제어 가능
🍎 Custom Annotation으로 관리
특정 메서드에만 Aspect를 어노텐션으로 선언하게 하면 편하지 않을까?라는 취지에서 커스텀 어노텐션으로 관리해볼려고 한다. 우선 커스텀으로 아래와 같이 어노텐션을 만들어준다.
그러고 아래 Controller 메서드에 선언해준다. 그럼 이 의미는 앞으로 해당 메서드가 실행되면 Aspect가 동작한다는 소리이다. 이거의 장점은 내가 원하는 메서드에만 Aspect를 적용할 수 있다는 점이다.
✔️ 실행 결과
그럼 우리가 의도한대로 로그가 잘 찍히는 것을 볼 수 있다.ㅎㅎ
(위 사진이 작은 관계로 사진을 직접 클릭해서 봐주시면 감사하겠습니다)
👍 느낀점
저번에는 몰랐던 Spring AOP에 대해서 공부하니까 뭔가 Spring에 한발짝 더 다가간 것 같아서 기분이 묘했고ㅋㅋㅋ 또, 내가 원했던 각 메서드에 실행 시간 측정하는 기능을 구현해서 뿌듯했다. 이제 팀/개인 프로젝트에 들어가면 AOP를 구현할 수 있다는게 좋았다. 😊
이상으로 Spring AOP 구현?에 대한 포스팅을 마치겠습니다. 궁금한 점이나 모르겠는 부분 있으시면 댓글로 남겨주세요! 😊
자세한건 아래 Github 링크 클릭하시면 됩니다~
HttpClientTool-Study/src/main/java/kyungmin/httpclienttoolstudy/aspect at main · kyungmin08g/HttpClientTool-Study
📚 공부 → HttpClient 도구를 사용하여 외부 API 요청 구현 | AOP 적용 공부 레포 - kyungmin08g/HttpClientTool-Study
github.com