[스프링 핵심 원리와 활용] #4. 스프링 부트와 내장 톰캣 #821
Develop-KIM
started this conversation in
동환
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
스프링 부트와 웹 서버 - 프로젝트 생성
스프링 부트는 지금까지 고민한 문제를 깔끔하게 해결해준다.
의존성 추가
Spring Web테스트 컨트롤러 생성
HelloController내장 톰캣 의존관계 확인

spring-boot-starter-web를 사용하면 내부에서 내장 톰캣을 사용tomcat-embed-core)이 포함된 것을 확인할 수 있다.라이브러리 버전
groovy스프링 부트와 웹 서버 - 실행 과정
스프링 부트의 실행 과정
main()메서드에서SpringApplication.run()을 호출해주면 된다.@SpringBootApplication애노테이션이 있는 현재 클래스를 지정해주면 된다.이 단순해 보이는 코드 한줄 안에서는 수 많은 일들이 발생하지만 핵심은 2가지다.
스프링 부트 내부에서 스프링 컨테이너를 생성하는 코드
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContextFactorynew AnnotationConfigServletWebServerApplicationContext()이 부분이 바로 스프링부트가 생성하는 스프링 컨테이너이다.스프링 부트 내부에서 내장 톰캣을 생성하는 코드
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactoryTomcat tomcat = new Tomcat()으로 내장 톰캣을 생성한다.스프링 부트와 웹 서버 - 빌드와 배포
jar 빌드
./gradlew clean build다음 위치에
jar파일이 생성됨build/libs/boot-0.0.1-SNAPSHOT.jarjar 파일 실행
jar파일이 있는 폴더로 이동한 후에 다음 명령어로jar파일을 실행해보자.java -jar boot-0.0.1-SNAPSHOT.jar스프링 부트 jar 분석
boot-0.0.1-SNAPSHOT.jar파일 크기를 보면 대략18M정도 된다.jar 압축 풀기
build/libs폴더로 이동jar -xvf boot-0.0.1-SNAPSHOT.jarJAR를 푼 결과
boot-0.0.1-SNAPSHOT.jarMETA-INFMANIFEST.MForg/springframework/boot/loaderJarLauncher.class: 스프링 부트main()실행 클래스BOOT-INFclasses: 우리가 개발한 class 파일과 리소스 파일hello/boot/BootApplication.classhello/boot/controller/HelloController.classlib: 외부 라이브러리spring-webmvc-6.0.4.jartomcat-embed-core-10.1.5.jarclasspath.idx: 외부 라이브러리 경로layers.idx: 스프링 부트 구조 경로스프링 부트 실행 가능 Jar
Fat Jar는 하나의 Jar 파일에 라이브러리의 클래스와 리소스를 모두 포함했다.
Fat Jar의 문제점
Fat Jar의 단점
class로 풀려있으니 어떤 라이브러리가 사용되고 있는지 추적하기 어렵다.예시) 서블릿 컨테이너 초기화에서 학습한 부분을 떠올려 보자.
META-INF/services/jakarta.servlet.ServletContainerInitializer이 파일이 여러 라이브러리(jar)에 있을 수 있다.A라이브러리와B라이브러리 둘다 해당 파일을 사용해서 서블릿 컨테이너 초기화를 시도한다. 둘다 해당 파일을jar안에 포함한다.Fat Jar를 만들면 파일명이 같으므로A,B둘중 하나의 파일만 선택된다. 결과적으로 나머지는 정상 동작하지 않는다.실행 가능 Jar
스프링 부트는 이런 문제를 해결하기 위해 jar 내부에 jar를 포함할 수 있는 특별한 구조의 jar를 만들고
동시에 만든 jar를 내부 jar를 포함해서 실행할 수 있게 했다. 이것을 실행 가능 Jar(Executable Jar)라 한다.
이 실행 가능 Jar를 사용하면 다음 문제들을 깔끔하게 해결할 수 있다.
예시1)
문제: 어떤 라이브러리가 포함되어 있는지 확인하기 어렵다.
해결: jar 내부에 jar를 포함하기 때문에 어떤 라이브러리가 포함되어 있는지 쉽게 확인할 수 있다.
예시2)
문제: 파일명 중복을 해결할 수 없다.
해결: jar 내부에 jar를 포함하기 때문에
a.jar,b.jar내부에 같은 경로의 파일이 있어도 둘다 인식할 수 있다.참고로 실행 가능 Jar는 자바 표준은 아니고, 스프링 부트에서 새롭게 정의한 것
실행 가능 Jar 내부 구조
boot-0.0.1-SNAPSHOT.jarMETA-INFMANIFEST.MForg/springframework/boot/loaderJarLauncher.class: 스프링 부트main()실행 클래스BOOT-INFclasses: 우리가 개발한 class 파일과 리소스 파일hello/boot/BootApplication.classhello/boot/controller/HelloController.classlib: 외부 라이브러리spring-webmvc-6.0.4.jartomcat-embed-core-10.1.5.jarclasspath.idx: 외부 라이브러리 모음layers.idx: 스프링 부트 구조 정보Jar 실행 정보
java -jar xxx.jar를 실행하게 되면 우선META-INF/MANIFEST.MF파일을 찾는다. 그리고 여기에 있는Main-Class를 읽어서main()메서드를 실행하게 된다. 스프링 부트가 만든MANIFEST.MF를 확인해보자.META-INF/MANIFEST.MFMain-Classmain()이 있는hello.boot.BootApplication이 아니라JarLauncher라는 전혀 다른 클래스를 실행하고 있다.JarLauncher는 스프링 부트가 빌드시에 넣어준다.org/springframework/boot/loader/JarLauncher에 실제로 포함되어 있다.바로
JarLauncher가 이런 일을 처리해준다. 이런 작업을 먼저 처리한 다음Start-Class:에 지정된main()을 호출한다.Start-Class: 우리가 기대한main()이 있는hello.boot.BootApplication가 적혀있다.Spring-Boot-Version: 스프링 부트 버전Spring-Boot-Classes: 개발한 클래스 경로Spring-Boot-Lib: 라이브러리 경로Spring-Boot-Classpath-Index: 외부 라이브러리 모음Spring-Boot-Layers-Index: 스프링 부트 구조 정보Main-Class를 제외한 나머지는 자바 표준이 아니다. 스프링 부트가 임의로 사용하는 정보이다.스프링 부트 로더
org/springframework/boot/loader하위에 있는 클래스들이다.JarLauncher를 포함한 스프링 부트가 제공하는 실행 가능 Jar를 실제로 구동시키는 클래스들이 포함되어 있다.스프링 부트는 빌드시에 이 클래스들을 포함해서 만들어준다.
BOOT-INF
classes: 우리가 개발한 class 파일과 리소스 파일lib: 외부 라이브러리classpath.idx: 외부 라이브러리 모음layers.idx: 스프링 부트 구조 정보WEB-INF라는 내부 폴더에 사용자 클래스와 라이브러리를 포함하고 있는데, 실행 가능 Jar도 그 구조를 본따서 만들었다.JarLauncher를 통해서 여기에 있는classes와lib에 있는 jar 파일들을 읽어들인다.실행 과정 정리
java -jar xxx.jarMANIFEST.MF인식JarLauncher.main()실행BOOT-INF/classes/인식BOOT-INF/lib/인식BootApplication.main()실행Beta Was this translation helpful? Give feedback.
All reactions