-
Spring AOP: 프록시 기반 AOPSPRING/스프링프레임워크 핵심개념 2021. 5. 29. 15:46
스프링 AOP 특징
- 프록시 기반의 AOP 구현체
- 스프링 빈에만 AOP를 적용할 수 있음.
- 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IOC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제에 대한 해결책을 제공하는 것이 목적임.
프록시 패턴
Proxy 패턴은 위와 같이 Interface가 있고, Client는 Interface Type으로 Proxy 객체를 사용한다.
Proxy객체는 또한 Real Subject(target) 객체를 참조하고 있다.
아래 코드는 Proxy 패턴의 예제이다.
// Client 역할 @Component public class AppRunner implements ApplicationRunner { @Autowired EventService eventService; @Override public void run(ApplicationArguments args) throws Exception { eventService.createEvent(); eventService.publishEvent(); eventService.deleteEvent(); } } // Interface 역할 public interface EventService { void createEvent(); void publishEvent(); void deleteEvent(); } @Service public class SimpleEventService implements EventService { @Override public void createEvent() { long begin = System.currentTimeMillis(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Created an event"); System.out.println(System.currentTimeMillis() - begin); } @Override public void publishEvent() { long begin = System.currentTimeMillis(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Published an event"); System.out.println(System.currentTimeMillis() - begin); } @Override public void deleteEvent() { System.out.println("Delete an event"); } } // Client가 EventService를 Autowired하여 사용할 때 해당 객체를 사용한다. @Primary @Service public class ProxySimpleEventService implements EventService { @Autowired SimpleEventService simpleEventService; @Override public void createEvent() { long begin = System.currentTimeMillis(); simpleEventService.createEvent(); System.out.println(System.currentTimeMillis()- begin); } @Override public void publishEvent() { long begin = System.currentTimeMillis(); simpleEventService.createEvent(); System.out.println(System.currentTimeMillis()- begin); } @Override public void deleteEvent() { simpleEventService.deleteEvent(); } }
위와 같이 프록시 패턴을 이용하여 코드를 작성하여도 중복코드가 많이 남아 있고, 여전히 복잡하기 때문에 Spring AOP를 사용한다. 스프링 AOP는 런타임 도중에 객체를 감싸는 Proxy 객체를 만들어 사용한다.
'SPRING > 스프링프레임워크 핵심개념' 카테고리의 다른 글
스프링 AOP: @AOP (0) 2021.05.29 스프링 AOP : 개념 (0) 2021.05.29 SPEL(스프링 Expresssion Language) (0) 2021.05.23 데이터 바인딩 추상화 : Converter와 Formatter (0) 2021.05.23 데이터 바인딩 추상화: PropertyEditor (0) 2021.05.19