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