본문 바로가기

Web Sever 개발과 CS 기초/스프링

Spring Proxy가 아닌 방법으로 AOP 구현 방법

먼저 AOP란 무엇인가

서비스에는 핵심 기능과 부가 기능이 존재한다.

회원 가입 로직이라면 DB에 새로운 회원 정보를 등록하는 것이 핵심 기능이고,

트랜잭션을 관리하고, 로그를 찍는 것은 부가 기능이다.

이러한 부가 기능은 다른 곳에서도 반복 사용되기 때문에, 따로 분리하여 관리하는 것이 유리하다.

AOP는 핵심 기능과 부가 기능을 분리하는 역할을 한다.

AOP은 Aspect Oriented Programing의 약자이고, Aspect를 사용한 프로그래밍이라는 의미다.

Aspect는 부가 기능의 역할은 무엇이고, 핵심 기능 중 어디에 적용할 지 정한다. 스프링이 제공하는 @Aspect가 Aspect중 하나이다.

Proxy가 아닌 방법으로 AOP 구현 방법

1. AspectJ 컴파일러

.java 소스 코드를 AspectJ컴파일러를 통해서 .class를 만드는 시점에 부가 기능을 추가할 수 있다.

프록시는 Static, 생성자에는 부가 기능을 추가할 수 없지만, 컴파일 방식은 가능하다.

다만 설정과 적용이 복잡한 단점이 있다.

다른 이름으로 위빙 방식이라고 한다. 롬복도 위빙을 사용한 것이다. 자바에서 많이 쓰는 방식이다.

2. Java Instrumentaion

.class 파일을 JVM에 올릴 때(클래스 로딩 시점) 코드를 조작하여 부가 기능을 추가할 수 있다.

AspectJ를 사용한다.

3. 런타임 시점, 프록시 방식

스프링 프록시 방식은 런타임시점(컴파일이 끝나고 클래스도 다 올라간 후 메인 메소드가 실행된 다음)에 작동된다.

그 이후에 스프링 컨테이너, DI, 빈 포스트 프로세서 기능을 사용하여, 스프링 빈에 부가 기능을 추가한다.

스프링 프록시 방식은 적용이 간단하지만, 조인 포인트는 메서드 실행만 가능하다.