스프링 부트(핵심 원리와 활용)

Ch02. 스프링 부트와 내장 톰캣 - 편리한 부트 클래스 만들기

webmaster 2023. 3. 5. 14:00
728x90

MySpringApplication

public class MySpringApplication {

  public static void run(Class configClass, String[] args) {
    System.out.println("MySpringApplication.run args=" + List.of(args));

    //톰켓 설정
    Tomcat tomcat = new Tomcat();
    Connector connector = new Connector();
    connector.setPort(8080);
    tomcat.setConnector(connector);

    //스프링 컨테이너 생성
    AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
    appContext.register(configClass);

    //스프링 MVC 디스패처 서블릿 생성, 스프링 컨테이너 연결
    DispatcherServlet dispatcher = new DispatcherServlet(appContext);

    //디스패처 서블릿 등록
    Context context = tomcat.addContext("", "/");
    tomcat.addServlet("", "dispatcher", dispatcher);
    context.addServletMappingDecoded("/", "dispatcher");

    try {
      tomcat.start();
    } catch (LifecycleException e) {
      throw new RuntimeException(e);
    }
  }
}
  • 기존 코드를 모아서 편리하게 사용할 수 있는 클래스를 만들었다. MySpringApplication.run() 을 실행하면 바로 작동한다.
  • configClass : 스프링 설정을 파라미터로 전달받는다.
  • args : main(args) 를 전달 받아서 사용한다. 참고로 예제에서는 단순히 해당 값을 출력한다.
  • tomcat.start() 에서 발생하는 예외는 잡아서 런타임 예외로 변경했다.

@MySpringBootApplication

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ComponentScan
public @interface MySpringBootApplication {

}
  • 컴포넌트 스캔 기능이 추가된 단순한 애노테이션이다.
  • 시작할 때 이 애노테이션을 붙여서 사용하면 된다.

HelloConfig

//@Configuration
public class HelloConfig {

    @Bean
    public HelloController helloController() {
        return new HelloController();
    }
}
  • @Configuration 을 주석처리했다.
  • 여기서는 편리하게 컴포넌트 스캔을 사용할 예정이어서 @Configuration 를 주석처리했다.

MySpringBootAppMain

@MySpringBootApplication
public class MySpringBootMain {

  public static void main(String[] args) {
    System.out.println("MySpringBootMain.main");
    MySpringApplication.run(MySpringBootMain.class, args);
  }
}
  • 패키지 위치가 중요하다. hello 에 위치했다.
  • 여기에 위치한 이유는 @MySpringBootApplication 에 컴포넌트 스캔이 추가되어 있는데, 컴포넌트 스캔의 기본 동작은 해당 애노테이션이 붙은 클래스의 현재 패키지 부터 그 하위 패키지를 컴포넌트 스캔의 대상으로 사용하기 때문이다 애노테이션이 붙은 hello.MySpringBootMain 클래스의 패키지 위치는 hello 이므로 그 하위의 hello.spring.HelloController 를 컴포넌트 스캔한다.
  • MySpringApplication.run(설정 정보, args) 이렇게 한줄로 실행하면 된다.
  • 이 기능을 사용하는 개발자는 @MySpringBootApplication 애노테이션과 MySpringApplication.run() 메서드만 기억하면 된다.
  • 이렇게 하면 내장 톰캣 실행, 스프링 컨테이너 생성, 디스패처 서블릿, 컴포넌트 스캔까지 모든 기능이 한번에 편리하게 동작한다.

스프링 부트 : 지금까지 만든 것을 라이브러리로 만들어서 배포한다면 그것이 스프링 부트이다.

일반적인 스프링 부트 사용법

스프링 부트

  • 스프링 부트는 보통 예제와 같이 SpringApplication.run() 한줄로 시작한다.
  • @SpringBootApplication 안에는 @ComponentScan을 제외한 더 많은 애노테이션이 존재한다.
728x90