💐 Spring/Spring 핵심 기술

17. 스프링 AOP : 프록시 기반 AOP

2020. 7. 25. 16:50
목차
  1. 스프링 AOP 특징
  2. 프록시 패턴
  3. 문제점
  4. 그래서 등장한 것이 스프링 AOP
반응형

스프링 AOP 특징

  • 프록시 기반의 AOP 구현체
  • 스프링 빈에만 AOP를 적용할 수 있다.
  • 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스를 만드는 비용과 수고, 객체들 간 관계 복잡 등등)에 대한 해결책을 제공하는 것이 목적.

 

 

프록시 패턴

(기존 코드 변경 없이) 접근 제어 또는 부가 기능 추가

 

 

 

 

프록시 패턴을 이용하여 기존 코드를 건드리지 않고 성능을 측정해보겠다. 

 

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    EventService eventService; //interface가 있다면 interface타입으로 받는게 가장 좋다. 구현체로 받지말고.

    @Override
    public void run(ApplicationArguments args) throws Exception {
        eventService.createEvent();
        eventService.publishEvent();
        eventService.deleteEvent();
    }
}
public interface EventService {
    void createEvent();

    void publishEvent();

    void deleteEvent();
}
@Service
public class SimpleEventService implements EventService{
    @Override
    public void createEvent() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("create an Event");
    }

    @Override
    public void publishEvent() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("publish an Event");
    }

    @Override
    public void deleteEvent(){
        System.out.println("Delete an Event");
    }
}

Real Subject 클래스에 아래 코드들을 추가해주면 된다. 

@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("create an Event");

        System.out.println(System.currentTimeMillis() - begin);//시작시간을 뺀 시간을 출력해주면 된다.
    }

    @Override
    public void publishEvent() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("publish an Event");
    }
}

 

하지만, 기존 코드들을 건들이지 않고 성능을 측정하고 싶다.

 

Proxy패턴을 이용해본다. 새로운 클래스들을 만들어주고 메소드들 실행전과 후에 코드들을 넣어준다.

@Primary //@Service 애노테이션이 여러개 있을경우 이 빈을 우선으로 사용.
@Service
public class ProxySimpleEventService implements EventService{

    @Autowired
    SimpleEventService simpleEventService;//이번만은 interface형식으로 말고, 우리가 변경하고자 하는 구현체를 주입받는다.

    @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.publishEvent();
        System.out.println(System.currentTimeMillis() - begin);
    }

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

 

 

 

문제점

  • 매번 프록시 클래스를 작성해야 하는가? (클래스를 만드는 비용과 수고)
  • 여러 클래스 여러 메소드에 적용하려면..?
  • 프록시 클래스에도 생기는 중복 코드

 

 

그래서 등장한 것이 스프링 AOP

  • 스프링 IoC 컨테이너가 제공하는 기반 시설과 Dynamic 프록시를 사용하여 *여러 복잡한 문제 해결.  *중복코드, 객체간 관계 복잡함 등
  • 동적 프록시 : 동적으로 프록시 객체 생성하는 방법 (동적 이란? Runtime,즉 애플리케이션이 동작하는 중에 동적으로 어떤 객체를 Runtime에 만든다.
    • 자바가 제공하는 방법은 인터페이스 기반 프록시 생성
    • CGlib은 클래스 기반 프록시도 지원
  • 스프링 IoC: 기존 빈을 대체하는 동적 프록시 빈을 만들어 등록 시켜준다.
    • 클라이언트 코드 변경 없음.
    • AbstractAutoProxyCreator implements BeanPostProcessor
반응형
저작자표시 (새창열림)
  1. 스프링 AOP 특징
  2. 프록시 패턴
  3. 문제점
  4. 그래서 등장한 것이 스프링 AOP
'💐 Spring/Spring 핵심 기술' 카테고리의 다른 글
  • 19. Null-safety
  • 18. 스프링 AOP : @AOP
  • 16. 스프링 AOP : 개념 소개
  • 15. SpEL ( 스프링 Expression Language)
iseunghan
iseunghan
꾸준하게 열심히..
iseunghan
iseunghan

공지사항

  • 어제보다 나은 오늘이 되기 위해 🔥
  • 분류 전체보기 (262)
    • 💐 Spring (14)
      • 개념 및 이해 (2)
      • Spring 핵심 기술 (24)
      • Spring REST API (8)
      • Spring MVC, DB 접근 기술 (7)
      • Spring Security (23)
      • Spring in Action (1)
    • 🌻 JAVA (84)
      • 자바 ORM 표준 JPA 프로그래밍 (20)
      • 알고리즘, 자료구조 (13)
      • 디자인 패턴 (7)
      • 정리정리정리 (43)
      • JUnit (1)
    • 🔖 Snippets (3)
      • Javascript (3)
    • ⚙️ Devops (22)
      • ⛏ Git (11)
      • 🐳 Docker (6)
      • 🐧 Linux (3)
      • 🌈 Jenkins (1)
      • 📬 Kafka (1)
    • 💬 ETC.. (4)
      • 💻 macOS (2)
    • 🌧️ ORM (2)
      • JPA (2)
    • 🐍 Python (3)
    • 📚 Databases (15)
      • 오라클로 배우는 데이터베이스 개론과 실습(2판) (3)
      • RealMySQL 8.0 (8)
    • 🔥 Computer Science (5)
      • 📡 네트워크 (5)
    • 🏷️ 협업 (1)
    • 📜 코딩테스트 (38)
      • BAEKJOON\수학 1, 수학 2 (8)
      • BAEKJOON\재귀 (5)
      • BAEKJOON\브루트 포스 (3)
      • BAEKJOON\정렬 (1)
      • BAEKJOON\백트래킹 (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\이분탐색 (1)
      • BAEKJOON\다이나믹 프로그래밍 (9)
      • BAEKJOON\그리디 알고리즘 (0)
    • ✨ ISEUNGHAN (1)

인기 글

전체
오늘
어제
반응형
hELLO · Designed By 정상우.
iseunghan
17. 스프링 AOP : 프록시 기반 AOP
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.