-
[Spring] AOP (Aspect Oriented Programming)JAVA/SPRING 2023. 6. 11. 15:43728x90
1. AOP 란?
자바에서는 다중 상속이 불가능하여 상속을 통한 공통 메소드를 구성에 한계가 있지만 AOP를 통해 핵심 관심 사항(Core Concern)과 공통 관심 사항(Cross-Cutting Concern)을 분리하고 모듈화 할 수 있습니다.
(ex. 주문 API: 핵심 관심사(주문 로직), 공통 관심사(로깅))
AOP의 장점
- 공통 관심사를 핵심 관심사로부터 분리하여 핵심 로직의 변경없이 공통 관심사를 변경 가능
- 공통 로직을 적용할 대상을 선택 가능
주요 개념
- Aspect: 공통적인 관심사를 모듈화
- Target: Aspect가 적용될 대상(메소드, 클래스...)
- Join point: Aspect가 적용될 수 있는 시점
- Advice: Aspect의 기능
- Point cut: Advice를 적용할 메소드의 범위
주요 어노테이션
- @Aspect: 해당 클래스가 Aspect임을 정의
- @Before: Target이 실행되기 전에 Advice 실행
- @After: Target이 실행된 이후에 Advice 실행
- @AfterRunning: Target이 정상적으로 실행되고 반환된 이후에 Advice 실행
- @AfterThrowing: Target에서 예외가 발생했을 때 Advice 실행
- @Around: Target이 실행 전, 후 또는 예외 발생 시 Advice 실행
2. AOP 사용 방법
AOP를 사용하기 위해서 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-aop'
AOP를 활성화하기 위해 어플리케이션 클래스에 어노테이션 추가
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; @EnableAspectJAutoProxy @SpringBootApplication public class ExampleApplication { public static void main(String[] args) { SpringApplication.run(ForderApplication.class, args); } }
로깅 AOP
RestController, Service 어노테이션이 추가된 클래스에서 실행되도록 설정
@Aspect @Component @Slf4j public class LoggingAspect { @After("@within(org.springframework.web.bind.annotation.RestController) || @within(org.springframework.stereotype.Service)") public void logAfter(JoinPoint joinPoint) { log.info("Executed: " + joinPoint.getSignature().getName()); } }
728x90'JAVA > SPRING' 카테고리의 다른 글
[JPA] Optimistic, Pessimistic Lock (0) 2024.08.10 [Spring] IoC(Inversion of Control) (0) 2023.09.03 [Spring] 의존성 주입 (Dependency Injection) (0) 2023.05.29 [Spring] org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: No constructor found in (0) 2020.04.15 [SPRING] SPRING 게시판 (8) - CRUD [게시글 수정] (0) 2020.03.18