섹션 3 : 스프링 부트와 내장 톰캣

최용석·2023년 12월 22일
post-thumbnail

META-INF / MANIFEST.MF

Manifest-Version: 1.0
Main-Class: hello.embed.EmbedTomcatSpringMain

실행할 main() 메서드의 클래스를 지정해주어야 한다.

FatJar

WAR 파일

  • WEB-INF
    • classes
      • hello/servlet/TestServlet.class
    • lib
      • jakarta.servlet-api-6.0.0.jar
    • index.html

WAR는 분명 내부에 라이브러리 역할을 하는 jar 파일을 포함하고 있다.
하지만 JAR 파일은 jar파일을 포함할 수 없어서, 라이브러리 역할을 하는 jar 파일도 항상 함께 가지고 다녀야 한다.

Jar 안에는 여러 클래스를 포함할 수 있다는 점을 이용하여, 라이브러리에 사용되는 class들을 뽑아서 새로 만드는 jar에 포함하여 만들 수 있다. 이를 Fat Jar라고 부른다.

단점

  • 파일명 중복을 해결할 수 없다.
  • 모두 class로 풀려있어서 어떤 라이브러리가 포함되어 있는지 알기 어렵다.

실행 가능 Jar

jar 내부에 jar를 포함할 수 있는 특별한 구조의 jar를 만들고, 내부 jar를 포함하여 실행 할 수 있도록 만든 jar를 실행 가능 Jar(Executable Jar)라 한다.

실행 가능 Jar 파일

  • boot-0.0.1-SNAPSHOT.jar
    • META-INF
      • MANIFEST.MF
    • org/springframework/boot/loader
      • JarLauncher.class : 스프링 부트 main() 실행 클래스
    • BOOT-INF
      • classes : 우리가 개발한 class 파일과 리소스 파일
        • hello/boot/BootApplication.class
        • hello/boot/controller/HelloController.class
        • ...
      • lib : 외부 라이브러리
        • spring-webmvc-6.0.4.jar
        • tomcat-embed-core-10.1.5.jar
        • ...
      • classpath.idx : 외부 라이브러리 모음
      • layers.idx : 스프링 부트 구조 정보

META-INF/MANIFEST.MF

Manifest-Version: 1.0
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: hello.boot.BootApplication
Spring-Boot-Version: 3.0.2
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Build-Jdk-Spec: 17

실행 과정 정리
  1. java -jar xxx.jar
  2. MANIFEST.MF 인식
  3. JarLauncher.main() 실행
    • BOOT-INF/classes/ 인식
    • BOOT-INF/lib/ 인식
  4. BootApplication.main() 실행

참고

실행 가능 Jar가 아니라, IDE에서 직접 실행할 때는 BootApplication.main() 을 바로 실행한다. IDE가 필요한 라이브러리를 모두 인식할 수 있게 도와주기 때문에 JarLauncher가 필요하지 않다

profile
호기심이 많은 백엔드 개발자

0개의 댓글