7. AOP 프로그래밍 #2-1 AOP
2021. 7. 27. 16:15ㆍJAVA/Spring
본 글은 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 도서의 내용을 복습하기 위해서 작성된 글입니다.
7.2.1 AOP
AOP는 Aspect Oriented Programming의 약자로, 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법이다. AOP는 핵심 기능과 공통 기능의 구현을 분리함으로써 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용할 수 있게 만들어준다.
AOP의 기본 개념
핵심 기능에 공통 기능을 삽입하는 것이다. 즉 핵심 기능의 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것이 AOP이다.
핵심 기능에 공통 기능을 삽입하는 방법
- 컴파일 시점에 공통 기능을 삽입하는 방법
- AOP 개발 도구가 소스 코드를 컴파일 하기 전에 공통 구현 코드를 소스에 삽입하는 방식으로 동작
- 클래스 로딩 시점에 바이트 코드에 공통 기능을 삽입하는 방법
- 클래스를 로딩할 때 바이트 코드에 공통 기능을 클래스에 삽입하는 방법
- 1번과 2번은 스프링 AOP에서 지원하지 않으며 AspdectJ와 같이 AOP 전용 도구를 사용해서 적용 가능
- 런타임에 프록시 객체를 생성해서 공통 기능을 삽입하는 방법 ★
스프링이 제공하는 AOP 방식은 프록시를 이용한 세번째 방식이다.
프록시 기반의 AOP
AOP의 주요 용어
용어 | 의미 |
Advice | 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. 예를 들어 '메서드를 호출하기 전'(언제)에 '트랜잭션 시작'(공통 기능) 기능을 적용한다는 것을 정의한다. |
Joinpoint | Advice를 적용 가능한 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 JoinPoint에 해당한다. 스프링은 프록시를 이용해서 AOP를 구현하기 때문에 메서드 호출에 대한 Joinpoint만 지원한다. |
Pointcut | Joinpint의 부분 집합으로서 실제 Advice가 적용되는 Joinpoint를 나타낸다. 스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 있다. |
Weaving | Advice를 핵심 로직 코드에 적용하는 것을 weaving이라고 한다. |
Aspect | 여러 객체에 공통으로 적용되는 기능을 Aspect라고 한다. 트랜잭션이나 보안 등이 Aspect의 좋은 예이다. |
7.2.2 Advice의 종류
스프링은 프록시를 이용해서 메서드 호출 시점에 Aspect를 적용하기 때문에 구현 가능한 Advice의 종류는 다음과 같다.
종류 | 설명 |
Before Advice | 대상 객체의 메서드 호출 전에 공동 기능을 실행한다. |
After Returning Advice | 대상 객체의 메서드가 익셉션 없이 실행된 이후에 공통 기능을 실행한다. |
After Throwing Advice | 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능을 실행한다. |
After Advice | 익셉션 발생 여부에 상관없이 대상 객체의 메서드 실행 후 공통 기능을 시랭한다. (try-catch-finally의 finally 블록과 비슷하다.) |
Around Advice | 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능을 실행하는데 사용된다. |
이중에 널리 사용되는 것은 Around Advice이다. 이유는 대상 객체의 메서드를 실행하기 전/후, 익셉션 발생 시점 등 다양한 시점에 원하는 기능을 삽입할 수 있기 때문이다.
References
초보 웹 개발자를 위한 스프링5 프로그래밍 입문, 최범균 저
'JAVA > Spring' 카테고리의 다른 글
10. 스프링 MVC 프레임워크 동작 방식 (0) | 2021.07.30 |
---|---|
7. AOP 프로그래밍 #3 스프링 AOP 구현 (0) | 2021.07.27 |
7. AOP 프로그래밍 #2 프록시(Proxy)와 AOP (0) | 2021.07.27 |
7. AOP 프로그래밍 #1 프로젝트 준비 (0) | 2021.07.27 |
4. 의존 자동 주입 #6 자동 주입과 명시적 의존 주입 간의 관계 (0) | 2021.07.12 |