You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
실무에서는 스프링 빈으로 등록할 클래스는 인터페이스가 있는 경우도 있고 없는 경우도 있음, 그리고 스프링 빈을 수동으로 직접 등록하는 경우도 있고, 컴포넌트 스캔으로 자동으로 등록하는 경우도 있음, 이런 다양한 케이스에 프록시를 어떻게 적용하는지 알아보기 위해 다양한 예제를 준비
v1 - 인터페이스와 구현 클래스 - 스프링 빈으로 수동 등록
지금까지 보아왔던 Controller , Service , Repository 에 인터페이스를 도입하고, 스프링 빈으로 수동 등록
packagehello.proxy.app.v1;
importorg.springframework.web.bind.annotation.*;
//@RequestMapping//스프링 @Controller 또는 @RequesetMapping이 있어야 컨트롤러로 인식//@ResponseBody@RestController//스프링은 @Controller, @RestController가 있어야 스프링 컨트롤러 인식publicinterfaceOrderControllerV1 {
@GetMapping("/v1/request")
Stringrequest(@RequestParam("itemId") StringitemId);
@GetMapping("/v1/no-log")
StringnoLog();
}
@RequestMapping : 스프링MVC는 타입에 @Controller 또는 @RequestMapping 애노테이션이 있어
야 스프링 컨트롤러로 인식, 그리고 스프링 컨트롤러로 인식해야, HTTP URL이 매핑되고 동작, 이 애노
테이션은 인터페이스에 사용해도 됨
@ResponseBody : HTTP 메시지 컨버터를 사용해서 응답한다. 이 애노테이션은 인터페이스에 사용
@RequestParam("itemId") String itemId : 인터페이스에는 @RequestParam("itemId") 의 값을 생략하면 itemId 단어를 컴파일 이후 자바 버전에 따라 인식하지 못할 수 있음, 인터페이스에서는 꼭 넣어주자. 클래스에는 생략해도 대부분 잘 지원 됨
코드를 보면 request() , noLog() 두 가지 메서드 존재, request() 는 LogTrace 를 적용할 대상이고, noLog() 는 단순히 LogTrace 를 적용하지 않을 대상
@Import(AppV1Config.class) : 클래스를 스프링 빈으로 등록, 여기서는 AppV1Config.class 를
스프링 빈으로 등록, 일반적으로 @Configuration 같은 설정 파일을 등록할 때 사용하지만, 스프링 빈을 등록할 때도 사용 가능
@SpringBootApplication(scanBasePackages = "hello.proxy.app") : @ComponentScan 의 기능과 같음, 컴포넌트 스캔을 시작할 위치를 지정, 이 값을 설정하면 해당 패키지와 그 하위 패키지를 컴포넌트 스캔, 이 값을 사용하지 않으면 ProxyApplication 이 있는 패키지와 그 하위 패키지를 스캔, 참고로 v3 에서 지금 설정한 컴포넌트 스캔 기능을 사용
스프링 3.0 수정사항
scanBasePackages 부분에서 마지막에 v3 가 붙었다. hello.proxy.app hello.proxy.app.v3 이렇게 하는 이유는 스프링 부트 3.0부터는 @Controller , @RestController 를 사용했는데, 이렇게 하면 내부에 @Component 를 가지고 있어서 컴포넌트 스캔의 대상이 됨 - 지금 처럼 컴포넌트 스캔도 되고, 빈도 수동으로 직접 등록하게 되면 스프링 컨테이너에 등록시 충돌 오류가 발생한다. 이후에 학습할 hello.proxy.app.v3 는 빈을 직접 등록하지 않고 컴포넌트 스캔을 사용하기 때문에 괜찮음
주의
강의에서는 @Configuration 을 사용한 수동 빈 등록 설정을 hello.proxy.config 위치에 두고 점진적으로 변경할 예정, 지금은 AppV1Config.class 를 @Import 를 사용해서 설정하지만 이후에 다른 것을 설정한다는 이야기
@Configuration 은 내부에 @Component 애노테이션을 포함하고 있어서 컴포넌트 스캔의 대상 따라서 컴포넌트 스캔에 의해 hello.proxy.config 위치의 설정 파일들이 스프링 빈으로 자동 등록 되지 않도록 컴포넌스 스캔의 시작 위치를scanBasePackages=hello.proxy.app 로 설정
v2 - 인터페이스 없는 구체 클래스 - 스프링 빈으로 수동 등록
이번에는 인터페이스가 없는 Controller, Service., Repository를 빈으로 등록
@RequestMapping : 스프링MVC는 타입에 @Controller 또는 @RequestMapping 애노테이션이 있어야 스프링 컨트롤러로 인식, 그리고 스프링 컨트롤러로 인식해야, HTTP URL이 매핑되고 동작
그런데 여기서는 @Controller 를 사용하지 않고, @RequestMapping 애노테이션을 사용, 그 이유는 @Controller 를 사용하면 자동 컴포넌트 스캔의 대상이 되기 때문, 여기서는 컴포넌트 스캔을 통한 자동 빈 등록이 아니라 수동 빈 등록을 하는 것이 목표
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
프록시 패턴
스프링 빈을 어떻게 등록할 것인가?? 예제는 3가지 상황
실무에서는 스프링 빈으로 등록할 클래스는 인터페이스가 있는 경우도 있고 없는 경우도 있음, 그리고 스프링 빈을 수동으로 직접 등록하는 경우도 있고, 컴포넌트 스캔으로 자동으로 등록하는 경우도 있음, 이런 다양한 케이스에 프록시를 어떻게 적용하는지 알아보기 위해 다양한 예제를 준비
v1 - 인터페이스와 구현 클래스 - 스프링 빈으로 수동 등록
적용 흐름
=> 기본 실행 : OrderControllerV1 -> request() 호출 -> OrderServiceV1 이 orderItem()이 실행 -> orderItem()은 OrderRepositoryV1의 save()를 호출하면 저장
OrderRepositoryV1 -- 상품 저장 기능을 담당하는 인터페이스
OrderRepositoryV1Impl -- 상품 저장 기능을 실제로 구현하는 클래스
OrderServiceV1 -- 주문 처리 기능을 담당하는 인터페이스
OrderServiceV1Impl -- 주문 처리 기능을 실제로 구현하는 클래스
OrderControllerV1 -- 웹 요청을 처리하는 인터페이스
@RequestMapping: 스프링MVC는 타입에@Controller또는@RequestMapping애노테이션이 있어야 스프링 컨트롤러로 인식, 그리고 스프링 컨트롤러로 인식해야, HTTP URL이 매핑되고 동작, 이 애노
테이션은 인터페이스에 사용해도 됨
@ResponseBody: HTTP 메시지 컨버터를 사용해서 응답한다. 이 애노테이션은 인터페이스에 사용@RequestParam("itemId") String itemId: 인터페이스에는@RequestParam("itemId")의 값을 생략하면 itemId 단어를 컴파일 이후 자바 버전에 따라 인식하지 못할 수 있음, 인터페이스에서는 꼭 넣어주자. 클래스에는 생략해도 대부분 잘 지원 됨OrderControllerV1Impl -- 웹 요청을 실제로 처리하는 클래스
AppV1Config
@Import(AppV1Config.class): 클래스를 스프링 빈으로 등록, 여기서는 AppV1Config.class 를스프링 빈으로 등록, 일반적으로
@Configuration같은 설정 파일을 등록할 때 사용하지만, 스프링 빈을 등록할 때도 사용 가능@SpringBootApplication(scanBasePackages = "hello.proxy.app") : @ComponentScan의 기능과 같음, 컴포넌트 스캔을 시작할 위치를 지정, 이 값을 설정하면 해당 패키지와 그 하위 패키지를 컴포넌트 스캔, 이 값을 사용하지 않으면 ProxyApplication 이 있는 패키지와 그 하위 패키지를 스캔, 참고로 v3 에서 지금 설정한 컴포넌트 스캔 기능을 사용스프링 3.0 수정사항
scanBasePackages부분에서 마지막에 v3 가 붙었다.hello.proxy.app hello.proxy.app.v3이렇게 하는 이유는 스프링 부트 3.0부터는@Controller,@RestController를 사용했는데, 이렇게 하면 내부에@Component를 가지고 있어서 컴포넌트 스캔의 대상이 됨 - 지금 처럼 컴포넌트 스캔도 되고, 빈도 수동으로 직접 등록하게 되면 스프링 컨테이너에 등록시 충돌 오류가 발생한다. 이후에 학습할hello.proxy.app.v3는 빈을 직접 등록하지 않고 컴포넌트 스캔을 사용하기 때문에 괜찮음주의
@Configuration을 사용한 수동 빈 등록 설정을hello.proxy.config위치에 두고 점진적으로 변경할 예정, 지금은 AppV1Config.class 를@Import를 사용해서 설정하지만 이후에 다른 것을 설정한다는 이야기@Configuration은 내부에@Component애노테이션을 포함하고 있어서 컴포넌트 스캔의 대상 따라서 컴포넌트 스캔에 의해hello.proxy.config위치의 설정 파일들이 스프링 빈으로 자동 등록 되지 않도록 컴포넌스 스캔의 시작 위치를scanBasePackages=hello.proxy.app로 설정v2 - 인터페이스 없는 구체 클래스 - 스프링 빈으로 수동 등록
OrderRepositoryV2
OrderServiceV2
OrderControllerV2
@RequestMapping: 스프링MVC는 타입에@Controller또는@RequestMapping애노테이션이 있어야 스프링 컨트롤러로 인식, 그리고 스프링 컨트롤러로 인식해야, HTTP URL이 매핑되고 동작@Controller를 사용하지 않고,@RequestMapping애노테이션을 사용, 그 이유는@Controller를 사용하면 자동 컴포넌트 스캔의 대상이 되기 때문, 여기서는 컴포넌트 스캔을 통한 자동 빈 등록이 아니라 수동 빈 등록을 하는 것이 목표@RequestMapping를 타입에 사용AppV2Config
ProxyApplication
예제 프로젝트 만들기 v3
OrderRepositoryV3
OrderServiceV3
OrderControllerV3
요구사항 추가
기존 요구사항
,트랜잭션 ID (DB 트랜잭션X)
예시

다음으로
패턴과 콜백 패턴도 사용했지만, 결과적으로 로그를 남기고 싶은 클래스가 수백개라면 수백개의 클래스를 모두 고쳐야 함,
기존 요구사항에 다음 요구사항이 추가
가장 어려운 문제는 원본 코드를 전혀 수정하지 않고, 로그 추적기를 도입하는 것이다. 이 문제를 해결하려면 프록시
(Proxy)의 개념을 먼저 이해해야 한다
All reactions