1. IDE
Intellij
2. 오늘 공부 내용
AOP(관점 지향 프로그래밍)
- 횡단 관심사를 분리하여 모듈화하는 프로그래밍 패러다임
- 로깅, 트랜잭션 관리, 보안, 예외 처리와 같은 비지니스 로직과는 독맂겅니 횡단 관심사를 쉽게 처리할 수 있도록 지원
- 비즈니스 로직 외의 로직을 별도로 관리하고 유지보수성을 높이기 위해 효과적으로 사용
AOP 주요 개념
- Aspect(애스펙트):
- 횡단 관심사를 모듈화한 단위입니다. 애스펙트는 보통 특정한 기능(예: 로깅, 보안, 트랜잭션 관리 등)을 가짐
- Spring에서는 애스펙트를 구현하기 위해 @Aspect 애노테이션을 사용
- Join Point(조인 포인트):
- 애플리케이션 실행 중에 애스펙트가 적용될 수 있는 지점입니다. 예를 들어 메서드 호출, 객체 생성 등이 조인 포인트가 될 수 있음
- Advice(어드바이스):
-
애스펙트가 특정 조인 포인트에서 수행하는 동작을 정의한 코드입니다. 어드바이스는 애스펙트가 언제 실행될지를 정의
어드바이스 유형:
-
Before Advice: 조인 포인트 전에 실행됨.
-
After Advice: 조인 포인트가 끝난 후 실행됨.
-
Around Advice: 조인 포인트 전후로 실행됨.
-
After Returning Advice: 정상적으로 메서드가 완료된 후 실행됨.
-
After Throwing Advice: 예외가 발생했을 때 실행됨.
- Pointcut(포인트컷):
- 특정 조인 포인트를 선정하는 기준입니다. 포인트컷을 통해 어디에 어드바이스를 적용할지 설정할 수 있습니다.
- Spring AOP에서 포인트컷 표현식을 사용해 대상 메서드를 정의
- Weaving(위빙):
- 애플리케이션 코드에 애스펙트를 적용하는 과정입니다. 위빙은 컴파일 타임, 로드 타임, 런타임 중에 발생할 수 있으며, Spring AOP는 런타임 위빙을 사용합니다.
동작 원리
- 프록시를 기반으로 동작
- 실체 객체 앞에 프록시 객체를 생성하여 어드바이스가 적용된 로직을 실행
사용 예시
- Aspect 정의
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod() {
System.out.println("메서드 실행 전 로그");
}
@After("execution(* com.example.service.*.*(..))")
public void logAfterMethod() {
System.out.println("메서드 실행 후 로그");
}
}
- 포인트컷 설정
- 위 코드에서 "execution( com.example.service..*(..))"은 포인트컷 표현식으로, com.example.service 패키지에 있는 모든 클래스의 모든 메서드가 AOP의 대상이 됩니다.
- Service 클래스
import org.springframework.stereotype.Service;
@Service
public class ExampleService {
public void exampleMethod() {
System.out.println("실제 비즈니스 로직");
}
}
- 실행 결과
- exampleMethod()가 호출되면 AOP를 통해 먼저 "메서드 실행 전 로그"가 출력되고, 실제 비즈니스 로직이 실행된 후 "메서드 실행 후 로그"가 출력됩니다.
메서드 실행 전 로그
실제 비즈니스 로직
메서드 실행 후 로그
장단점
- 장점
- 중복 코드 제거: 횡단 관심사를 별도의 모듈로 분리함으로써 중복되는 코드를 제거할 수 있습니다.
- 유지보수성 향상: 로깅, 보안 등의 기능이 여러 곳에서 필요할 때, 각각의 로직에 중복 코드를 삽입하는 대신 AOP로 처리하여 유지보수가 쉬워집니다.
- 모듈화: 비즈니스 로직과 독립적인 관심사를 별도의 애스펙트로 모듈화할 수 있습니다.
- 단점
- 복잡성 증가: 지나치게 남용하면 코드의 흐름을 파악하기 어려워지고, 디버깅이 복잡해질 수 있습니다.
- 성능 문제: AOP를 사용하면 프록시 객체를 생성하기 때문에 성능이 저하될 수 있습니다.