[Spring] Spring AOP(Aspect Oriented Programming)Web_Backend/Spring2023. 5. 28. 14:15
Table of Contents
Spring AOP(Aspect Oriented Programming)
Spring AOP란?
📌 Aspect Oriented Programming, 관점 지향 프로그래밍 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점(데이터베이스 연결, 로깅, 파일 입출력)으로 나누어서 보고 그 관점을 기준으로 각각 모듈화 하겠다는 것
AOP 주요 개념
- Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
- Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
- Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
- JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
- PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
스프링 AOP 특징
- 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
- 스프링 빈에만 AOP를 적용 가능
- 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적
Spring AOP의 구현
- 컴파일 시점(not Spring AOP, but AspectJ) : J.java → j.class 컴파일 시점에 aop를 끼워놓음
- 클래스 로드시(not Spring AOP, but AspectJ) : j.class를 컴파일로더가 메모리에 올릴 때 끼워 넣음
- 프록시 패턴 : 타겟 클래스를 부가기능을 제공하는 프록시로 감싸는 방식
- 즉, 일반적으로 Spring AOP는 runtime에서 proxy객체를 생성해 공통기능을 삽입하는 프록시패턴을 기반으로 동작
- 스프링 AOP는 AspectJ를 직접 사용하는 것이 아니라, 문법을 차용하고 프록시방법의 AOP를 사용하는 것
- 타켓클래스의 className을 찍어보면 타겟클래스명$$EnhancerBySpringCGLIB$$코드로 찍히며, 디버깅해보면 target에 원래의 타겟 클래스가 들어가 있음을 알 수 있음
- Spring은 AOP가 등록되어 있는 경우 runtime 시점에서 Bean이 생성되는 시점에, Bean후처리기에 생성된 Bean이 proxy대상인지 확인 → 대상일 경우 bean 객체를 감싸는 프록시 객체를 생성 → 프록시 객체를 원본 객체 DI 되어야 하는 곳이 DI시킴
-
- JDK Dynamic proxy : 대상 객체가 적어도 하나의 인터페이스를 구현할 경우 사용.
- CGLIB : 대상 객체가 인터페이스를 구현하지 않은 경우 사용. 런타임에 바이트코드를 조작해 동적으로 프록시클래스를 생성해 주는 기능을 제공하며, proxy 객체는 상속을 활용해서 구현된 프록시 방법
Spring AOP의 사용
- dependency에 spring-boot-starter-aop추가
- 아래 실행시점을 나타내는 어노테이션을 붙여 해당 클래스가 Aspect를 나타내는 클래스라는 것을 명시하고 @Component를 붙여 Spring Bean으로 등록
- @Around 어노테이션 : 타멧 메서드를 감싸서 특정 Advice를 실행한다는 의미
- @Before (이전) : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
- @After (이후) : 타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행
- @AfterReturning (정상적 반환 이후)타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
- @AfterThrowing (예외 발생 이후) : 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행
- @Around (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행
참고자료
https://docs.spring.io/spring-framework/reference/core/aop.html
'Web_Backend > Spring' 카테고리의 다른 글
Spring boot Gradle 프로젝트는 Build시에 Test를 실행할 까?(Feat.. jacoco CI 적용일지) (0) | 2023.12.26 |
---|---|
[Servlet] Dispatcher Servlet (0) | 2023.05.28 |
[Spring, JPA] JPA Persistence Context (0) | 2023.05.28 |
[JSTL] JSTL(JSP Standard Tag Library)란? (1) | 2022.03.23 |
spring Mysql connector 연결하기 (0) | 2022.03.08 |
@Yanako :: Yana's coding story였는데요, 우당탕탕 개발일지가 맞는것같
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!