스프링 공부 일지 - AOP?
이전 블로그 👉👉 2022.11.01 - [스터디/스프링] - 스프링 공부 일지 - DB를 사용해 보자!!
스프링 공부 일지 - DB를 사용해보자!!
오늘은 DB 접근 기술을 알아보고자 한다!!! 이전 블로그 👉👉 2022.11.01 - [스터디/스프링] - 스프링 공부 일지 - 웹 MVC 개발 스프링 공부 일지 - 웹 MVC 개발 오늘은 웹 MVC 개발을 해보려고 한다!! 이
sleecode.tistory.com
이번에는 AOP에 대해 적어보려고 한다
AOP는 Aspect Oriented Programming으로 관점 지향 프로그래밍을 의미한다
공통 관심 사항(cross-cutting concern)과 핵심 관심 사항(core concern)을 분리하여
그 관점을 기준으로 각각을 Aspect라는 독특한 모듈로 만들어서 설계하고 개발하는 방법을 의미한다!!
(쉽게 생각하면 그냥 분리해서 사용한다는 의미)
(참고로 공통 관심 사항을 cross-cutting이라고 말하는 것은 가로(or 세로) 영역의 공통된 부분을 잘라냈다고 해서!)
예를 들어 시간 측정 로직이 있다!
각 메서드별로 로직을 처리하는 데 걸리는 시간을 측정한다고 하자!
그랬을 때 모든 메서드에 직접 시간을 측정하는 코드를 추가하기에는
핵심 로직을 방해하기 좋다! 👈 유지보수하기 어렵다는 뜻!
그러므로 핵심 로직과 공통 로직을 분리해서 사용한다면
즉, AOP를 사용한다면 재사용성을 높일 수 있고 유지보수에 용이해진다!!
참고로 AOP는 OOP의 대체 용어가 아니다!
AOP는 OOP를 돕는 보조적인 기술로 생각하는 것이 좋다
그렇다면 공통 관심 사항을 분리하는 AOP는 어떻게 사용하는 것일까?
AOP를 적용하는 방식은 다양하게 있다고 한다
그중 오늘 소개할 것은 스프링에서 사용하는 AOP다!!
Spring AOP는 Aspect를 사용해서 부가 기능들을 모듈화 시킨다
기본적으로 프락시 기반의 AOP 구현체를 사용하고 스프링 빈에서만 적용할 수 있다!
프록시 방식의 AOP가 가능한 것은 스프링 컨테이너에서 DI 과정을 거치면서 자동으로 연결해 주기 때문이다!!
(👉 스프링 AOP는 런타임 시점에서 적용되는 방식, 프락시는 메서드 오버라이딩 개념으로 동작!)
본격적으로 AOP를 적용하는 과정에 대해서 말하기 전에,
기본적인 주요 용어에 대해 설명하겠다!!
용어 | 설명 |
Aspect | Adivice + PointCut : - AOP의 기본 모듈(공통 기능을 모듈화) - 싱글톤 형태의 객체로 존재함 |
Join point | Advice가 적용될 수 있는 시점 (스프링에서는 메서드 실행 시점) 애플리케이션 실행 흐름의 특정 포인트 |
Advice | Aspect의 기능을 정의한 것 - 실질적인 부가기능을 담은 구현체 - Joint Point에서 실행되는 코드 |
Target | Aspect가 적용될 대상 (Advice의 대상이 되는 객체) - 메소드, 클래스 등이 해당 |
Point cut | JointPoint 중 Advice를 적용할 메소드의 범위를 지정 - 주로 AspectJ 표현식으로 지정 |
Advisor | 스프링 AOP에서만 쓰는 용어 하나의 Adivice + 하나의 PointCut 를 특별하게 지칭하는 말 |
그렇다면 진짜 스프링에서 AOP는 어떻게 동작하는 것일까?!!
먼저, @Aspect 어노테이션을 붙이면
스프링 IoC에서 AOP를 사용하는 것으로 인지한다
그렇기 때문에 @Aspect가 붙은 클래스는 자동 프록시 생성기를 통해
어드바이저로 변환해서 @Aspect Advisor 빌더 내부에 저장된다
그럼 생성된 Advisor는 언제 쓰이냐?!!!
- 스프링 빈을 등록하기 전에 빈 후처리기를 통해 Advisor 빈을 조회한다!!
- @Aspect Advisor 빌더 내부에 저장된 모든 Advisor를 조회하고
- Advisor에 포함된 point cut을 통해 프락시 적용 대상인지 확인한다
- 만약 포인트 컷을 만족한다면 프락시 생성 -> 프록시를 빈 저장소에 반환한다
- 만약 프록시 생성 대상이 아니라면 -> 빈 그대로 빈 저장소에 반환한다
- 빈 저장소는 객체를 받아서 빈으로 등록!!
기존에 스프링 IoC에서 스프링 빈을 등록하는 과정에서
Aspect 대상이 되는 빈을 조회하는 로직이 추가되어서 진행된다고 생각하면 된다!!
그럼 이제 어떻게 AOP를 사용하는지 간단한 예시 코드로 살펴보자!!!
@Aspect는 Advisor를 쉽게 만들어주는 어노테이션이므로
스프링 빈에 등록하기 위해서는 따로 등록을 해줘야 한다!!
아래 예시처럼 @Component를 사용하는 방법도 있지만
개발자에게 명시적으로 알려주기 위해서는 AppConfig 파일에서 관리하는 것이 좋다!!
내부 코드를 살펴보자!
- @Around는 Advice가 실행되는 시점을 지정할 수 있다
- Point Cut을 명시하는 곳
- 보통 패키지별로 실행한다
- Advice가 제공하는 5가지 어노테이션 중에 예외적으로
ProceedingJointPoint를 사용한다
- ProceedingJointPoint를 통해 메서드 단위로 진행할 수 있다!
- jointPoint가 메서드 실행 시점을 의미한다!
- jointPoint.proceed()는 다음 메서드(advice 혹은 target)로 진행된다
이렇게 실행된 코드는 @Around로 지정한 지점 내로 메서드별 실행 결과를 볼 수 있다!
오늘은 간단한 예시와 함께 AOP에 대해 알아봤다!
좀 더 자세한 내용을 보고 싶다면 아래 링크를 추천한다!!
토비의 스프링 3.1. 에 적힌 내용과 비슷한 부분이 많고 깊게 파고든 블로그다!!
아마 김영한 님의 스프링 핵심원리의 고급편도 비슷한 내용을 가지고 있는 듯하다
스프링이 제공하는 빈 후처리기
다음을 꼭 추가해줘야 한다.이 라이브러리를 추가하면 aspectjweaver라는 aspectJ 관련 라이브러리를 등록하고, 스프링 부트가 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다.스프링 부트가 없던
velog.io
https://velog.io/@backtony/Spring-AOP-%EC%B4%9D%EC%A0%95%EB%A6%AC#6-aop-%EC%9E%AC%EC%8B%9C%EB%8F%84
Spring - AOP 총정리
Spring의 핵심 개념 중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춘다면, AOP(Aspect-Oriented Programming)는 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을
velog.io
그럼 안녕!!!!!!!!!!!!!🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌