16.프록시 기반 AOP

프록시 기반 AOP

스프링 AOP: 프록시 기반 AOP
스프링 AOP 특징
모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IoC와 연동하여 엔터프라이즈
애플리케이션에서 가장 흔한 문제에 대한 해결책을 제공하는 것이 목적.

프록시 패턴?
아래그림과 같이 인터페이스가 있고 클라이언트는 프록시 객체를 갖는다. 프록시는 타겟 객체를 원래해야할 일을 갖고있는 객체를 감싸 실체 클라이언트의 요청을 처리

프록시 패턴의 존재 이유?
(기존 코드 변경 없이) 접근 제어 또는 부가 기능 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public interface EventService {
void createEvent();
void publishEvent();
void deleteEvent();
}

@Service
public class SimpleEventServeice implemets EventService {
@Override
public void createEvent() {
//로직
}

@Override
public void publishEvent() {
//로직
}

@Override
public void deleteEvent() {
//로직
}

}


@Component
public class AppRunner implemets ApplicationRunner {
@Autowired
EventService eventService;

@Override
public void run(.....){
eventService.createEvent();
eventService.publishEvent();
eventService.deleteEvent();
}

}

위와같이 클래스가 있을 때 void createEvent(); / void publishEvent(); 두메소드의 내부 동작시간을 확인하고 싶을떄 어떻게 해야할까
SimpleEventServeice 내부에 currentTime 와 endTime를 빼는 로직을 추가할 순 있지만 프록시로 구현가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Primary	//EventService를 여러곳에서 impl했을 때 활용하는것이었다
@Service
public class ProxySimpleEvenService implements EventService {

@Autowired
SimpleEventService simpleEventService; //EventService simpleEventService; 도 가능

@Override
public void createEvent() {
long begin = System.currentTimeMilliis();
simpleEventService.createEvent();
print(System.currentTimeMills()-begin);
}

@Override
public void publishEvent() {
long begin = System.currentTimeMilliis();
simpleEventService.publishEvent();
print(System.currentTimeMills()-begin);
}

@Override
public void deleteEvent() {
simpleEventService.deleteEvent();
}

}

위와같이 할경우 프록시 기반으로 구현가능하다.
하지만 위의경우 중복코드 추가, 해당 클래스를 만드는 비용이 든다. 또한 해당기능(타임을 재는것)을 다른곳에도 추가해야 한다면 모든 클래스에 프록시를 만들고 중복 코드를 추가해야되나????

위의 문제점을 해결한것이 스프링AOP
동적으로 프록시 객체를 생성하는 방법이다. 이는 스프링 IoC컨테이너가제공하는 기반 시설과 다이나믹 프록시를 사용하여 문제를 해결함

Share