ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring AOP: 프록시 기반 AOP
    SPRING/스프링프레임워크 핵심개념 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 객체를 만들어 사용한다.

Designed by Tistory.