AOP란?
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍
이라고 불린다. 객체지향을 보완하는 수단으로 흩어진 관점(Aspect)를 모듈화 하여 비즈니스 로직을 해치지 않고 재사용 하는 프로그래밍 기법이다.
Spring AOP란?
Spring AOP는 스프링 프레임워크에서 제공하는 기능 중 하나로 관점 지향 프로그래밍을 지원하는 기술이다. Spring AOP는 로깅, 보안, 트랜잭션관리 등과 같은 공통적인 관심사를 모듈화하여 코드 중복을 줄이고 유지 보수성을 향상하는데 도움을 준다.
핵심 기능의 관점에서 보았을 때, BoardService, UserService, XXXService는 공통된 요소가 없다. 그러나 부가기능 관점에서 바라보면 각각의 Service는 before()와 after()가 공통적으로 사용되는 것을 볼 수 있다.
즉, AOP는 부가적인 측면에서 보았을 때 공통적인 측면(공통관심사)을 추출하자는 것. 이때, 가로(횡단) 영역의 공통된 부분을 잘랐다고 하여 Cross-Cutting이라 부르기도 한다.
코드 밖에서 설정 된다는 것이 핵심이며, AOP를 통해 핵짐 로직에만 집중해 코드를 작성할 수 있도록 해주어 코드의 재사용성과 유지 보수성을 높일 수 있다.
사용 예시
- 간단한 메소드 성능 검사 : DB에 다량의 데이터를 넣고 빼는 등 배치 작업에 대한 시간 측정
- Transaction 처리 : 매 try-catch 문의 코드는 번거롭고 소스를 복잡하게 함
- 구조가 좋지 않은 예외 발생시 잘 정의되어 있는 예외 계층 구조로 변환하고 싶은 경우
- 아키텍처 검증
- 로깅, 보안 등
관련 용어
용어 | 설명 |
Aspect | 흩어진 관심사를 모듈화 한 것. 부가기능 모듈. Advice + PointCut으로 이주어져 있다. 하나의 조인포인트에 여러 개의 advice 적용 가능 |
Target | Aspect(부가기능)를 적용하는 곳. 클래스, 메서드 등 핵심 기능을 담당 |
Advice | 실질적으로 부가 기능을 담은 구현체. Target에 종속되지 않음으로 순수하게 부가기능에만 집중 가능 |
JoinPoint | Aspect가 적용될 시점을 의미함. (ex:메서드 실행 전, 후 등) |
Point cut | Advice를 적용할 메서드의 범위를 지정하는 것 |
주요 어노테이션
메서드 | 설명 |
@Aspect | 해당 클래스를 Aspect로 사용하겠다는 것을 명시 |
@Before | 대상 메서드가 실행되기 전에 Advice를 실행 |
@AfterReturning | 대상 메서드가 정상적으로 실행되고 반환된 후에 Advice 실행 |
@AfterThrowing | 대상 메서드에서 예외가 발생했을 때 Advice를 실행 |
@After | 대상 메서드가 실행된 후에 Advice 실행 |
@Around | 대상 메서드 실행 전, 후 또는 예외 발생시 Advice 실행 |
AOP를 구현하는 방법에는 여러가지가 있고, 그만큼 다양한 AOP 라이브러리와 도구들이 존재한다.대부분 바이트 코드 Weaving을 사용하여 구현하며 대부분 AspectJ와 Spring AOP 2가지 도구를 활용하여 AOP를 구현한다.
Weaving이란?
모듈화한 부가 기능을 타겟에 적용해 핵심 기능과 연결하는 과정을 의미한다. RTW, CTW, LTW, PCW가 존재한다.
Runtime Weaving(RTW)
프록시 패턴을 활용한 위빙 방식으로, 프록시 객체를 생성해 실제 타깃 오브젝트의 변형없이 런타임 중 메서드 호출이 일어나는 시점에 위빙을 수행한다.
Compile Time Weaving(CTW)
특수한 컴파일러를 활용해 컴파일 과정에서 바이트 코드 조작을 통해 Advisor 코드를 직접 삽입하여 위빙을 수행한다.
Load Time Weaving(LTW)
java 파일을 컴파일한 결과물 자바 클래스가 JVM에 로드될 때 바이트 코드 조작을 통해 위빙되는 방식이다.
Post-Compile Weaving(PCW)
컴파일 후에 생성된 class 파일을 바이트 코드 조작을 통해 위빙하는 방식이다.
성능
CTW >> LTW >> RTW 순.
Spring AOP는 어떤 Weaving을 사용할까?
Spring AOP는 런타임 위빙(다이나믹 프록시)를 사용한다.
자바의 리플렉션 API와 CGlib등의 도구로 동적인 프록시 객체를 만들어 복잡한 설정 없이 Spring Bean 등록 시 자동으로 등록되어 사용하기 매우 편하다. 그러나 런타임에 바이트 코드를 존재하므로 오버헤드가 심하고 성능에 영향을 크게 미칠 수 있다.
정리
AOP는 소스코드에서 반복적으로 사용하는 코드를 하나로 묶어서 모듈화 하여 재사용성과 유지 보수성을 높일 수 있는 강점을 가지고 있다.
Spring AOP는 모든 AOP 기능을 제공하는 것이 아닌 중복 코드, 프록시 클래스 작성의 번거로움 등 흔한 문제를 해결하기 위한 솔루션을 제공하는 것이 목적이며 순수 자바로 구현되어 특별한 컴파일 과정이 필요하지 않다.
Spring AOP는 RTW를 사용하며 Spring Bean 등록시 자동으로 등록되어 사용하기 편하다. 다르게 말해, Spring Bean에만 등록할 수 있다.
https://velog.io/@suhongkim98/AOP
https://jiwondev.tistory.com/152
https://adjh54.tistory.com/133
https://code-lab1.tistory.com/193
'Backend > Spring' 카테고리의 다른 글
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #6 스프링 DB 접근 기술 (0) | 2024.06.16 |
---|---|
[Spring] Spring MVC란? Spring MVC에서 HTTP요청이 들어왔을 때의 흐름은? (0) | 2024.01.04 |
[Spring] 리플렉션(Reflaction)이란? 생성자 주입은 빈 생성때의 리플렉션 외에 추가적인 리플렉션을 진행하는가? (0) | 2024.01.02 |
[Spring] 의존성 주입(Dependency Injection) 4가지 방법 (0) | 2023.12.29 |
Configuration은 어떻게 Bean을 등록하고 관리할까? (0) | 2023.12.28 |