Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Proxy Pattern - V2 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

Proxy Pattern - V2

Seung__ 2021. 11. 23. 21:31
  • v2 - 인터페이스 없는 구체 클래스 - 스프링 빈으로 수동 등록
  • 이번에는 인터페이스가 없는 Controller , Service , Repository 를 스프링 빈으로 수동 등록해보자.

 

 

1. OrderRepositoryV2


public class OrderRepositoryV2 {

    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 e) {
            e.printStackTrace();
        }
    }
}

 

 

 

2. OrderServiceV2


public class OrderServiceV2 {

    private final OrderRepositoryV2 orderRepository;

    public OrderServiceV2(OrderRepositoryV2 orderRepository) {
        this.orderRepository = orderRepository;
    }

    public void orderItem(String itemId) {
        orderRepository.save(itemId);
    }
}

 

 

 

3. OrderControllerV2


@Slf4j
@RequestMapping
@ResponseBody //component scan피하려고 @Conroller 안씀.
public class OrderControllerV2 {

    private final OrderServiceV2 orderService;

    public OrderControllerV2(OrderServiceV2 orderService) {
        this.orderService = orderService;
    }


    @GetMapping("/v1/request")
    public String request(String itemId) {
        orderService.orderItem(itemId);
        return "ok";
    }

    @GetMapping("/v1/no-log")
    public String noLog() {
        return "ok";
    }

}
  • @RequestMapping 
  • 스프링MVC는 타입에 @Controller 또는 @RequestMapping 애노테이션이 있어야 스프링 컨트롤러로 인식한다. 
  • 그리고 스프링 컨트롤러로 인식해야, HTTP URL이 매핑되고  동작한다. 
  • 그런데 여기서는 @Controller 를 사용하지 않고, @RequestMapping 애노테이션을 사용했다.
  • 그 이유는 @Controller 를 사용하면 자동 컴포넌트 스캔의 대상이 되기 때문이다. 
  • 여기서는 컴포넌트  스캔을 통한 자동 빈 등록이 아니라 수동 빈 등록을 하는 것이 목표다. 
  • 따라서 컴포넌트 스캔과 관계 없는  @RequestMapping 를 타입에 사용했다.

 

 

4. 스프링 빈 수동 등록


  • 메서드 명으로 등록됨
@Configuration
public class AppV2Config {

    @Bean
    public OrderControllerV2 orderControllerV2(){
        return new OrderControllerV2(orderServiceV2());
    }

    @Bean
    public OrderServiceV2 orderServiceV2(){
        return new OrderServiceV2(orderRepositoryV2());
    }

    @Bean
    public OrderRepositoryV2 orderRepositoryV2(){
        return new OrderRepositoryV2();
    }
}

 

 

5. 실행


@Import({AppV1Config.class, AppV2Config.class})
@SpringBootApplication(scanBasePackages = "hello.proxy.app") //주의
public class ProxyApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProxyApplication.class, args);
    }

}

 

 

6. GitHub :211123 Proxy 2


 

GitHub - bsh6463/Spring_Advanced_2

Contribute to bsh6463/Spring_Advanced_2 development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글

요구사항 추가  (0) 2021.11.23
Proxy Pattern - V3  (0) 2021.11.23
Proxy Pattern - V1  (0) 2021.11.23
정리 및 한계  (0) 2021.11.23
Template CallBack - 2  (0) 2021.11.22
Comments