반응형
AOP란?
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 소프트웨어 개발 패러다임 중 하나로, 프로그램의 핵심 기능에 직접 관련되지 않은 부가적인 관심사(관점, Aspect)를 분리하여 모듈화하는 기법입니다. AOP는 주로 로깅, 보안, 트랜잭션 관리 등과 같은 공통 기능을 여러 모듈에 중복 없이 일관되게 적용할 수 있도록 합니다.
주요 개념
- Aspect (관점): 핵심 비즈니스 로직과는 분리되어 모듈화된 부가적인 기능을 의미합니다. 예를 들어, 로깅, 보안, 트랜잭션 관리 등이 있습니다.
- Join Point (조인 포인트): Aspect가 적용될 수 있는 실행 지점을 의미합니다. 메서드 호출, 객체 생성, 예외 발생 등이 조인 포인트가 될 수 있습니다.
- Advice (어드바이스): 특정 Join Point에서 실행될 코드로, Aspect의 실제 구현 부분입니다. Advice는 주로 Before, After, Around로 나뉩니다.
- Before Advice: 조인 포인트 전에 실행됩니다.
- After Advice: 조인 포인트 후에 실행됩니다.
- Around Advice: 조인 포인트 전후에 모두 실행되며, 조인 포인트의 실행을 제어할 수 있습니다.
- Pointcut (포인트컷): 특정 Join Point를 선정하는 표현식입니다. 어떤 조인 포인트에서 어드바이스를 실행할지 정의합니다.
- Weaving (위빙): Aspect와 핵심 비즈니스 로직을 결합하는 과정입니다. 위빙은 컴파일 시, 로드 시, 런타임 시에 수행될 수 있습니다.
AOP의 장점
- 관심사의 분리: 로깅, 보안 등과 같은 부가 기능을 핵심 비즈니스 로직과 분리하여 모듈화할 수 있습니다.
- 코드 중복 제거: 여러 모듈에서 반복적으로 사용되는 부가 기능을 하나의 Aspect로 모듈화하여 코드 중복을 줄일 수 있습니다.
- 유지보수성 향상: 부가 기능을 중앙에서 관리하므로, 변경 사항을 쉽게 적용할 수 있습니다.
AOP 사용 예시 (Spring AOP)
Spring Framework는 AOP를 지원하며, 주로 XML 설정 파일이나 어노테이션을 사용하여 AOP를 적용합니다.
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;
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore() {
System.out.println("Before method execution");
}
@After("execution(* com.example.service.*.*(..))")
public void logAfter() {
System.out.println("After method execution");
}
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Before method execution");
Object result = joinPoint.proceed();
System.out.println("After method execution");
return result;
}
}
이 예시는 com.example.service 패키지 내의 모든 메서드에 대해 Before, After, Around 어드바이스를 적용하는 Aspect를 정의합니다.
AOP를 사용하면, 부가 기능을 쉽게 재사용하고, 핵심 비즈니스 로직의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.
반응형
'Programming > Java, Kotlin' 카테고리의 다른 글
[Java] Immutability(불변성)이란? Immutability 특징, 사용 예시, 장점 (0) | 2024.06.22 |
---|---|
[Java] hashCode, equals 메소드 정의, 차이 (0) | 2024.06.22 |
[Java] URI, URL 차이 (0) | 2024.06.22 |
[Java] Spring Boot 특정 url 로 리다이렉션 하기 (0) | 2024.06.15 |
[Java] length, length(), size() 차이 (0) | 2024.05.24 |