객체지향 프로그래밍은 어플리케이션 설계 시, 응집도를 높이고 결합도를 낮추기 위해 책임과 관심사에 따라 각 클래스가 단일 책임을 갖도록 분리한다. 이때 로깅이나 트랜잭션 등 각 모듈에서 공통으로 사용되는 부가 기능들을 횡단 관심사(cross-cutting concern)라고 한다. 예로 아래와 같이 DB 연동 프로그램을 작성하게 되면 아래와 같은 형태의 코드가 반복되는 것을 볼 수 있다.
// cross-cutting concern example code
public void insertData(Data data) {
// DB Conenction 연결 및 transaction 생성
DBConnection dbConn = new DBConnection();
TransactionStatus transaction = new TransactionStatus();
try {
// DB 및 transaction 작업 실행
dbConn.insert(data);
transaction.commit();
} catch (Exception ex) {
// 예외 처리
transaction.rollback();
throw ex;
} finally {
// 자원 반납
dbConn.close();
transaction.close();
}
}
즉, 코드 = 핵심 관심사 + 횡단 관심사
이며, 핵심 관심사는 모듈마다 다르지만 횡단 관심사는 각 클래스에 중복하여 작성되어 어플리케이션 전반에 걸쳐 흩어져 존재하게 된다. 프록시 클래스를 생성하고 데코레이터 패턴을 통해 핵심 비즈니스 로직과 부가 기능 관심사를 분리할 수도 있지만, 이 역시 부가 기능 관심사를 사용하는 클래스마다 부가 기능 관심사가 구현된 클래스를 생성하고 인터페이스 메서드를 일일이 구현해야하는 등 한계점이 있다. 이처럼 전통적인 OOP 방식만을 사용하게 되면, 부가 기능 로직을 한 곳에서 관리하기가 어려워 횡단 관심사 기능의 변경이 발생 시 전 어플리케이션에 걸쳐 수정이 필요하는 등 유지보수 측면에서 아쉬운 점이 많아지게 된다.
AOP는 위에서 설명한 OOP만 사용하여 독립적으로 분리하기 어려운 부가 기능을 모듈화할 수 있는 스프링의 3대 프로그래밍 모델이며, 번역하면 관점 지향 프로그래밍이라고 한다. 여기서 Aspect는 부가 기능 모듈을 뜻하며, Aspect는 핵심 비즈니스 로직을 담고 있지 않지만 어플리케이션에 부가됨으로써 의미를 갖게 된다. 즉, AOP는 핵심 비즈니스 로직과 Aspect를 분리하여 OOP를 보완하는 역할을 한다.
1. 컴파일
컴파일러를 통해 java 파일을 class파일로 컴파일하는 시점에 부가 기능 로직을 추가하는 방식
2. 바이트코드 조작
AspectJ에서 사용하는 방식으로 타깃 오브젝트를 뜯어 고쳐 부가 기능을 직접 넣어주는 직접적인 방법으로, 컴파일된 Target의 클래스 파일 자체를 수정하거나 클래스가 JVM에 로딩되는 시점에 바이트코드를 조작하는 방법을 사용한다. 실제 .java
파일과 .class
파일을 비교하면 내용이 다른걸 확인할 수 있다.
해당 방법은 스프링과 같은 DI 컨테이너가 없어도 AOP를 적용할 수 있으며, Aspect 적용 대상이 메서드 뿐만 아니라 객체 생성, 필드 값 조회 및 조작 등 다양한 작업에도 적용할 수 있기 때문에 프록시 패턴을 이용한 것 보다 강력하고 유연한 AOP를 제공할 수 있다.
3. 프록시 패턴
Spring에서 사용하는 방식으로 Aspect를 프록시로 생성하여 DI로 연결된 Bean 사이에 족용하여 Target의 메서드 호출 과정에 참여해 부가 기능을 제공해주는 방식이다. JDK와 Spring Container 외에 특별한 기술 및 환경을 요구하지 않으며, AOP 적용 대상은 클라이언트의 메서드로 제한된다. Advice
가 구현하는 MethodInterceptor
인터페이스는 프록시로부터 메소드 요청 정보를 전달받아 타겟 객체의 메서드를 호출하는데, 메서드를 호출하는 전/후로 Aspect를 제공할 수 있다.
@Aspect
어노테이션이 달린 클래스를 사용하여 구현AspectJ
표현식 언어를 사용스프링 입문을 위한 자바 객체지향의 원리와 이해, 김종민, 위키북스
AOP 입문자를 위한 개념 이해하기 - Tecoble
Aspect Oriented Programming with Spring - Spring Framework Docs
Aspect Oriented Programming - Catsbi's DLog