본문 바로가기
Spring

AOP(Aspect Oriented Programming)

by 쬑께께 2022. 5. 3.

AOP

Aspect Oriented Programming의 약어로

관점 지향 프로그래밍을 말한다.

 

관점 지향은 어떤 로직을 기준으로

핵심적인 관점, 부가적인 관점으로 나누어 본다는 말이다.

따라서 관점을 기준으로 각각 모듈화하는 프로그래밍 기법인 것이다.

OOP(Object-Oriented Programming, 객체 지향 프로그래밍)과

서로 보완관계에 있는 기술이다.

 

 

다음 그림과 같이 AOP는 흩어진 Aspect를 

모듈화 할 수 있는 프로그래밍 기법을 말한다.

 

즉, 주요 핵심 기능과 핵심 기능 구현을 위한

부가적인 기능 구현을 분리하여

각각의 관점 별로 묶어서 개발하는 방식을 말한다.

 

 

AOP 주요 용어

 

Weaving: 공통 관심 기능 코드를 삽입

Aspect: 흩어져있는 관심사인 부가기능을 묶어서 모듈화 한 것

Target: 모듈화된 부가기능(Aspect)이 적용되는 대상(클래스 또는 메서드 등)

Advice: Target에 종속되지 않고 순수하게 부가 기능만 실제로 구현된 부분

실질적으로 어떤 일을 해야할 지에 대한 것

JointPoint: 구현된 부가 기능(Advice)을 실제 수행할 지점

PointCut: 부가 기능을 수행할 지점(JointPoint)에 대한 스펙 정의서

Advisor: PointCut + Advice (스프링 AOP에서 사용하는 용어)

 

자동 프록시 생성기

(Default Advisor Auto Proxy Creator)

타겟 객체(프록시로 감싸고 싶은 타겟)의

인터페이스 타입(그렇기에 인터페이스가 반드시 필요함)을

기준으로 프록시 객체를 생성

* 타겟 객체는 반드시 추상화 되어 있어야 함

 

생성 과정

1. 컨테이너 상에 등록된 Advisor와 PointCut을 모두 스캔 (들어가는 조건들을 먼저 스캔함)

2. 프록시 생성이 필요한 bean을 선별

3. 해당 인터페이스를 기반으로 프록시를 생성함

(프록시 대신이 되는 bean은 해당 bean이 구현한 인터페이스 타입을 기준으로 프록시 bean을 생성)

4. 원래의 타겟 빈을 프록시 빈으로 바꿔치기

(-> 가능한 이유: 주입하는 방식이기 때문)

 

인터페이스 기반으로 프록시 빈을 생성하고 이를 원본 타겟 빈 인것처럼 등록해줌

-> 이때, 원본 타겟의 빈 타입은 원본 타겟 빈의 클래스가 아닌 인터페이스로 정의됨

@Autowired와 같이 타입 기반 DI의 경우 원본 타겟 클래스 타입과 일치하는 빈 객체가 없어 에러 발생 가능

 

AOP적용 방법

 

1. 컴파일 타임에 적용

컴파일 시점에 바이트 코드를 조작하여 AOP가 적용된 바이트 코드 생성

2. 로드 타임에 적용

컴파일 후 클래스를 로딩하는 시점에서 정보 변경(Load Time Weaving)

3. 런 타임에 적용

A 클래스 타입의 빈을 만들 때, A 타입을 프록시 빈을 만들어 프록시 빈이 Aspect 코드를 추가

 

 

사용해보기

EventService.java 파일

 

SimpleEventService.java 파일

 

AppRunner.java 파일

 

aopContext.xml 파일에 다음 문장을 추가시켜준다

 

다음과 같이 시작 시간과 종료 시간을 구해서 

동작하는데 걸리는 시간을 출력시키도록 했다.

여기서 위의 방법처럼 하드 코딩이 아닌 프록시를 통해

동작하는데 걸리는 시간을 출력시켜보도록 하겠다.

 

ProxyService.java 파일

다음과 같이 SimpleEventService.java 파일에서 하던 기능과

똑같은 동작을 하는 새로운 파일을 생성해주었다.

 

SimpleEventService.java 파일

 

AppRunner.java 파일

다음과 같이 생성한 프록시를

원래 사용하던 것 대신 넣어주면 된다.

aopContext.xml 파일

 

동작시켜보면

다음과 같이 잘 돌아가는 모습을 확인할 수 있다.

'Spring' 카테고리의 다른 글

트랜잭션(Transaction)  (0) 2022.05.10
텍스트 파일 생성 및 저장  (0) 2022.05.09
src/main/resources 폴더에 하위 폴더 만들기  (0) 2022.05.09
스프링에서 제공하는 AOP사용해보기  (0) 2022.05.04
스프링 설치  (0) 2022.04.26