yoncho`s blog
[JAR/ WAR] 설명, 그리고 ..[더보기] 본문
목차 :
1. jar
2. war
JAR (*Spring Boot 배포 방식)
JAR는 Java ARchive로 Spring Boot에서 주로 사용한다.
Spring Boot는 Spring Application을 JAR파일로 패키징하여 내장된 Web Server (Embedded Tomcat)를 사용해 실행한다.
Java Class File, Library, Resources, META data 및 기타 File을 포함해 일반적인 아카이브 파일 형식이다. 위 그림(1) 처럼 jar는 BOOT-INF, META-INF, org 총 3개의 폴더로 구성된다.
.jar 파일은 여러 파일이 포함된 단일 파일이며 파일들은 모두 컴파일된 .class 파일이다.
.jar 파일은 (1) 외부 class 역할로 기능 수행, (2) 하나의 Application으로 실행 가능
(1),(2) 처럼 이용할 수 있다.
BOOT-INF :
개발자가 직접 작성한 Classes와 의존성(Dependency) 주입을 통한 jar파일(Library)들로 구성된다.
BOOT-INF에는 classpath.idx라는 파일이 포함되어있는데. 이 파일은 classpath(src/main/resource)에 추가될 jar 파일들의 목록(library 폴더 안에 있는 jar 파일)을 정의한 것이다.
이는 Spring Boot가 JAR 파일의 중첩 JAR 구조를 지원하지 않는 단점을 보완한 것이다.
META-INF :
.jar 파일에 항상 META-INF 폴더가 포함되며, 메타데이터가 저장되는 경로이다.
폴더 안에 생성된 MANIFEST.MF라는 파일에는 패키지 관련 데이터 정의에 중요한 Key/Value 데이터를 포함한다.
이외에도 jar파일과 파일에 포함한 클래스 메타데이터를 보관하고 출처 추적, 변조 방지, 실행 가능한 jar에 필요한 추가 정보 제공 한다.
*MANIFEST.MF
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.3.4.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
일반적인 JAR 파일 MANIFEST.MF의 Main-Class는 Main method가 존재하는 클래스로 설정되지만,
Spring Boot의 MANIFEST.MF의 Main-Class에는 JarLauncher (*WAR에는 WarLauncher) class로 설정되어있다.
*JarLauncher를 통한 JAR 실행 순서
1) org.springframework.boot.loader.jar.JarFile : 내장 jar 인식
2) org.springframework.boot.loader.Launcher 실행
3) Start-Class에 선언된 Class의 Main method 실행 (com.example.test.TestApplication)
org :
Spring Boot MANIFEST.MF의 Main-Class에 선언된 loader classes 모듈이 저장되어있다.
WAR (*전통적인 Spring Application/Sprinv MVC Web Application 배포방식)
WAR는 Web application ARchive로 이름 그대로 Web Application 배포를 위한 아카이브 파일 형식이다.
전통적인 Spring Application/ MVC Web Application 을 WAR 파일로 패키징하여 Web Application Server(WAS: Apache Tomcat, Jetty)에 배포한다.
WAR 파일에는 'web.xml'이 포함되어 Servlet 등을 구성하는 전통적인 Web Application Style에 맞게 사용한다.
위 그림(2) 처럼 war는 WEB-INF, META-INF,org 총 3개의 폴더로 구성된다.
*jar와의 차이는 BOOT-INF 대신 WEB-INF 가 있으며 이는 web application 의 사전 정의 구조를 따르기 위함이다.
WEB-INF :
개발자가 직접 입력한 class, jar 파일, JSP일 경우 view 파일 전부 포함하는 디렉터리로
Tomcat에서 설명하는 기본 디렉터리 구조와 매우 유사하며 이는 곧 web application의 사전 정의 구조를 따르고 있음을 알 수 있다. 이렇기 때문에 외부WAS나 JSP를 사용해야하는 상황에 WAR를 이용해 배포한다.
META-INF :
JAR 파일과 동일하게 MAINFEST.MF 파일을 확인할 수 있다.
*META-INF와 관련해서 SpringBoot의 war는 단독으로 실행할 수 있다. (단, bootWar로 빌드했을 때)
그 이유는 Main-Class에 Spring loader가 설정되어있기 때문이다.
*MANIFEST.MF
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.3.4.RELEASE
Main-Class: org.springframework.boot.loader.WarLauncher
결론
JAR/WAR 파일은 패키징 하는 방법에 차이가 있을 뿐, 뭘 사용해야할지는 파일 구성과 개발자의 판단에 따른다.
꼭 WAR를 사용해야하는 경우는 (1) JSP로 view file을 구성한 경우/ (2) 외장 WAS(Apache Tomcat)를 이용할 계획
위 두가지 이다.
참고 :
https://zepinos.tistory.com/87
https://hye0-log.tistory.com/27
'기술, 나의 공부를 공유합니다. > [Web][BE] JAVA' 카테고리의 다른 글
[JDBC, JPA, MyBatis] JAVA 기반 DB 연결 (0) | 2023.11.08 |
---|---|
[JavaScript] Prototype (*JS에서 Class처럼 사용됨) (1) | 2023.10.18 |
[Spring Configuration] 설정 파일 변화 ( .xml -> .java -> .yml ) (0) | 2023.10.14 |
[Plugin Setting & Jenkins Build] 배포 준비 과정 (0) | 2023.10.11 |
[Spring MVC] Global Exception Handler (@ControllerAdvice, @ExceptionHandler) (1) | 2023.10.10 |