@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를 빼는 로직을 추가할 순 있지만 프록시로 구현가능하다.
@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컨테이너가제공하는 기반 시설과 다이나믹 프록시를 사용하여 문제를 해결함