본문 바로가기
  • 주니어 개발자의
    RESTful 성장기
Web/Spring

AOP 시리즈 1편 - AOP가 뭔데?

by 돌건 2021. 3. 31.

Spring을 배우고 사용하는 개발자들은 모두 Spring의 특징 중 하나로 AOP가 꼽히는 것을 알 수 있다. 하지만 도대체 AOP가 무엇인지 정확하게 알지 못하는 경우가 태반이다. 그래서 오늘은 AOP를 파헤쳐보는 시간을 가져보도록 하겠다!

 

AOP (Aspect Oriented Programming)

문제를 바라보는 관점을 기준으로 프로그래밍하는 기법을 말한다. 문제를 해결하기 위한 핵심 비즈니스 로직과 전체적으로 적용이 되어야 하는 공통 로직을 기준으로 프로그래밍해 공통으로 사용되는 모듈을 여러 코드에 적용할 수 있도록 해준다!

 

공통 기능 코드

public void CoreLogic() {
    // 핵심 비즈니스 로직
}

공통 기능 코드

위처럼 핵심 비즈니스 로직을 구현한 코드에서는 공통 기능을 하는 코드를 직접적으로 호출하지 않는다. 여기에 AOP를 적용하게 되면 다음과 같이 변경된다.

public void CoreLogic() {
        공통 기능 코드
   
    // 핵심 비즈니스 로직

        공통 기능 코드
}

AOP가 적용되면 핵심 비즈니스 로직을 구현한 코드컴파일하거나, 컴파일된 클래스를 로딩하거나, 로딩한 클래스의 객체를 생성할 때 핵심 비즈니스 로직 안에 공통 기능 코드가 삽입된다!

 

AOP 용어

용어 설명
Joinpoint Advice를 적용할 수 있는 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 이에 해당한다.
Pointcut 실제로 Advice가 적용되는 Joinpoint를 말한다.
Advice 공통 기능을 언제 핵심 로직에 적용할 지를 정의한다. 메소드 호출 전, 후 등
Weaving Advice를 핵심 로직 코드에 적용하는 것(공통 기능 코드를 핵심 로직 코드에 삽입하는 것)을 말한다. 
Aspect 여러 객체에 공통으로 적용되는 기능을 말한다. 대표적으로 트랜잭션과 보안이 해당된다.

 

Weaving의 3가지 방식

1. 컴파일 시

이 방식은 AspectJ에서 사용하는 방식으로, 핵심 로직을 구현한 자바 소스 코드를 컴파일할 때 공통 기능 코드를 적절한 위치에 삽입하여 AOP가 적용된 클래스 파일을 생성하는 방식이다. 

2. 클래스 로딩 시

AOP 라이브러리는 JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 agent를 제공한다. 이 agent가 로딩한 클래스의 바이너리 정보를 변경해 적절한 위치에 공통 기능 코드를 삽입한 새로운 바이너리 코드를 사용하게 하는 방식이다. 이에 따라 원본 클래스 파일은 보존되고 클래스를 로딩하는 시점에 JVM이 변경된 바이너리 코드를 사용하게 한다.

3. 런타임 시

위 2가지 방식과는 다르게 소스 코드나 클래스 정보를 변경하지 않고 프록시를 이용하는 방식이다. 즉, 핵심 로직을 구현한 객체에 직접적으로 접근하지 않고, 프록시를 통해서 간접적으로 객체에 접근한다. 프록시는 핵심 로직을 실행하기 전과 후에 공통 기능을 적용한다. 여기서 주의할 점은, 프록시를 사용하는 방법에서는 메서드가 호출될 때에만 Advice를 적용할 수가 있다. 필드 값이 변경될 때에는 적용이 안됨.

 

 

 

참고 서적: 웹 개발자를 위한 Spring 4.0 프로그래밍 (저자 최범균, 가메출판사)

'Web > Spring' 카테고리의 다른 글

[Spring 설정] DispatcherServlet  (0) 2021.05.09
시작 페이지 설정하기!  (0) 2021.04.28
Spring MVC의 동작 원리  (0) 2021.04.19
@Annotation을 이용한 의존성 주입!  (0) 2021.03.25
Web programming에 봄이 왔다! Spring이란?  (1) 2021.03.23

댓글