FireDrago
[SpringBoot] 스프링부트와 내장톰캣 본문
내장 톰캣

스프링 부트가 없던 시절, 스프링은 WAR 파일로 소스코드를 빌드했다.
WAR 파일은 애플리케이션 서버(WAS)를 별도로 설치하고,
WAS 에 WAR 파일을 직접 배포해야하는 복잡함이 있었다.
그래서 스프링부트는 애플리케이션 서버를 라이브러리로 내장하여 사용할 수 있도록 했다.
JAR 파일 형식은 WAS를 하나의 라이브러리로 포함시켜 배포한다.
덕분에 IDE에 별도의 복잡한 톰캣 설정 없이 main() 메서드만 실행하면 톰캣까지 매우 편리하게실행되었다.
스프링 부트의 실행과정
스프링 부트는 WAS를 내장하고 있다는 사실을 알게되었다.
이제 스프링 부트가 어떻게 작동하는지 간단한 코드로 알아보자
@RestController
public class HelloController {
@GetMapping("/hello-spring")
public String hello() {
System.out.println("HelloController.hello");
return "hello spring!";
}
}
간단한 컨트롤러를 만들었다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ComponentScan
public @interface MySpringbootApplication {
}
@MySpringbootApplication 어노테이션을 정의했다. @Component 스캔 기능을 수행한다.
public class MySpringApplication {
public static void run(Class configClass, String[] args) {
System.out.println("MySpringBootApplication.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);
}
}
}
파라미터로 설정 클래스를 받아서, 톰캣설정, 스프링컨테이너를 생성하여 디스패쳐 서블릿과 연결한뒤
톰캣에 서블릿으로 등록하는 코드이다.
@MySpringbootApplication
public class MySpringBootMain {
public static void main(String[] args) {
System.out.println("MySpringBootMain.main");
MySpringApplication.run(MySpringBootMain.class, args);
}
}
Application 클래스에서 @MySpringbootApplication 사용하여, 하위 패키지의 컴포넌트들을 스캔한다.
MySpringApplication.run(MySpringBootMain.class, args) : 현재 클래스 넘기고, 스프링 컨테이너를 생성한다.
내장 톰캣 실행, 스프링 컨테이너 생성, 디스패처 서블릿, 컴포넌트 스캔까지 모든 기능이 한번에 편리하게 동작한다.
스프링 부트의 편리한 점
1. 내장 톰캣을 사용해서 빌드와 배포를 편리하게 한다.
2. 빌드시 하나의 Jar를 사용하면서, 동시에 Fat Jar 문제도 해결한다.
3. 지금까지 진행한 내장 톰캣 서버를 실행하기 위한 복잡한 과정을 모두 자동으로 처리한다.
'프로그래밍 > SpringBoot' 카테고리의 다른 글
| [SSE] SseEmitter로 실시간 주문 상태 업데이트 구현하기 (3) | 2025.08.09 |
|---|---|
| [SpringBoot] 다양한 외부 설정 조회방법 (0) | 2024.05.31 |
| [SpringBoot] 외부설정 (properties) (0) | 2024.05.30 |
