SPRING/Spring Boot

[SpringBoot] 내장톰캣에서 Spring Boot클래스 만들기

IT록흐 2023. 4. 2. 17:54
반응형
 

[SpringBoot] Main클래스에서 내장톰캣 실행시키기

[SpringBoot] 외장톰캣에서 SpringMVC 구현하기 [SpringBoot] 외장톰캣으로 WAS 띄우기 with IntelliJ(무료버전) SpringBoot는 내장톰캣을 사용한다. SpringBoot가 내장톰캣을 사용하면서 간편해진 점을 알아보기 위

lordofkangs.tistory.com

 

 

지난 포스팅에서는

내장톰캣을 활용하여 서블릿 하나를 띄어보았다.

 

 

이번에는

 SpringMVC가 적용된 Spring Boot클래스를 만들어보겠다.

 

 

 

1. 어노테이션 만들기 

import org.springframework.context.annotation.ComponentScan;
import java.lang.annotation.*;

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

 

MySpringBootApplication이라는 어노테이션 하나를 생성한다. @Target, @Retention, @Documented, @ComponentScan은 @Configuration을 참고해서 가져왔다. 

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration { 
			// 중략 ... 
}

 

 

둘의 차이는 @ComponentScan과 @Component이다. MySpringBootApplication 어노테이션은 가장 상위디렉토리에 위치할 것이다. 거기서 컴포넌트를 스캔하여 Bean으로 등록하는 역할을 수행한다. 

 

 

2. Boot클래스 만들기 

import hello.boot.MySpringApplication;
import hello.boot.MySpringBootApplication;

@MySpringBootApplication // @ComponentScan 기능을 사용
public class MySpringBootMain {

    public static void main(String[] args) {
        System.out.println("MySpringBootMain.main");
        MySpringApplication.run(MySpringBootMain.class,args); //내장톰캣 설정및실행 클래스
    }
    
}

 

MySpringBootMain 클래스는 Spring Boot클래스로 사용하고 싶은 내장톰캣 설정및실행 클래스를 하나 가져와 run 한다. 해당 클래스는 위에서 만든 @MySpringBootApplication을 어노테이션으로 갖는다. 그러므로 가장 상위디렉토리에 위치해야 최대한 많은 Component를 스캔할 수 있다. 

 

그리고 이를 MySpringApplication.run 메소드의 파라미터로 넘긴다. 

 

MySpringApplication.run(MySpringBootMain.class,args);

 

실제 설정이 이루어지는 MySpringApplication 클래스에서  SpringContainer에 등록하여 컴포넌트 스캔을 하기 위함이다. 

 

3.  내장톰캣 설정및실행 클래스 만들기

 

MySpringApplication.java

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import java.util.List;

public class MySpringApplication {

    public static void run(Class configClass, String[] args)  {

        System.out.println("MySpringApplication.main args =  " + List.of(args));
        
        //Tomcat 설정, 별도의 톰캣 설치없이 JAVA코드로 가능
        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"); // url이 /로 들어오면 dispacher 서블릿으로 빠지도록 설정.

		//톰캣 수행
        try {
            tomcat.start();
        } catch (LifecycleException e) {
            throw new RuntimeException(e);
        }
    }
}

 

 

톰캣을 설정하고 스프링컨테이너 생성시, 파라미터로 받은 MySpringBootMain 클래스를 스프링컨테이너 설정파일로 등록한다. 컴포넌트 스캔 기능을 가진 가장 상위디렉터로이 위치한 클래스이므로 하위디렉토리의 Bean을 등록할 수 있다.

 

HelloController.java

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello-spring")
    public String hello() {
        System.out.println("HelloController.hello");
        return "hello spring!";
    }
}

 

@RestController로 등록된 HelloController는 컴포넌트 스캔과정에서 Bean으로 등록된다. 

 

다시 MySpringApplication 클래스로 돌아가서,

SpringMVC 구조에서 빠질 수 없는 DispatcherServlet을 생성하고 SpringContainer를 등록한다. 그리고 DispacherServlet을 톰캣 ServletContext에 추가하고 url 매핑을 해주면 모든 설정이 완료된다. 

 

 

이제 MySpringBootMain 클래스로 돌아가서 Main함수를 실행시켜보자.

 

 

결과 

 

 

정리하면,

 

 

 

 

컴포넌트 스캔 기능을 가진 MySpringBootMain를 생성한다. 그리고 MySpringBootMain는 MySpringApplication을 호출한다. MySpringApplication은 스프링설정파일을 스프링컨테이너에 등록하고 스프링컨테이너를 DispatcherServlet에 등록하고 DispatcherServlet을 내장톰캣에 등록한 뒤 내장톰캣을 실행하는 역할을 한다.

 

이러한 일련의 과정이 단순히 main 메소드 실행 한번으로 이루어졌다. 외장톰캣에 소스를 war로 압축 및 배포한 후 따로 서버를 실행시키는 과정없이,  단순히 JAVA 코드로만 전과정이 구현되었다. 하지만 이런 Spring과 내장톰캣을 설정하는 과정도 다소 복잡한 감이 있다. 그러므로 다음 포스팅에서는 이런 과정도 필요없는 방법을 알아보도록 하겠다. 

 

 


 

참고자료

 

스프링 부트 - 핵심 원리와 활용 - 인프런 | 강의

실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., - 강의 소개 | 인프런

www.inflearn.com

 

 

반응형