Spring 핵심원리 고급편 - Proxy 패턴 인터페이스와 구체 클래스

목차

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);
}
}
Share