【Java】 Spring DI의 구조

11573 단어 자바spring-boot

Spring DI 컨테이너 기능


  • 응용 프로그램 시작시 진입 점 필요
  • Java에서는 Main 메소드가 기동하는 엔트리 포인트가된다.
  • SpringBoot에서는 Main 메소드의 클래스에 @SpringBootApplication가 붙어 있다
  • Spring 런타임은 시작시이 주석이있는 패키지 아래의 모든 클래스를 확인합니다.
  • @Bean (그리고 그 파생 클래스, @Component
  • 검출한 메소드에 @RestController 등이 붙어 있으면 여기를 엔드 포인트로서,”/“의 URL(=8080)에 청취
  • 거기에서 오는 요청을 URL의 내용에 따라 등록한 컨트롤러로 자동으로 나눕니다
  • Spring Web이 선택되면, DI 컨테이너에 등록 된 Bean에서 @Service이 부여 된 클래스를 찾아 @GetMapping 등이 부여 된 메소드를 엔드 포인트로 만듭니다.

    @RestController

    라우팅의 메커니즘에 대해


  • 다음 예제에서 DemoApplication과 SampleApplication은 Bean으로 등록되며 두 가지 모두 라우팅됩니다.
    Project Root
    └─src
        └─ main
            └─ java  
                └─ com.example
                    └─ demo
                        └─DemoApplication
                        └─SampleApplication
    

    실패 예


  • DemoApplication과 SampleApplication 모두 "/"를 지정하면 SampleApplication이 우선합니다.

  • @GetMapping

    DemoApplicaton.java
    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class DemoApplication {
    
        @RequestMapping("/") //どこのアドレスからとってくるか、”/“はhttp://localhost:8080/を指す
        String index(){
            return "Hello World!";
        }
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    SampleApplicaton.java
    package com.example.hoge;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @Controller
    public class SampleController {
        @RequestMapping(value = "/", method = RequestMethod.GET)
        //URLのrootに対してリクエストが来たら受け取る
        //DemoApplication とルート(=8080)が被っている
        public String index(Model model) {
            model.addAttribute("message", "Hello World!!");
            return "index";
        }
    }
    

    라우팅 메커니즘


  • SampleController.java를 com.example.hoge로 이동 → SampleController는 라우팅 대상에서 제외됩니다!
  • Project Root
    └─src
        └─ main
            └─ java  
                └─ com.example
                    └─ demo
                        └─DemoApplication
                    └─ hoge
                        └─SampleApplication
    
  • “/“를/hoge로 해준다→패스가
  • DemoApplication.java 실행> Hello World!


  • DemoApplication.java
    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class DemoApplication {
    
        @RequestMapping("/hoge")
        String index(){
            return "Hello World!";
        }
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    
  • SampleController의 "/"를 "/bar"로 변경

  • @SpringBootApplication 방문

  • http://localhost:8080/hoge/ 패키지 아래의 모든 클래스를 확인할 수 없습니다! DI 컨테이너에 등록할 수 없습니다!
    > Whitelabel Error Page



  • SampleApplicaton.java
    package com.example.hoge;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @Controller
    public class SampleController {
        @RequestMapping(value = "/bar", method = RequestMethod.GET)
        public String index(Model model) {
            model.addAttribute("message", "Hello World!!");
            return "index";
        }
    }
    

    좋은 웹페이지 즐겨찾기