앞에서 스프링 AOP 동작원리를 알아보았는데, 핵심은 AOP로 동작할 객체를 그냥 Bean(객체)가 아닌 Proxy객체로 생성해서 스프링 컨테이너에 등록 해주는 것이었다.
그렇다면 Proxy객체가 무엇이고, 무엇인데 AOP처럼 특정 동작을 끼워넣을 수 있는지 알아보면 좋을 것 같다.
🎯 프록시 객체
프록시라는 단어는 중간에서 무엇인가를 대체한다는 의미를 가지고 있다.
프록시 패턴이란 중간에 끼여서 작업을 대리로 처리하거나, 추가적인 작업을 끼워넣을 수 있는 패턴을 의미한다.
Spring에서는 인터페이스가 존재하기 때문에 클라이언트는 인터페이스에게 명령하고, 실제 동작하는 구현체 객체는 알지 못한다.
즉, 인터페이스를 구현하고 있는 실제 객체가 동작하는지, 프록시 객체가 동작하는지 알 수 없다는 의미이다.
프록시의 기능으로는 크게 2가지가 있다.
1. 접근 제어
- 권한에 따른 접근 차단
- 캐싱
- 지연로딩
2. 부가 기능 추가
- 원래 객체의 기능에 부가 기능을 추가(로그를 남긴다거나)
- 요청, 응답값을 중간에 가로채서 변경
접근제어의 목적으로 사용하면 프록시 패턴, 부가 기능 추가의 목적으로 사용하면 데코레이터 패턴으로 불린다고 한다.
🎯 동적 프록시
프록시 객체를 사용하기 위해서 JDK 동적프록시와 CGLIB 라는 2가지 기술을 사용한다.
JDK 동적프록시
- Java에서 기본으로 제공(리플렉션 사용)
- 인터페이스를 기반으로 동작
CGLIB
- 인터페이스가 아닌 그냥 클래스에 대한 프록시 객체를 생성할 때 사용
- 바이트 코드를 조작하여 동적 프록시를 생성하고, 상속을 기반으로 구현된다.
프록시 객체를 생성할 때에는 같은 타입으로 생성하기 위해 인터페이스 기반으로 생성할 수 있는데, 인터페이스가 아닌 그냥 클래스에 대해서 프록시 객체를 만들기 위해 상속을 이용하였고, 이를 CGLIB가 구현해준다.
Spring에서는 프록시 팩토리를 통해서 프록시를 만들 대상을 확인하여 인터페이스가 있으면 JDK동적프록시, 인터페이스가 없으면 CGLIB를 이용하여 프록시 객체를 생성해준다.
- 포인트컷( Pointcut ): 어디에 부가 기능을 적용할지, 어디에 부가 기능을 적용하지 않을지 판단하는 필터링 로직이다. 주로 클래스와 메서드 이름으로 필터링 한다. 이름 그대로 어떤 포인트(Point)에 기능을 적용할지 하지 않을지 잘라서(cut) 구분하는 것이다. → 대상 여부를 확인하는 필터 역할 담당
- 어드바이스( Advice ): 이전에 본 것 처럼 프록시가 호출하는 부가 기능이다. 단순하게 프록시 로직이라 생각하면 된다. → 부가 기능 로직만 담당
- 어드바이저( Advisor ): 단순하게 하나의 포인트컷과 하나의 어드바이스를 가지고 있는 것이다. 쉽게 이야기해서 포인트컷1 + 어드바이스1이다. → 포인트컷 + 어드바이스로 구성
Spring에서 프록시 객체로 만들 클래스를 확인하고, 해당 프록시 객체에 여러개의 어드바이저를 적용할 수 있다. 즉, 하나의 프록시 객체에 여러가지 부가기능들을 하도록 추가할 수 있다.(ex 로깅, 인증, 메서드 로직 시간 측정 등등)
'프로젝트 > 데브툰' 카테고리의 다른 글
[데브툰] CI 적용하기 (0) | 2024.07.16 |
---|---|
[프로젝트] @Async를 알아보자(feat. 빈 후처리기) (0) | 2024.05.08 |
[프로젝트] @Async를 알아보자(feat. Spring AOP) (0) | 2024.05.06 |
[프로젝트] 비동기 프로그래밍 적용해보기 (0) | 2024.05.01 |
[프로젝트] 프로젝트 목표 및 기획 (0) | 2024.04.30 |