인프런 강의 [스프링 핵심 원리 - 고급편] 강의를 기반으로 작성한 글 입니다.
프록시 : 클라이언트와 서버 사이에서 데이터를 전달해 주는 서버
클라이언트와 서버 사이에 위치하여 부가 기능을 처리하는 서버이다.
프록시의 주요 기능은 접근 제어와 부가 기능 제공이 있다.
접근 제어는 실제 서버로 넘어가기 이전에 이 클라이언트가 정상적인 요청인지 확인하고 서버로 넘길 수 있다. 정상적인 요청이 아니라면 프록시 서버에서 미리 차단할 수도 있다.
부가 기능 제공은 실제 서버로 넘기기 이전에, 잡다한 기능을 프록시 서버내에서 처리하고 실제 서버로 전달할 수 있다. 실제 서버에서 모든 기능을 동작 시 부하가 더 걸리기 마련인데, 그 사소한 작업들은 프록시 서버에 맡겨 부가 기능을 수행하도록 할 수 있다.
사실 프록시라는 개념이, Client와 Server에 국한되는 것이 아니다.
Java에서도 두 클래스 사이에서 기능을 대신 수행해주거나, 접근을 제어할 수 있다.
프록시 패턴은 인터페이스를 구현해 놓은 실제 클래스가 있고,
인터페이스에서 구현해 놓은 프록시 클래스가 있다.
실제 클래스에서는 실제로 동작 할 기능들이 담겨있고, 프록시 클래스에서는 접근 제어를 위한 기능들이 들어가 있다.
데코레이터 패턴은 실제 클래스에 실제 동작할 기능들을 적어두고,
데코레이터 (프록시) 클래스에 부가 기능(Time 측정, 데이터 처리)을 작성해 두고, 그 사이에 실제 클래스의 메소드를 호출하여 부가 기능 + 실제 기능을 수행하도록 하는 기법이다.
데코레이터는 여러 부가 기능을 추가할 수 있으므로, 하나의 Decorator 인터페이스에서 여러 기능의 Decorator를 상속 받아 처리가 가능하다.
🚨 이때 프록시는 중간에서 기능을 수행하는 대리자로 기억하자.
그에 반해, 프록시 패턴은 접근 제어에 대한 기능을 수행하고, 데코레이터 패턴은 부가 기능을 수행하는 디자인 패턴이라고 구분하자.
두 패턴 모두 중간에서 대신하여 기능을 수행하는 것이기 때문에 프록시와 깊은 연관이 있다.
(사실 접근 제어와 부가 기능에 대한 경계가 모호 하므로, 두 패턴은 인터페이스를 구현하면 프록시 패턴, 클래스를 상속 받으면 데코레이터 패턴이라고 이해하자.
Spring에서 인터페이스의 구현 클래스와 부가 기능을 처리할 프록시 패턴을 구현할 수 있다.
📁 Controller Interface
인터페이스에 메소드만 정의해 둔다.
원래라면 @RestController Annotation을 사용했을 텐데, @RestController Annotation에는 @Component Annotation이 붙어있기 때문에 자동으로 컴포넌트 스캔 대상이 되고, 빈에 등록이 된다.
필자는 Proxy 클래스를 붙여서 수동으로 빈을 등록하기 위해서, @RestController를 사용하지 않기로 했다.
📁 Controller 구현체
인터페이스를 구현하여, 실제 동작할 기능들을 구현체에 작성한다
📁 Proxy
이제 프록시 클래스는 인터페이스를 구현해야한다.
그리고, 부가 기능을 추가해야 하는데, 이 강의에서는 로그를 찍는 부가 기능을 수행하고, 실제 구현된 기능을 수행하는 것으로 프록시에 작성해둔다.
11번째 줄에 OrderControllerV1 target을 @RequriedArgsConstructor를 통해서 생성자에서 생성된다.
그리고 19번째 줄 target.request()
를 통해서, 실제 구현체의 기능을 수행할 수 있다.
그 외 나머지 기능들은, 부가 기능으로 프록시가 대신 처리하고 있다.
📁 의존 관계 주입
실제 OrderController를 생성했을 때, Controller의 구현체의 인스턴스를 일단 생성한다.
현재 구현체의 생성자에 Service가 필요하므로 넣어준다.
또한 이 생성된 인스턴스를 Proxy 에 넘겨 실제 구현체는 생성자로 들어가게 되고, logTrace라는 객체도 넘겨준다.
실제로 생성자에 두개가 필요한 모습이다.
이 방식으로 프록시가 부가 기능을 대신 처리할 수 있다.
📁 SpringBootApplication
SpringBoot Application에서 @Import로 빈 설정 파일을 불러올 수 있다.
이 방식으로 빈에 수동 등록해준다.
장점
단점