스프링 프록시

고승원·2023년 5월 15일
0

TIL

목록 보기
18/24

프록시 패턴

객체 지향 디자인 패턴 중 하나로, 객체에 대한 접근을 제어하기 위해 중간에 대리자(proxy) 객체를 두는 것.
프록시는 실제 객체와 동일한 인터페이스를 구현하지만, 실제 객체에 대한 요청을 중간에 가로채서 필요한 작업을 수행하고, 그 결과를 반환한다. 이를 통해 실제 객체에 직접 접근하는 것을 막고, 객체에 대한 접근을 제어할 수 있다.

스프링 프록시

스프링에서 AOP(Aspect-Oriented Programming)를 구현하기 위해 사용되는 것.
스프링 AOP는 프록시 패턴을 이용하여 구현되며, 스프링 컨테이너가 생성하는 런타임 프록시를 사용한다.
스프링 프록시는 AOP를 구현하는 데 필요한 부가 기능을 추가하고, 메소드 실행 전후에 필요한 작업을 수행다.

생성 방법

인터페이스를 구현한 경우 JDK Dynamic Proxy를 사용한다. (자바 제공)

  • 원본 객체가 구현한 인터페이스를 파라미터로 받아, 원본 객체와 같은 인터페이스를 구현한 프록시 객체를 생성합니다.
  • 프록시 객체는 InvocationHandler를 구현한 클래스에 의해 메소드 호출 시에 필요한 부가 기능을 수행합니다.

인터페이스를 구현하지 않은 경우 CGLIB을 사용하여 생성한다. (바이트 코드 조작, 비교적 빠름)

  • 원본 객체를 상속한 서브클래스를 생성하여 프록시 객체를 생성한다.(기본생성자 private불가)
  • MethodInterceptor를 구현한 클래스에 의해 메소드 호출시 부가기능을 수행한다.

스프링 프록시는 스프링 AOP를 사용하여 어노테이션 기반으로 부가 기능을 추가할 수 있다. 어노테이션 기반으로 프록시 객체를 생성하고, 부가 기능을 수행할 메소드를 지정합니다. 스프링 AOP는 자바 언어의 프록시 패턴을 기반으로 하므로, 다른 프록시 패턴과 마찬가지로 원본 객체를 가리키는 포인터 역할을 합니다. 따라서, 프록시 객체를 사용하여 원본 객체에 접근할 수 있습니다.

정리하면

스프링 프록시 → 스프링 AOP → 자바 프록시 패턴을 사용해 프록시 객체를 생성하고, 부가기능(지연로딩, 런타임 의존성 정리)을 수행할 메소드를 지정한다.

InvocationHandler

자바의 reflection 패키지의 인터페이스로, 동적 인터페이스를 생성하는 방법 중 하나.
invoke() 메서드를 구현해 프록시 또는 실제 객체에서 호출되는 메소드를 처리하는 역할을 한다.

MethodInterceptor

스프링 AOP의 구현체인 AspectJ 라이브러리중 하나로 프록시 객체에서 호출된 메서드를 가로채 처리를 하는 인터페이스. 스프링 AOP의 Advice의 한 종류.
invoke() 메서드를 구현해 프록시 객체에서 호출된 메서드를 가로채 원하는 처리를 수행한다.

profile
봄은 영어로 스프링

0개의 댓글