백엔드/Spring

[Spring] Jar & SpringBoot Jar

kwang2134 2024. 9. 28. 16:36
728x90
반응형
728x90

Jar (Java Archive)

  • Java 프로그램 및 관련 리소스를 패키징 하는 데 사용되는 파일 형식
  • Main-Class가 정의된 경우 실행 가능

일반 Jar 구조

OriginalJar.jar
│
├── META-INF
│   └── MANIFEST.MF
│
├── com
│   └── example
│       ├── MainClass.class
│       ├── HelperClass.class
│       └── resources
│           └── config.properties
│
└── images
    └── logo.png

 

Jar 단점

  • 내부에 jar 파일을 포함할 수 없음 -> 라이브러리 포함 불가능
  • 포함시킨다 해도 인식 불가
  • 내장 Tomcat 라이브러리를 가지고 빌드하여도 사용 불가능

FatJar (über JAR) - 클래스 파일 포함

  • 라이브러리에 사용되는 클래스 파일들을 포함한 jar
  • 모든 클래스 jar 파일을 풀어 Jar 파일내에 포함

FatJar 구조

FatJat.jar
│
├── META-INF
│   └── MANIFEST.MF
│       └── (Main-Class 속성이 포함)
│
├── com
│   └── example
│       ├── MainClass.class         (애플리케이션의 진입점)
│       ├── HelperClass.class       (도움 클래스)
│       └── utils
│           └── UtilityClass.class  (유틸리티 클래스)
│
├── (각종 종속성의 클래스 파일)
│   ├── org
│   │   └── springframework
│   │       ├── context
│   │       │   └── ApplicationContext.class
│   │       └── web
│   │           └── servlet
│   │               └── HttpServlet.class
│   │
│   └── (기타 라이브러리 클래스 파일)
│
├── resources
│   ├── config.properties           (설정 파일)
│   └── images
│       └── logo.png               (리소스 이미지)
│
└── (기타 리소스)

 

장점

  • 하나의 jar 파일에 필요한 라이브러리들을 내장할 수 있음
  • 내장 Tomcat 라이브러리를 포함하여 하나의 jar 파일로 배포부터, 웹 서버 설치+실행까지 모든 것을 단순화

단점

  • 모두 class로 풀려있어 어떤 라이브러리를 포함하는지 확인이 어려움
  • 파일명 중복 해결 불가능

SpringBoot Jar - 실행 가능 Jar

  • 자바 표준 Jar가 아닌 스프링 부트가 정의한 스프링 부트 특화 Jar
  • 내부에 Jar 라이브러리 파일 포함 -> 포함된 라이브러리 확인 & 파일명 중복 해결

SpringBoot Jar 구조

boot-0.0.1-SNAPSHOT.jar
│
├── META-INF
│   └── MANIFEST.MF
│
├── org/springframework/boot/loader
│   └── JarLauncher.class
│
├── BOOT-INF
│   ├── classes               (개발한 클래스 파일 및 리소스)
│   │   ├── hello/boot
│   │   │   ├── BootApplication.class  (메인 애플리케이션 클래스)
│   │   │   └── controller
│   │   │       └── HelloController.class  (컨트롤러 클래스)
│   │   └── (기타 클래스 파일)
│   │
│   └── lib                   (외부 라이브러리 JAR 파일)
│       ├── spring-webmvc-6.0.4.jar
│       ├── tomcat-embed-core-10.1.5.jar
│       └── (기타 라이브러리 JAR)
│
├── classpath.idx            (클래스 경로 인덱스)
└── layers.idx               (레이어 인덱스)

 

자바 표준 Jar & SpringBoot Jar 차이점

  자바 표준 Jar SpringBoot Jar
구조 일반적으로 클래스 파일과 리소스를 하나의 평면 구조로 포함 BOOT-INF와 META-INF 디렉토리를 포함
애플리케이션의 클래스 파일과 모든 종속성을 분리하여 저장
실행 로더 Main-Class가 정의된 경우 JVM이 이를 직접 호출하여 실행 org.springframework.boot.loader.JarLauncher를 사용하여 애플리케이션을 실행
자동 구성 자동 구성 기능은 제공 X  스프링 부트의 자동 구성 기능

 

SpringBoot Jar 실행 과정

  1. java -jar xxx.jar 실행
  2. JVM은 JAR 파일의 MANIFEST.MF 파일을 읽고 Main-Class로 지정된 org.springframework.boot.loader.JarLauncher 클래스를 로드
    • JarLauncher의 main 메서드가 호출
  3. JarLauncher는 JAR 파일의 구조를 파악
    • BOOT-INF/classes와 BOOT-INF/lib 디렉토리의 내용을 탐색
  4. JarLauncher는 스프링 부트 ClassLoader를 사용하여 애플리케이션 클래스를 로드 
    • BOOT-INF/classes 내의 클래스 파일과 BOOT-INF/lib 내의 외부 라이브러리 JAR 파일이 포함
  5. 애플리케이션의 메인 클래스에서 @SpringBootApplication 애노테이션이 붙은 메서드가 실행
    • 스프링 컨테이너가 초기화되고, 애플리케이션 컨텍스트가 생성
  6. 스프링 부트의 자동 구성 기능이 작동하여 애플리케이션에 필요한 빈을 자동으로 등록
    • @Component, @Service, @Repository 등의 애노테이션이 붙은 클래스들이 스캔 & 빈 등록
  7. 만약 애플리케이션이 웹 애플리케이션이라면 내장 Tomcat, Jetty 또는 Undertow 서버가 초기화되고 시작
  8. 애플리케이션이 실행

스프링 부트 - 핵심 원리와 활용 강의 | 김영한 - 인프런 강의 내용 참고

728x90

'백엔드 > Spring' 카테고리의 다른 글

[Spring] Actuator  (0) 2024.10.08
[Spring] Spring Boot 외부 설정  (0) 2024.10.05
[Spring] 스프링 부트  (2) 2024.09.27
[Spring] Querydsl DTO & 동적 쿼리  (1) 2024.09.26
[Spring] Querydsl  (1) 2024.09.25