AOP(Aspect-Oriented Programming) = '관점 지향 프로그래밍'
객체지향에서 특정 비즈니스 로직에 걸림돌이 되는 공통 로직을 제거할 수 있는 방법을 제공합니다.
AOP는 관심사의 분리(separate concerns)를 추구합니다.
관점(Aspect)란?
관점이라는 용어는 관심사(concern)로 생각하면 되고, 관심사는 개발 시 필요한 고민을 말합니다.
- 파라미터가 올바르게 들어왔는지
- 이 작업을 하는 사용자가 적절한 권한을 가진 사용자인지..
'핵심 로직'은 아니지만 코드를 온전하게 만들기 위해 필요한 고민입니다. 전통적인 방식에는 이러한 고민에 의해 코드들이 반복적으로 적용되는데, AOP는 개발자가 염두에 두어야하는 일들은 별도의 '관심사'로 분리하고 핵심 비즈니스 로직만을 작성할 것을 권장합니다.
Proxy : target을 전체적으로 감싸고 있는 존재
(*Target : 순수한 비즈니스 로직, 어떠한 관심사들과도 관계를 맺지않는 코어라고 생각하면됩니다.)
Proxy는 내부적으로 Target을 호출하는데, 중간에 필요한 관심사들을 거쳐서 Target을 호출하도록 자동 혹은 수동으로 작성됩니다. 스프링 AOP 기능을 이용해서 자동으로 생성하는 auto-proxy 방식을 가장 많이 사용합니다.
- 외부에서 호출 : Proxy 객체를 통해서 Target 객체의 JoinPoint를 호출하는 방식
AOP 주요 용어
- Advice : 횡단관심에 해당하는 공통기능의 코드를 의미하며 독립된 클래스와 메서드로 작성된다. 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의
구분 (동작 시점) | 설명 |
Before Advice | Target의 JoinPoint를 호출하기 전에 실행되는 코드, 코드의 실행 자체에는 관여할 수 없음 |
After Returing Advice | 모든 실행이 정상적으로 이루어진 후에 동작하는 코드 |
After Throwing Advice | 예외가 발생한 뒤에 동작하는 코드 |
After Advcie | 정상적으로 실행되거나 예외가 발생했을 때 구분 없이 실행되는 코드 |
Around Advice | 메서드의 실행 자체를 제어할 수 있는 가장 강력한 코드, 직접 대상 메서드를 호출하고 결과나 예외를 처리할 수 있다. |
- JoinPoint : Advice 적용 가능한 지점을 의미. 메서드 호출, 필드 값 변경 등이 이에 해당합니다. 클라이언트가 호출하는 모든 비즈니스 메소드로 포인트 컷의 대상
- Pointcut : joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 joinpoint를 나타냅니다. 수많은 비즈니스 메서드 중에서 우리가 원하는 특정 메서드에서만 횡단관심에 해당하는 공통기능을 수행시키기 위해서 필요합니다. (Target은 결과적으로 Pointcut에 의해 자신에게 없는 기능들을 가지게 됩니다.)
- Weaving : Advice를 핵심 로직에 적용하는 것을 weaving이라고 합니다. 즉 공통 코드를 핵심 로직 코드에 삽입하는 것을 말합니다.
- Aspect : 여러 객체에 공통으로 적용되는 공통 관심 사항을 뜻합니다. 예시로는 트랜잭션, 보안, 로깅 등이 있습니다.
AOP 엘리먼트
<aop:config>
: aop설정의 루트 엘리먼트, 스프링 설정 파일 내에 여러 번 사용가능하며 하위에 <aop:aspect>, <aop:pointcut>이 위치할 수 있다.
<aop:pointcut>
: 포인터컷을 지정하기 위해 사용하며 <aop:config>나 <aop:aspect>의 자식 엘리먼트로 사용될 수 있습니다.
<aop:pointcut>은 여러 개 정의할 수 있으며 유일한 아이디를 할당하여 애스팩트를 설정할 때 포인트컷을 참조하는 용도로 사용합니다.
<aop:aspect>
: 핵심관심에 해당하는 포인트컷 메서드와 횡단관심에 해당하는 어드바이스 메서드를 결합하기 위해 사용합니다.
<aop:advisor>
: 포인트컷과 어드바이스를 결합한다는 의미에서 애스팩트와 같은 기능을 하지만 트랜잭션 설정과 같은 특수한 경우에 사용합니다.
Spring에서의 AOP
스프링에서 aop를 구현하는 3가지 방식
- XML 스키마 기반의 POJO 클래스를 이용한 AOP를 구현
- Aspect J 5/6에서 정의한 @Aspect 어노테이션 기반의 AOP 구현
- 스프링 API를 이용한 AOP 구현
위 3가지 방식 다 내부적으로는 프록시를 이용하여 AOP가 구현되므로 메서드 호출에 대해서만 AOP를 적용할 수 있습니다.
Spring Project에 AOP 라이브러리 추가
- pom.xml
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.8</version>
<scope>runtime</scope>
</dependency>
위 코드를 추가해준 다음 스프링 설정파일에서 네임스페이스에서 AOP를 추가해주면 됩니다.
- applicationContext.xml
'language > Spring' 카테고리의 다른 글
[Java/Spring] AOP Pointcut 표현식 (0) | 2022.03.20 |
---|---|
[Java/Spring] 빈 객체 라이프 사이클 (0) | 2022.03.20 |
[Spring/Maven] Spring 프로젝트에 오라클 드라이버 적용시키기 (Eclipse) (0) | 2022.03.16 |
[Java/Spring] Spring Project 생성 (0) | 2022.03.14 |
[Spring/IntelliJ] java version 설정 (java 11 버전 설정) java: warning: source release 11 requires target release 11 (0) | 2022.02.24 |