본문 바로가기

💙 Spring

⚱️ JAR와 WAR의 차이(+EAR)

👩🏻‍💻 'Spring Boot는 JAR 파일로, Spring Framework는 WAR 파일로 배포한다.' 마치 프레임워크별로 정해진 관행(?)처럼 간주되는 이 내용에 대해, 정확히 어떤 이유로부터 파생된 결론인지 궁금해졌다. 관련 내용을 찾아보고 핵심 내용을 간추려 정리해보려고 한다.

[목차]
1. JAR와 WAR의 개념 및 장단점
2. JAR와 WAR의 공통점과 차이점
3. Spring Boot에서의 JAR와 WAR
4. JAR와 WAR 선택 시 고려할 요소들
5. 함께 자주 나오는 EAR

 

 

1. JAR와 WAR의 개념 및 장단점

 

1. JAR(Java Archive)

✅ .jar 확장자 파일.

Java 프로그램의 실행에 필요한 Class 파일 및 각 Class들이 사용하는 관련 리소스 파일과 메타 데이터, 설정 파일, 라이브러리 파일 등이 .zip 파일 포맷으로 압축되어 있는 아카이브.

  • JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일.
  • 플랫폼에 귀속되는 점만 제외하면 Window의 .zip 파일과 동일한 구조.
  • Maven이나 Gradle을 통해 내려받는 라이브러리들은 Class 파일들이 묶인 .jar 파일로 구성되어 있는 것을 확인할 수 있는데, Class 파일들이 묶인 .jar 파일을 가져와서 그 안에 있는 서비스를 이용하는 것.

Java로 작성한 어플리케이션을 배포할 때에 관련 파일을 1개에 패키징할 때에 이용되고, 실제로 많은 Class 라이브러리가 이 형식으로 배포되고 있음.

✅ 원하는 구조로 구성 가능하며, JDK(Java Development Kit)에 포함된 JRE(Java Runtime Environment)만 있어도 실행 가능.

<!-- java 프로젝트 실행 명령어 -->
java -jar {project_name}.jar

✅ 장점

  • 독립적인 Java 애플리케이션을 패키징할 수 있고, 실행 가능한 JAR 파일로 만들어서 개발자가 쉽게 애플리케이션 실행 가능.
  • 압축된 형식으로 클래스, 리소스, 라이브러리 등을 포함하므로 배포와 전달이 용이.
  • Java 애플리케이션의 진입점인 main 메서드를 포함하고 있어 JVM에서 직접 실행하므로 별도의 웹 컨테이너나 서버 필요 없음.

✅ 단점

  • 웹 애플리케이션을 개발할 때는 WAR 파일에 비해 제약사항이 있음.
    • ex. JSP나 Servlet 컨테이너에 대한 표준 기능을 활용하기 어려움.
  • 웹 애플리케이션에서 동적인 웹 컨텐츠 생성 및 관리가 제한적.

 

2. WAR( Web applicaton Archive)

✅ .war 확장자 파일.

✅ Java의 Web 어플리케이션으로 이용되는 클래스 파일(servlet), 설정 파일(xml), JSP나 HTML 파일, JAR 형식의 라이브러리 등이 압축되어 있는 아카이브.

  • JSP나 Servlet 등 WAS 컨테이너 위에서 동작하게끔 빌드된, 웹 어플리케이션(Web Application) 압축 파일 포맷.
  • JSP, Servlet, JAR, Class, XML, HTML, Javascript 등 Servlet Context 관련 파일들로 패키징되어 있음.
  • 웹 응용 프로그램를 위한 포맷이기 때문에 웹 관련 자원만 포함하고 있으며, 이를 사용하여 웹 어플리케이션을 쉽게 배포하고 테스트 할 수 있음.
  • JAR 파일의 일종, 즉 웹 어플리케이션 전체를 패키징하기 위한 JAR 파일.
  • Tomcat, Jetty, Java EE server(JBoss or Glassfish) 같은 별도의 웹서버(WEB) 또는 웹컨테이너(WAS) 환경에서 사용되기 위해 고안됨.

✅ 웹 어플리케이션 설정에 대한 정의 파일 web.xml이 포함되어 Tomcat 등의 애플리케이션 서버에 WAR 파일을 배포할 경우, WAS가 동작할 때 web.xml 파일에서 설정들을 불러와 배포됨.

  • WAR 파일을 실행하려면 반드시 Tomcat 등의 웹 서버(WEB)또는 웹 컨테이너(WAS)가 별도로 필요함.

✅ WEB-INF 및 META-INF 디렉토리로 사전 정의된 구조를 사용.

WAR 형태로 묶어 /webapps 등의 지정된 경로에 넣어주고, Tomcat 등의 웹 컨테이너(WAS)에 넣어 배포하는 방식.

✅ 장점

  • Java 웹 애플리케이션을 패키징하는 데 최적화
  • 웹 구성 요소인 JSP, Servlet, 필터, 리스너 등과 웹 애플리케이션을 실행하기 위한 Servlet 컨테이너(웹 컨테이너)에서 필요한 설정 파일, 라이브러리, 리소스 등을 포함하여 한 번에 배포 및 실행 가능.
  • 웹 컨테이너(Servlet 컨테이너)를 통해 애플리케이션을 실행하므로 다양한 웹 기능과 서버 환경 활용 가능.

✅ 단점

  • 웹 컨테이너나 서버에 종속적이기 때문에 특정한 웹 컨테이너 환경이 필요.
  • 배포 및 전달에 있어서 JAR 파일에 비해 크기가 크고 번거로울 수 있음.



2. JAR와 WAR의 공통점과 차이점

 

1. 공통점

✅  JAR와 WAR 모두 JAVA의 JAR 툴을 이용하여 생성된 압축(아카이브) 파일.

✅  어플리케이션을 쉽게 배포하고 동작시킬 수 있도록 있도록 관련 파일(리소스, 속성 파일 등)들을 패키징해주는 역할.

2. 차이점

✅ 디렉토리 구조 비교

  • JAR 실행 파일 구조
    • Spring Boot 공식 문서에서 소개하는 JAR 실행 파일은 아래와 같이 META-INF, org, BOOT-INF 3개의 폴더로 구성됨.

    • BOOT-INF
      • 개발자가 직접 작성한 클래스 파일들(classes)과, 의존성 주입을 통한 jar 파일(lib)들로 구성.
      • 그림에는 없지만 classpath.idx라는 파일도 포함되어 있는데, 이는 classpath에 추가될 jar 파일들의 목록(lib 폴더 안에 있는 jar 파일)을 정의한 것.
        • "일반적인 JAR 파일은 중첩된 JAR 구조를 지원하지 않는다."는 단점을 보완하기 위해 스프링 부트가 고안해 낸 방법으로, jar 파일 리스트를 확인하여 중첩된 JAR 구조를 지원할 수 있도록 함.
  • META-INF
    • 프로젝트 매니페스트 파일(MANIFEST.MF)을 포함하는 폴더
    • 파일 그룹을 위한 메타데이터(이름, 버전 번호, 라이선스, 프로그램의 구성 등)를 포함하는 파일.
    • 일반적인 JAR File의 MANIFEST에서 Main-Class는 Main 메서드가 존재하는 클래스로 설정되지만, Spring Boot의 Main-Class에서는 JarLauncher라는 클래스로 설정되어 있음.
  • org
    • org 폴더 안에는 위에서 설명한 Spring Boot loader classes 모듈이 저장되어 있음.
💬 JarLauncher를 통한 JAR의 실행 방식
1. org.springframework.boot.loader.jar.JarFile: 내장 jar 인식
2. org.springframework.boot.loader.Launcher 실행
3. Start-Class에 선언된 클래스의 Main메서드 실행 (com.example.demo.DemoApplication)

 

  • WAR 실행 파일 구조
    • Spring Boot 공식 문서에서 소개하는 WAR 실행 파일은 아래와 같이 META-INF, org, WEB-INF 3개의 폴더로 구성됨.

    • WEB-INF
      • 개발자가 직접 입력한 class와 jar 파일, JSP일 경우 view 파일들까지 포함되어 있는 디렉터리.
      • JAR File과의 달리 BOOT-INF 대신 WEB-INF가 있는데, 웹 애플리케이션의 사전 정의된 구조를 따르기 위한 것.
        • 따라서,  외장 WAS나 JSP를 사용할 일이 있다면 WAR를 이용하여 배포해야 함.
    • META-INF
      • JAR File과 동일하게 MANIFEST.MF 파일을 확인 가능.
      • Spring Boot의 WAR는 Main-Class에 Spring loader로 설정되어 있기 때문에 단독으로 실행 가능.
      • 동작 원리는 JarLauncher와 유사.
  • org
    • JAR File과 마찬가지로 org 폴더 안에는 Spring Boot loader classes 모듈이 저장되어 있음.

 

구동 방식 비교

  • JAR는 JRE(Java Runtime Environment)만 존재하면 프로젝트 구동 가능.
  • WAR는 별도의 웹 서버(WEB) 또는 웹 컨테이너(WAS)가 있어야 프로젝트 구동 가능.

 

✅ 사용 목적 비교

  • JAR는 독립적인 실행 가능한 애플리케이션을 구성하는 것, 즉 독립적인 Java 애플리케이션을 패키징하기에 적합.
    • Java 애플리케이션 패키징은 독립적인 Java 애플리케이션을 구성하는 것을 의미.
    • 이러한 애플리케이션은 일반적으로 명령줄에서 실행되거나 특정한 환경에서 독립적으로 실행되며, 클래스 파일, 리소스, 라이브러리 등을 포함함.
  • WAR는 웹 환경에서 실행되는 애플리케이션을 구성하는 것, 즉 Java 웹 애플리케이션을 패키징하기에 적합.
    • Java 웹 애플리케이션 패키징은 Java 기반의 웹 애플리케이션을 구성하는 것을 의미.
    • 웹 애플리케이션은 사용자의 웹 브라우저를 통해 접근되고 실행되며 주로 서블릿, JSP, HTML, CSS, JavaScript 등의 웹 구성 요소와 웹 애플리케이션을 실행하기 위한 서블릿 컨테이너(웹 컨테이너)에서 필요한 설정 파일, 라이브러리, 리소스 등을 포함함.

 

✅ 요약

  • JAR와 WAR는 리소스들을 하나의 파일로 패키징하는 과정의 차이가 있는 것.
  • 배포 시 외장 WAS를 사용해야 하는 환경이라면 WAR 배포, 내장 WAS를 써야하는 환경이라면 JAR 배포를 선택.



3. Spring Boot에서의 JAR와 WAR

 

1. 개요

✅ Spring Boot 프로젝트 생성 시, JAR 또는 WAR로 패키징 방식 선택 가능.

두 방식 모두 WAS 컨테이너 위에서 동작하게 되는데, 이는 JAR파일에 WAS가 내장되어 있기 때문.

  • embedded Tomcat(내장 톰캣)이 jar에 내장된 경우, jar파일로도 빌드 가능.

따라서 Spring Boot는 기존에 Tomcat과 같은 웹 컨테이너(WAS)를 이용해야 했던 Spring보다 훨씬 간단하게 어플리케이션을 제작/배포할 수 있으나, 필요에 따라 외부 WAS를 이용해야 하는 경우에는 WAR 파일로 패키징 해야함.

  • 실무에서는 웹 서버(WEB) 또는 웹 컨테이너(WAS)가 별도로 구축되어 있는 경우가 일반적이기 때문에, WAR 파일로 패키징하여 배포를 하는 경우가 많음.

 

2. 관련 이슈 및 해결 방법

✅ JAR 배포 시 JSP 템플릿 프레임워크가 작동하지 않는 문제

  • Spring Boot 공식 문서에 따르면 JSP 프레임워크는 JAR 배포 시 작동하지 않음.
    • JSP는 일반적으로 src/main/webapp/WEB-INF/jsp에 위치하는데, .jar로 패키징하는 경우 WEB-INF라는 폴더가 생성이 되지 않아 JSP가 빌드 시에 포함되지 않는 것.

  • 이 문제는 META-INF를 이용해 해결할 수 있다!
    • META-INF는 Spring Boot에서 빌드 시 추가적으로 필요한 resource들을 담아주는 역할을 하는데, 추가적인 resource로 JSP를 넣어주면 됨.
💬 구체적인 해결 방법 단계별 정리
1. webapp 하위에 있던 WEB-INF를 복사.
2. src/main/resources/META-INF/resources/WEB-INF에 붙여 넣기.
3. webapp 하위에 있는 WEB-INF를 삭제.
4. maven 사용 시 pom.xml 설정을 진행한 후 패키징 → JSP가 .jar에 정상적으로 포함됨!

 

 

4. JAR와 WAR 선택 시 고려할 요소들

 

1. 프로젝트 유형 및 기능 요구사항

✅ 프로젝트 유형

  • 독립적인 애플리케이션인 경우 JAR 파일이 적합하고, 웹 애플리케이션인 경우 WAR 파일이 적합함.

✅ 기능 요구사항

  • JAR 파일은 일반적인 Java 애플리케이션에 적합하며, 독립적으로 실행 가능한 형태로 개발자가 애플리케이션을 실행하고 테스트 가능하나, WAR 파일은 웹 애플리케이션의 웹 구성 요소(서블릿, JSP 등)을 포함하므로 웹 애플리케이션 개발에 필요한 기능을 활용할 수 있음.

 

2. 배포 환경

독립적인 애플리케이션을 서버나 웹 컨테이너 없이 실행해야 한다면 JAR 파일을 선택하고, 웹 애플리케이션을 실행하기 위해 특정한 웹 컨테이너(ex. tomcat, jetty)에서 호스팅해야 한다면 WAR 파일을 선택하는 것이 적절함.

 

3. 확장성

 WAR 파일은 웹 애플리케이션의 구성 요소를 통합하여 패키징하기 때문에, 웹 컨테이너의 다양한 기능과 라이브러리를 활용할 수 있어 확장성이 높은 반면, JAR 파일은 독립적인 애플리케이션을 패키징하므로 특정한 환경에 종속되지 않고 단일 기능을 수행하는 애플리케이션을 개발하는 데 적합함.



5. 함께 자주 나오는 EAR

 

1. EAR

Enterprise Archive

✅ Java EE(Java Platform, Enterprise Edition) 기반 애플리케이션의 패키지 형식 확장자.

✅ 임의의 수의 WAR 파일이나 EJB 파일, 그리고 이러한 어플리케이션에 필요한 JAR 파일을 포함할 수 있음.

META-INF 폴더에 포함된 application.xml 파일이 필요.

 

2. JAR와 WAR와의 관계

✅ JAR와 WAR는 확장자가 EAR인 JAR 파일로 패키지 되어, Application Server에 배치됨.

파일의 크기는 EAR  >  WAR  >  JAR 순으로 정렬 가능. 

 

 

 

 

 

 

 

 

 

 

💡 참고한 링크 첨부

 

Jar, War, Ear 차이점, 공통점 등 설명

J2EE 애플리케이션에서 모듈은 기능에 따라 JAR, WAR 및 EAR로 패키지된다. JAR Java ARchive Java 프로그램의 실행에 필요한 클래스 파일이나 설정 파일이 정리되어 있는 아카이브. Java로 작성한 어플리케

www.devkuma.com

 

[Java] JAR와 WAR의 차이점

JAR와 WAR가 무엇이고 어떠한 차이점이 있을까?

velog.io

 

JAR WAR 배포 차이점과 장단점

JAR(Java ARchive)와 WAR(Web ARchive)은 Java 애플리케이션을 패키징하는 방식이다. 1. JAR(Java ARchive) 파일 1-1) 장점 독립적인 Java 애플리케이션을 패키징할 수 있고, 실행 가능한 JAR 파일로 만들어서 개발자

cocococo.tistory.com

 

[Spring Boot]배포 방법 비교 (JAR vs WAR)

스프링 부트의 장점 중 하나는 실행 가능한 JAR (Executable Jar)로 빌드하여 프로젝트를 바로 실행시킬 수 있다는 점이다. 실제로 스프링부트 관련 문서를 보다 보면 "Executable Jar"라는 단어를 많이 볼

hye0-log.tistory.com

댓글