어플리케이션 전체를 관통하는 공통 모듈을 효과적으로 만드는 개발 방법
로직을 핵심적인 관점, 부가적인 관점으로 분리하여 모듈화 함
핵심 기능 vs 부가 기능
- 핵심적인 관점: 핵심 비즈니스 로직
- 부가적인 관점: 트랜잭션, 로깅, 파일 입출력, 시간 측정 등
OOP VS AOP
OOP
- 공통된 기능을 재사용하기 위해 상속이나 위임을 사용함
- 반복되는 코드를 줄일 수 있지만 객체 간 의존성이 높아지고, 코드가 핵심 기능과 섞여 있음
AOP
- 공통 기능을 핵심 기능에서 분리하고 Aspect로 모듈화하여 사용함
- 객체 지향 프로그래밍을 보완할 수 있는 개발 방법임
흩어진 공통 기능을 유지 보수하기에 용이
중복되는 코드 제거 가능
코드 재활용 극대화 가능
런타임 시점에 적용되며 프록시 패턴을 사용함
코드 중복, 프록시 클래스 작성의 번거로움, 객체 간 의존성 증가를 해결하는 것이 목적임
시스템이 실행되면 CGLIB에 의하여 프록시 클래스가 생성되며,
[프록시 컨트롤러 - 실제 컨트롤러 - 프록시 서비스 - 실제 서비스 - 프록시 레포지토리 - 실제 레포지토리] 순으로 적용됨
프록시 컨트롤러, 서비스, 레포지토리 객체가 실제 객체 전에 주입됨(DI)
Aspect 실행 시점 지정
- @Before: 호출되기 전
- @AfterReturning: 메서드 정상 반환 후
- @AfterThrowing: 메서드 예외 발생 후
- @After: 예외, 정상에 상관없이 메서드 호출 후
- @Around: 메서드 실행 전후 모두