이전
스프링 AOP
부가 기능 적용 문제
- 부가 기능을 적용할 때 아주 많은 반복이 필요하다.
- 부가 기능이 여러 곳에 퍼져서 중복 코드를 만들어낸다.
- 부가 기능을 변경할 때 중복 때문에 많은 수정이 필요하다.
- 부가 기능의 적용 대상을 변경할 때 수많은 수정이 필요하다.
소프트웨어 개발에서 변경 지점은 하나가 될 수 있도록 잘 모듈화 되어야 한다. 그런데 부가 기능처럼 특정 로직을 애플리케이션 전반에 적용하는 문제는 일반적인 OOP 방식으로는 해결이 어렵다.
AOP 의 적용 방식은 크게 3가지 방법이 있다.
- 컴파일 시점
- .java 파일을 컴파일러를 통해 .class를 만드는 시점에 부가기능 로직을 추가하는 방식
- 모든 지점에 적용가능 (클래스, 변수, 메소드)
- AspectJ 가 제공하는 특별한 컴파일러를 사용해야 하기 때문에 특별한 컴파일러가 필요함
- 클래스 로딩 시점
- .class 파일을 JVM 내부의 클래스 로더에 보관하기 전에 조작하여 부가기능 로직을 추가하는 방식
- 모든 지점에 적용가능 (클래스, 변수, 메소드)
- 특별한 옵션과 클래스 로더 조작기를 지정해줘야함
- 런타임 시점
- 스프링이 사용하는 방식
- 컴파일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 방식
- 실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능을 적용
- 프록시는 메서드 오버라이딩 개념으로 동작함 (메소드 한정 적용 가능)
- 스프링 컨테이너가 관리하는 bean에만 적용 가능
스프링 AOP 는 AspectJ 문법을 차용하고 proxy 방식의 aop 제공함