Spring, Spring Boot 프로젝트 같은 JAVA 파일을 배포하려면 패키징을 해야 하는데,
보통 JAR 또는 WAR 형태로 프로젝트를 빌드하고 패키징한 후 서버에 올려 배포 한다.
이때 JAR와 WAR 2가지 형태의 파일로 배포가 가능한데, JAR와 WAR가 무엇이고 어떠한 차이점이 있는지 정리해보자.
JAR는 Java Archive의 약자이다. .jar
확장자 파일에는 Class와 같은 Java 리소스와 속성 파일이나 라이브러리 설정파일들이 압축되어 있다.
Maven 이나 Gradle을 통해 내려받는 라이브러리들은 Class 파일들이 묶인 .jar
파일로 구성되어 있는 것을 확인할 수 있는데, Class 파일들이 묶인 .jar
파일을 가져와서 그 안에 있는 서비스를 이용한다.
JAR는 간단히 JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일로 생각하면 된다. 실제로 JAR 파일은 플랫폼에 귀속되는 점만 제외하면 Window의 .zip
파일과 동일한 구조이다.
JAR 파일은 원하는 구조로 구성이 가능하며 JDK(Java Development Kit)에 포함되어 있는 JRE(Java Runtime Environment)만 가지고도 실행이 가능하다.
WAR는 Web Application Archive의 약자이다.
JSP나 Servlet 등 WAS 컨테이너 위에서 동작하게 끔 빌드된 형태이다.
웹 어플리케이션을 어떻게 설정할 지에 대한 정의가 있는 web.xml
파일을 포함하고 있다. WAS가 동작을 하면 web.xml
파일에서 설정들을 불러온다.
.war
확장자 파일은 servlet / jsp 컨테이너에 배치 할 수 있는 웹 어플리케이션(Web Application) 압축 파일 포맷이며, JSP, SERVLET, JAR, CLASS, XML, HTML, JAVASCRIPT 등 Servlet Context 관련 파일들로 패키징 되어있다.
WAR는 웹 응용 프로그램를 위한 포맷이기 때문에 웹 관련 자원만 포함하고 있으며 이를 사용하여 웹 어플리케이션을 쉽게 배포하고 테스트 할 수 있다.
원하는 구성을 할 수 있는 JAR 포맷과 달리 WAR은 WEB-INF 및 META-INF 디렉토리로 사전 정의 된 구조를 사용하며, WAR파일을 실행하려면 반드시 Tomcat 등의 웹 서버(WEB)또는 웹 컨테이너(WAS)가 별도로 필요하다.
WAR 파일도 JAVA의 JAR 옵션 java - jar
을 이용해 생성하는 JAR파일의 일종으로 웹 어플리케이션 전체를 패키징하기 위한 JAR파일로 생각하면 된다.
서비스 배포시에는 WAR 형태로 묶어 /webapps 등의 지정된 경로에 넣어주고, Tomcat 등의 웹 컨테이너(WAS)에 넣어 배포(deploy)한다.
- JAR는 JRE(Java Runtime Environment)만 존재하면 프로젝트 구동이 가능하다.
- WAR는 별도의 웹 서버(WEB) 또는 웹 컨테이너(WAS)가 있어야 프로젝트 구동이 가능하다.
JAR와 WAR 모두 JAVA의 jar툴
을 이용하여 생성된 압축(아카이브)파일이며,
어플리케이션을 쉽게 배포하고 동작시킬 수 있도록 있도록 관련 파일(리소스, 속성파일 등)들을 패키징해주는 것이 주 역할이다.
Spring Boot 프로젝트 생성시, .jar
또는 .war
로 패키징 방식을 선택할 수 있다.
두 방식 모두 WAS 컨테이너 위에서 동작하게 되는데, 이는 JAR파일에 WAS가 내장되어 있기 때문이다. embedded Tomcat(내장 톰캣)이 jar에 내장된 경우, jar파일로도 빌드가 가능하다.
따라서 Spring Boot는 기존에 Tomcat과 같은 웹 컨테이너(WAS)를 이용해야 했던 Spring 보다 훨씬 간단하게 어플리케이션을 제작/배포할 수 있다.
하지만 필요에 따라 외부 WAS를 이용해야 하는 경우, 이때는 WAR 파일로 패키징을 해야한다.
(대부분의 실무에서는 웹 서버(WEB)또는 웹 컨테이너(WAS)가 별도로 구축 되어 있기 때문에 WAR 파일로 패키징 하여 배포를 하는 경우가 많다.)
스프링부트 공식문서 (WEB - 1.1.9. Template Engines)에 따르면 JSP 프레임워크는 .jar
배포시 작동하지 않는다고 정의되어 있다.
If possible, JSPs should be avoided. There are several known limitations when using them with embedded servlet containers.
JSP는 일반적으로 src/main/webapp/WEB-INF/jsp
에 위치하는데, .jar
로 묶는(패키징 하는) 경우 WEB-INF라는 폴더가 생성이 되지 않아 JSP가 build시 포함되지 않는다.
src/main/webapp/WEB-INF/~
의 디렉토리 구조상.jar
로 빌드시 JSP를 전혀 가지고 오지 못하는 문제가 발생한다.
위 문제를 META-INF를 이용하여 해결 할 수 있다.
META-INF는 Springboot에서 빌드 시 추가적으로 필요한 resource들을 담아주는 역할을 하는데 추가적인 resource로 JSP를 넣어주면 된다.
webapp 하위에 있던 WEB-INF를 복사해서 src/main/resources/META-INF/resources/WEB-INF
에 붙여 넣는다. 그리고 webapp 하위에 있는 WEB-INF를 지워준다.
maven 사용시 pom.xml 설정을 진행한 후 패키징 해준다.
(참고 링크 - 실행가능한 Springboot 프로젝트를 다른 프로젝트에서 참조하는 방법)
설정 완료후 패키징을 하면 JSP가 .jar
에 포함되고, view도 잘 작동된다고 한다.
JAR와 WAR는 리소스들을 하나의 파일로 패키징하는 과정의 차이가 있는것이다.
배포시 외장 WAS를 사용해야 하는 환경이라면 .war
배포를, 내장 WAS를 써야하는 환경이라면 jar 배포를 하면 된다.
- WAR와 JAR 모두 압축된 아카이브 파일이다.
- WAR는 JAR이지만, JAR는 WAR가 아니다.
- WAR는 웹 어플리케이션 배포를 위해 JAR보다 특정한 디렉터리와 파일들이 필요하다.
- WAR는 'Servlet Container' 에서 사용되며, other jar files (at WEB-INF/lib directory) compiled classes (at WEB-INF/classes (servlet goes there too)) .jsp files images, files 등을 포함한다.
- WAR는 Tomcat, Jetty, Java EE server(JBoss or Glassfish) 같은 별도의 웹서버(WEB) 또는 웹컨테이너(WAS) 환경에서 사용되기 위해 고안되었다.
🌍 참고링크
The Java Archive (JAR) File Format :: Using JAR Files: The Basics
The J2EETM Tutorial :: Web Application Archives
Spring Boot Reference Documentation
[Server] JAR 와 WAR의 차이점
JAR 과 WAR의 차이는 무엇일까?