[Spring] AOP에 대한 이해

DYKO·2022년 10월 22일
0

Spring Framework

목록 보기
4/7
post-thumbnail

💡 OOP 모듈화의 한계

객체지향 프로그래밍은 어플리케이션 설계 시, 응집도를 높이고 결합도를 낮추기 위해 책임과 관심사에 따라 각 클래스가 단일 책임을 갖도록 분리한다. 이때 로깅이나 트랜잭션 등 각 모듈에서 공통으로 사용되는 부가 기능들을 횡단 관심사(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(Aspect-Oriented Programming) 란?

AOP의 개념

AOP는 위에서 설명한 OOP만 사용하여 독립적으로 분리하기 어려운 부가 기능을 모듈화할 수 있는 스프링의 3대 프로그래밍 모델이며, 번역하면 관점 지향 프로그래밍이라고 한다. 여기서 Aspect는 부가 기능 모듈을 뜻하며, Aspect는 핵심 비즈니스 로직을 담고 있지 않지만 어플리케이션에 부가됨으로써 의미를 갖게 된다. 즉, AOP는 핵심 비즈니스 로직과 Aspect를 분리하여 OOP를 보완하는 역할을 한다.

다양한 AOP 적용 방법

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를 제공할 수 있다.

💡 AOP 주요 용어

  • Aspect
    • 횡단 관심사, 부가 기능을 모듈화 한 것
    • 여러 개의 Advice와 여러 개의 Pointcut의 결합체
    • @Aspect 어노테이션이 달린 클래스를 사용하여 구현
  • Target
    • Aspect를 적용하는 곳
    • AOP는 런타임 프록시를 사용하여 구현되기 때문에 Target 객체는 항상 프록시 객체임
  • Advice
    • 실질적인 부가 기능을 구현한 구현체
    • Pointcut에 언제, 무엇을 적용할 지에 대한 것을 담은 메서드
  • JoinPoint
    • Advice가 적용될 위치(Aspect를 적용할 수 있는 위치)를 의미
    • 메서드 진입 지점, 생성자 호출 시점 등 다양한 시점에 적용 가능
  • Pointcut
    • JoinPoint의 상세한 스펙을 정의한 것으로 구체적으로 Advice가 실행될 지점을 지정
    • Aspect 적용 위치 지정자라고도 표현
    • Spring에서는 기본적으로 AspectJ 표현식 언어를 사용
  • Introduction(inter-type)
    • 자료형을 대신해 추가 매소드 및 필드를 선언
    • Spring AOP를 사용 시, 모든 Advice 객체에 새로운 인터페이스 및 구현을 지원


참고 문헌 및 사이트

스프링 입문을 위한 자바 객체지향의 원리와 이해, 김종민, 위키북스
AOP 입문자를 위한 개념 이해하기 - Tecoble
Aspect Oriented Programming with Spring - Spring Framework Docs
Aspect Oriented Programming - Catsbi's DLog

profile
엔지니어가 되는 그 날 까지!

0개의 댓글