-
[Spring] 프록시 패턴과 데코레이터 패턴 - 1Spring 2022. 6. 16. 15:53
이전 정리하였던 템플릿 메서드 패턴과 콜백 패턴을 사용하면
새로운 코드를 추가할 때 코드 수정을 최소화 할 수 있다. 하지만 최소화 할 수 있었을 뿐
기존 원본 코드를 변경해야한다는 것은 변함이 없었다.
이를 해결하기 위해서 프록시를 활용하게 된다.
프록시(Proxy)란?
클라이언트가 서버에 필요한 것을 요청하고 서버는 클라이언트의 요청을 처리한다는 개념, 정의는
이미 알고 있다.
이 때 클라이언트가 서버를 직접 호출 및 결과를 받는 것(직접 호출)이 아니라
서버에 호출을 대신 전해주는 무언가에 간접적으로 요청(간접 호출)을 할 수 있다.
(클라이언트 -> 000 -> 서버) 이때 클라이언트가 간접적으로 요청하는 대상을 프록시라고 한다.
프록시가 클라이언트의 요청을 먼저 받고 이를 서버에 전달하는 구조를 통해 다양한 기능을 수행 가능하다.
1. 접근 제어, 캐싱
- 권한에 따른 접근 차단
- 캐싱 (필드에 이전 클라이언트가 요청한 값을 가지고 있다면 서버 대신 값을 반환해줌)
- 지연 로딩
2. 부가 기능 추가
- 원래 서버가 제공하는 기능에 부가기능을 더해서 수행한다.
(요청 값, 응답 값을 변형 / 실행 시간 측정 후 로그 출력 등)
3. 프록시 체인
- 필터 처럼 여러개의 프록시가 연속적으로 존재하는 것
객체에서 프록시가 되려면 클라이언트는 서버에게 요청을 한것인지, 프록시에게 요청한 것인지 몰라야한다.
즉 서버와 프록시는 같은 인터페이스를 사용해야한다. (DI를 통한 다형성을 활용해야 한다는 의미)
프록시 패턴과 데코레이터 패턴의 차이?
두가지 패턴 모두 프록시를 사용하기 때문에 비슷한 구조를 가진다.
이를 구분하기 위해서는 두가지 패턴의 의도(indent)를 파악해야한다.
프록시 패턴 : 접근 제어를 목적으로 함
데코레이터 패턴 : 새로운 기능 추가가 목적이다.
(프록시는 요청과 응답 사이에서 대리자 역할을 하는 것을 의미할 수 있다.)
[스프링 관련 참고사항]
* 스프링 빈으로 등록하는 클래스
- 인터페이스가 있는 경우, 스프링 빈으로 수동 등록
- 인터페이스가 없는 경우, 스프링 빈으로 수동 등록
- 컴포넌트 스캔으로 스프링 빈 자동 등록
* 스프링 MVC는 타입에 @Controller 또는 @RequestMapping이 있어야 컨트롤러로 인식한다
컨트롤러로 인식 후 HTTP URL이 매핑되고 동작한다. (@RequestMapping은 인터페이스에 사용 가능)
* @ResponseBody : HTTP 메시지 컨버터를 사용해서 응답함, 인터페이스에 사용 가능
* 인터페이스에 매개변수를 넣어줄 때 @RequestParam("값") 을 작성해야 인식 못하는 경우가 없다.
* Application 파일에 @Import(000Config.class) 애너테이션으로 스프링 빈으로 등록 가능하다.
@Configuratioin(컴포넌트 애너테이션 포함되어 있음) 같은 설정 파일 등록할 때 사용한다.
여러 배열로 등록할 때는 @Import({1번.class, 2번.class}) 와 같이 중괄호 안에 작성한다.
* @SpringBootApplecation(scanBasePackages ="패키지명")을 통해 컴포넌트 스캔이 이루어질
패키지를 지정할 수 있다.
[참고 : 인프런 - 스프링 핵심 원리 - 고급편]
'Spring' 카테고리의 다른 글
[Spring] 프록시 패턴과 데코레이터 패턴 - 3 (0) 2022.06.16 [Spring] 프록시 패턴과 데코레이터 패턴 - 2 (0) 2022.06.16 [Spring] 전략 패턴 - 상속이 아닌 위임을 활용 (0) 2022.06.15 [Spring] 템플릿 메서드 패턴 - 변하는 것과 변하지 않는 것의 분리 (0) 2022.06.15 [Spring] 동시성 문제 해결하기 - ThreadLocal (0) 2022.06.14