본문 바로가기

공부기록/인터넷 강의

프록시 데코레이터

- 김영한 스프링 핵심 원리 고급편을 듣고 느낀점들

 

RequestMapping, ResponseBody는 인터페이스에서 사용할 수 있음. ( 컨트롤러를 인터페이스화 시켜서 사용하기)

그러나 Controller, RestController는 인터페이스에서 사용할 수 없음.

config를 component scan의 대상이 안되도록 하기 위해서

Import 애노테이션 → config class 정의

SpringBootApplication에 scanBasePackage를 설정하여 config를 스캔하지 않도록 한다.

수동등록, 자동등록 → 둘다 많이 사용함

원본 코드를 전혀 수정하지 않고, 부가 기능을 추가할 수 있을까? ⇒ 프록시, 또는 AOP

프록시

요청을 앞서 처리해주는 레이어?

네트워크 프록시, 프록시 객체가 있음

네트워크 프록시는 서버 앞에서 처리해주는 서버

프록시 객체는 어떤 객체 이전에 처리해주는 것(간접호출) - 접근 제어, 캐싱, 부가 기능 추가, 프록시 체인

⇒ 공통 전처리/ 후처리 작업을 프록시로 관리하여, 여러 메서드 실행전에 거치도록 한다.

프록시에는 프록시 패턴(접근제어)와 데코레이터(기능 추가)가 있다. 둘다 생김새( 어떤 것을 미리 거쳐감)는 같아도, 의도는 다르다.

프록시 패턴

접근 제어가 목적(캐시)

기존 코드를 수정하지 않고, 접근 제어를 할 수있다. ( 같은 인터페이스를 갖춰야 한다.)

데코레이터

로그, 데이터변형, 트랜잭션

로그나 트랜잭션은 데코레이터인가? 그러면.. Spring Proxy로 알고 있었는데

새로운 기능 추가가 목적


인터페이스를 상속받은 클래스 → 프록시도 해당 인터페이스를 상속받아서 만들어 준후,

Appconfig에서 해당 프록시를 사용하도록 한다?

구체 클래스 → 해당 클래스를 그냥 사용하도록?

구체 클래스 프록시를 손으로 작성해서 하는 것은 안좋아보인다.

아무래도 부모 클래스와 같은 결합? 같은 느낌

→ 둘다 프록시를 계속 만들어야하는 문제가 있다.

스프링 컴포넌트에 프록시는 어떻게 적용할까?

→ Spring annotation을 사용하여 프록시...

→ 애노테이션을 만들어서 AOP

동적 프록시

동적 프록시는 JDK dynamic, CGLIB 으로 나뉠수 있다.

JDK dynamic

→ 이제는 proxy 객체를 각각 만들지 않아도 되고 ,하나의 proxy 객체만을 만들어서 처리하면 된다.

그러나 인터페이스가 필수적임

CGLIB

인터페이스가 없고, 구체클래스만 있는 경우에 사용하기 좋음

cglib에서 MethodIntercepter와 Enhancer를 사용하여 proxy 기능을 사용할 수 있음

스프링에서 지원하는 프록시

advice라는 추상화를 도입하여, jdk 동적 프록시나 cglib를 호출한다.

adviceInvocationHandler,

adviceMethodIntercepter을 스프링에서 제공하고, 해당 객체가 advice를 호출한다.

ProxyFactory를 사용하여,

생성한 advice를 추가해주면 된다.

proxyFactory.setProxyTargetClass(true);

→ 무조건 cglib를 사용하기

스프링 부트는 기본적으로 cglib를 사용하여 프록시를 생성한다.

'공부기록 > 인터넷 강의' 카테고리의 다른 글

mvc2편 및 고급편  (0) 2022.02.20
프록시를 사용할때 자주보는 문제  (0) 2022.02.20
템플릿 메서드 패턴과 전략, 콜백  (0) 2022.02.06
RestFul  (0) 2021.11.20
생활코딩 OAuth 정리  (0) 2021.10.26