-
[Spring, Spring Boot] 관점 지향 프로그래밍 AOP (Aspect-Oriented Programming)Spring 2024. 11. 28. 14:17
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 애플리케이션의 횡단 관심사(Cross-Cutting Concerns)를 모듈화하기 위한 프로그래밍 패러다임입니다. 횡단 관심사란 로깅, 트랜잭션 관리, 보안, 예외 처리 등 여러 모듈에서 반복적으로 사용되는 로직을 의미합니다. AOP는 이러한 공통 기능을 코드의 핵심 비즈니스 로직과 분리하여 코드의 가독성과 유지보수성을 높이기 위해 사용됩니다.
스프링 프레임워크는 AOP를 간편하게 사용할 수 있도록 지원하며, 이를 통해 애플리케이션의 코드 중복을 줄이고 핵심 로직에 집중할 수 있습니다.
AOP의 주요 개념
AOP를 이해하려면 몇 가지 핵심 개념을 이해해야 합니다:
- Aspect: 횡단 관심사를 모듈화한 것을 Aspect라고 합니다. 보통 하나의 기능, 예를 들어 로깅이나 보안 처리가 하나의 Aspect가 됩니다.
- Join Point: 애플리케이션에서 AOP가 적용될 수 있는 위치를 의미합니다. 예를 들어 메서드 호출, 예외 처리 등이 Join Point가 됩니다.
- Advice: Aspect가 수행할 작업을 정의합니다. Advice는 언제 실행되느냐에 따라 다양한 유형으로 나뉩니다 (Before, After, Around 등).
- Pointcut: Join Point를 특정하기 위해 사용하는 표현식입니다. 즉, 어떤 Join Point에 Advice를 적용할지 결정하는 필터링 기능을 수행합니다.
- Weaving: Aspect를 실제로 코드에 적용하는 과정을 의미합니다.
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { // 메서드 실행 전에 로그 출력 @Before("execution(* com.example.service.*.*(..))") public void logBefore() { System.out.println("메서드 실행 전 로그 출력"); } // 메서드 실행 후에 로그 출력 @After("execution(* com.example.service.*.*(..))") public void logAfter() { System.out.println("메서드 실행 후 로그 출력"); } // 메서드 실행 전후를 둘러싸며 실행하는 로그 @Around("execution(* com.example.service.*.*(..))") public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("메서드 실행 전"); Object result = joinPoint.proceed(); // 실제 대상 메서드 호출 System.out.println("메서드 실행 후"); return result; } }
코드 설명
- @Aspect: 이 클래스가 Aspect임을 나타냅니다.
- @Before, @After: 대상 메서드 실행 전후에 Advice를 적용하기 위해 사용됩니다. execution(* com.example.service.*.*(..))는 com.example.service 패키지의 모든 메서드를 대상으로 합니다.
- @Around: 메서드 실행 전과 후를 둘러싸며 동작하는 Advice입니다. ProceedingJoinPoint는 실제 메서드를 실행하기 위해 사용됩니다.
위 코드는 com.example.service 패키지 내 모든 메서드 호출 전후에 로깅을 수행하도록 설정된 Aspect입니다. 이를 통해 서비스 계층의 모든 메서드에 대해 중복되는 로깅 코드를 일일이 작성하지 않고도 손쉽게 로깅을 적용할 수 있습니다.
결론
AOP는 횡단 관심사를 핵심 비즈니스 로직과 분리함으로써 코드의 모듈화를 높이고, 유지보수성을 향상시킵니다. 로깅, 보안, 트랜잭션 관리 등과 같은 공통 관심사를 별도의 Aspect로 관리함으로써 코드를 더 읽기 쉽게 만들고, 핵심 로직이 보다 명확하게 드러나도록 합니다. 스프링에서 AOP는 @Aspect와 같은 어노테이션을 사용해 간편하게 적용할 수 있으며, 이를 통해 애플리케이션의 구조를 깔끔하고 효율적으로 유지할 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring, Spring Boot] 비동기 처리 TaskExecutor (0) 2024.11.28 [Spring, Spring Boot] 비동기 처리 Asynchronous Processing (0) 2024.11.28 [Spring, Spring Boot] 의존성 주입 (Dependency Injection, DI) (0) 2024.11.28 [Spring, Spring Boot] JAVA ORM (Object Relational Mapping) 객체 관계 매핑 (0) 2024.11.26 [Spring Boot] Lombok 롬복 설치 (Eclipse STS) (0) 2022.05.26