목차
Proxy 패턴
기능을 수행하는 실제 객체 대신 가상의 객체(Proxy) 를 생성해 로직의 흐름을 제어 하는 방법
- Proxy 는 사전적인 의미로 대리자, 대변인의 의미를 갖고 있다.
- 프로그램 로직 실행시 실제 객체 대신 Proxy 객체에 로직을 대신 맡기게 된다.(객체의 접근을 제어한다.)
- 실제 객체 생성을 해당 객체를 사용하기 전 시점까지 미룰 수 있는 장점이 있다.(lazy-loading 가능)
Repository
Repository 인터페이스
public interface OrderRepositoryV1 { void save(String itemId); }
|
Repository 구현 클래스
public class OrderRepositoryV1Impl implements OrderRepositoryV1{ @Override public void save(String itemId) { if(itemId.equals("ex")){ throw new IllegalStateException("예외 발생!"); } sleep(1000); }
private void sleep(int millis) { try { Thread.sleep(millis); }catch (InterruptedException ex){ ex.printStackTrace(); } } }
|
Service
Service 인터페이스
public interface OrderServiceV1 { void orderItem(String itemId); }
|
Service 구현 클래스
public class OrderServiceV1Impl implements OrderServiceV1{
private final OrderRepositoryV1 orderRepository;
public OrderServiceV1Impl(OrderRepositoryV1 orderRepositoryV1) { this.orderRepository = orderRepositoryV1; }
@Override public void orderItem(String itemId) { orderRepository.save(itemId); } }
|
Controller
Controller 인터페이스
@RequestMapping @ResponseBody public interface OrderControllerV1 {
@GetMapping("/v1/request") String request(@RequestParam("itemId") String itemId);
@GetMapping("/v1/no-log") String noLog(); }
|
Controller 구현 클래스
public class OrderControllerV1Impl implements OrderControllerV1{
private final OrderServiceV1 orderService;
public OrderControllerV1Impl(OrderServiceV1 orderService) { this.orderService = orderService; }
@Override public String request(String itemId) { orderService.orderItem(itemId); return "ok"; }
@Override public String noLog() { return "ok"; } }
|
Bean 등록
@Configuration public class AppV1Config {
@Bean public OrderControllerV1 orderControllerV1(){ return new OrderControllerV1Impl(orderServiceV1()); } @Bean public OrderServiceV1 orderServiceV1(){ return new OrderServiceV1Impl(orderRepositoryV1()); } @Bean public OrderRepositoryV1 orderRepositoryV1(){ return new OrderRepositoryV1Impl(); } }
|
@Import(AppV1Config.class) @SpringBootApplication(scanBasePackages = "hello.proxy.app") public class ProxyApplication {
public static void main(String[] args) { SpringApplication.run(ProxyApplication.class, args); } }
|