AOP에 대해
by 달쿨AOP란 Aspect-Oriented Programming 의 약어로 관점 지향 프로그래밍이라고 한다.
왜 관점 지향인가?
관심사라고 생각할 수도 있다. 예를 들어 로그를 기록하는 기능은 여러 핵심 기능들과 함께 사용되는데 이를 모듈화하지 않을 경우, 같은 코드가 여러 곳에 흩어지게 되기 때문에 유지보수가 매우 힘들다. 이렇게 핵심 로직에서 공통으로 사용되는 부가 기능(횡단 관심사)을 하나의 관점(Aspect)으로 모듈화 해 유지보수성을 높이는 것이 AOP의 핵심이라고 할 수 있다.
이게 어떻게 되는거지?
AOP는 프록시를 기반으로 동작한다. 즉 진짜 객체 말고 프록시(대리) 객체를 만들어 동작한다.
프록시 객체는 실제 객체가 실행되기 전에 그 호출을 가로채 실행한다. 그래서 실제 객체가 실행되는 것이 아니라 프록시 객체가 실행된다. 프록시 객체가 실제 객체를 감싸 실행된다고 생각할 수 있다.
AOP 프록시는 언제 생성되는 걸까
Spring에서 Bean을 생성할 때 AOP 적용 대상인지 검사하고 프록시를 만든다.
이 때 동적 AOP 방식이기 때문에 런타임 시에 위빙 프로세스가 수행되며 적용 대상인 (@Aspect) 모든 객체의 프록시를 생성해 필요에 따라 호출한다. (반대로 정적 AOP는 빌드 프로세스에서 위빙이 이루어져 컴파일 시에 코드가 삽입된다. AspectJ가 해당 유형이다.)
이 때 JDK Dynamic Proxy, CGLIB Proxy 두가지 생성 방식이 있다.
JDK Dynamic Proxy는 인터페이스 기반의 프록시를 생성한다. 그래서 타겟 객체가 구현하고 있는 인터페이스를 똑같이 구현한다. 때문에 타겟이 인터페이스를 구현하고 있다면 JDK Dynamic Proxy가 적용된다.
CGLIB Proxy는 JDK Dynamic Proxy와 다르게 클래스 기반의 프록시로 상속을 이용해 생성한다. 즉 타겟 클래스의 하위 클래스로 생성되는데 때문에 final 등의 상속을 지원하지 않는 경우엔 Aspect가 적용되지 않는다.
CGLIB Proxy가 JDK Dynamic Proxy보다 성능상의 이점을 가지기 때문에 Spring Boot 에서는 CGLIB Proxy을 기본적으로 사용한다고 한다.
'공부' 카테고리의 다른 글
| GC에 대해 (0) | 2026.03.29 |
|---|---|
| JVM에 대해 (0) | 2026.03.29 |
| 역색인(Inverted Index) 구조 (0) | 2025.04.24 |
| RabbitMQ 개념 (3) | 2025.01.14 |
| Grafana 개념과 주요 특징 (3) | 2024.12.23 |
블로그의 정보
note
달쿨