거북이-https://velog.io/@violet_evgadn 이전완료

WAR와 JAR 본문

웹 개발/Spring(이론)

WAR와 JAR

VioletEvgadn 2022. 10. 17. 09:19

WAR와 JAR

WAR와 JAR의 차이점을 설명하기 앞서 이 둘이 어떤 개념인지부터 알아야 할 필요가 있다. 과연 WAR와 JAR가 무엇일까?

 

WAR(.war 파일), JAR(.jar 파일)은 모두 아카이브(압축) 파일이다. 이들은 Application을 쉽게 배포하고 동작시킬 수 있도록 Java 기반 Code로 생성한 실행 파일들과 실행 관련 파일들(Resource, 속성 파일, Dependency 파일 등)을 하나로 패키징 해주는 것이 주 역할이다.

 

개념만 보자면 조금 복잡할 수도 있으나 예시를 보면 매우 쉽다.

우리는 Web Application을 개발할 때 build.gradle에서 Dependency Tag 안에 필요한 의존성을 주입함으로써 원하는 기능을 추가할 수 있었다.

이 과정에서 IntelliJ 같은 Tool들은 실행할 때마다  Web 상에 올라와 있는 의존성 파일을 가져오는 것이 아닌 Web Application측에 의존성 파일을 설치한 이후 활용한다.

실제로 Web Applicatoion을 보면 External Libraries에 Dependency로 설정했던 의존성 관련 파일들이 설치되었음을 볼 수 있다.

또한 HTML 파일과 .properties(설정 파일)을 저장한 resources 디렉터리나 추가로 생성하여 활용하는 webapp 디렉터리 등 또한 SW Code 안에 존재할 것이다.

따라서 Packaging의 결과물은 Source Code뿐만이 아닌 설치했던 Dependency 관련 파일들과 resources, webapp 등을 모두 저장해야 한다.

이런 파일들까지 포함하여 한번에 압축한 파일이 바로 WAR와 JAR 파일 되시겠다.

 

그렇다면 이 둘에는 어떤 차이가 존재할까?


JAR(Java Archive)

Class(Java Resource, 속성 파일) 파일과 라이브러리를 포함하여 JAVA 애플리케이션을 바로 동작시킬 수 있도록 프로젝트를 압축한 파일을 의미한다.

JAR는 Java Source Code를 빌드함으로써 생성된 .class 파일들과 resources 디렉터리, 의존성 파일들을 한 번에 압축하여 만든 파일을 말한다. resources 디렉터리도 압축 과정에 포함되기 때문에 그 안에 존재하는 .properties 파일(설정 파일)도 압축에 포함되며 Application에 적용해야 하는 설정값들을 보존시킨 상태에서 Web Application 실행 파일을 만들 수 있게 된다.

 

JAR 파일은 내부 WAS나 내부 웹서버까지 같이 패키징 되어야 한다.

JAR는 Java Class들이 사용하는 Resource 파일과 메타 데이터를 같이 압축한다. 따라서 외장 WAS를 활용하게 될 경우 외장 WAS의 설정과 JAR 파일이 압축한 설정이 일치하지 않을 때 에러가 발생할 수 있다.

 

대신 JAR 파일은 내부 WAS나 웹 서버를 같이 패키징 하며 Path 정보까지 모두 유지되어 있으므로 JRE만 있으면 프로젝트 구동이 가능하다.


WAR(Web Application Archive)

사실 WAR 파일은 JAR 파일의 일종이라고 볼 수 있는데 자바 서버 페이지, Servlet, Java Class, XML, Tag Library, HTML 등 웹 애플리케이션이 구동되기 위한 자원들을 한 번에 모아 배포하는 데 사용되는 파일이다.

 

JAR는 Path 정보를 유지한 상태로 압축을 진행하지만 WAR 파일에서는 web.xml이라는 파일을 압축 파일에 포함한다.

web.xml은 Web Application의 Path 등 웹 애플리케이션 실행에 대한 설정값들을 저장해 놓은 파일이다.

즉 WAR 파일은 Web Application 실행에 대한 웹 서버나 WAS 설정을 개발자가 직접 입력하기 때문에 내장 WAS를 활용할 경우 오히려 내장 WAS 측에서 자동으로 지정한 설정과 달라지는 경우가 발생할 수 있고, 이 때문에 내장 WAS를 포함하지 않고 패키징을 진행한다.

 

따라서 WAR는 별도의 Web Server나 WAS가 미리 구동되고 있어야지만 프로젝트를 실행시킬 수 있다.


WAR VS JAR

출처 : https://stackoverflow.com/questions/5871053/difference-between-jar-and-war-in-java

결국 JAR와 WAR는 동일한 아카이브 파일이지만 압축하는 범위가 다르기 때문에 차이가 발생한다고 볼 수 있겠다.

JAR 같은 경우 외부 WAS나 웹 서버를 사용하고 싶지 않은 경우나 활용하고 있는 Tomcat 그대로를 활용하여 Web Application을 실행시키고 싶을 때 사용하는 아카이브 파일이다.

 

반대로 WAR 파일은 외부 WAS와 웹 서버가 이미 존재하는 상황에서 내가 개발한 Web Application을 구동시키고 싶을 때 활용하는 아카이브 파일이다.

 

JAR 같은 경우는 JRE를 통해 따로 WAS나 웹 서버에 대한 설정 없이 바로 실행시킬 수 있다는 장점이 있다.

하지만 현실에서는 WAR를 많이 활용하는 편이다.

이유는 몇 가지 존재하는데, 내가 생각하는 큰 이유는 2가지이다.

 

먼저, 개발 서버와 운영 서버, 그리고 실서버의 차이점이다.

개발을 진행할 때 개발 환경 = 운영 환경인 상태로 개발을 진행하지는 않는다.

개발 환경에서 우선적으로 서비스 개발을 진행하고 운영 환경에 개발한 서비스를 이식하여 제대로 동작하는지 확인한 이후 실제 서버에 변경된 Source Code를 적용하는 방식으로 개발이 진행된다.

여기에서 실 서버 = 개발 서버라는 것은 절대로 보장되지도 않으며, 오히려 서버 설정이 다른 Case가 압도적으로 많다.

따라서 개발한 Source Code를 다른 설정의 서버에서 실행시키는 것이 중요해지고, 이에 따라 외부 WAS에서 동작시키기 쉬운 WAR 파일이 선호되는 것 같다.

 

두 번째로 webapp 디렉터리의 패키징 여부이다.

jar파일은 .class 파일들과 resources 디렉터리만 포함하여 패키징을 수행한다.

하지만 많은 Case에서는 .class 파일, resources 디렉터리와 webapp 디렉터리 총 3개의 디렉터리를 사용하여 웹 서비스 개발을 진행한다.

특히 JSP Template Framework를 작동시키고 싶을 때 대부분 jsp 파일을 src/main/webapp/WEB-INF/jsp에 위치시키는데 결국 "webapp" 디렉터리 내부에 jsp 파일들이 존재하다 보니 JAR 패키징을 수행할 때 jsp 파일들이 패키징에 포함되지 않게 된다.

물론 resources 디렉터리 내부로 jsp 파일들을 옮기면 JAR로도 완전한 배포가 가능하지만 이 경우 여러 가지 추가 설정들을 해줘야 하기 때문에 맘 편히 WAR 패키징을 활용함으로써 webapp 디렉터리 또한 패키징 결과물로 포함시키는 것이다

 

'웹 개발 > Spring(이론)' 카테고리의 다른 글

URL과 Spring MVC 연동 과정  (0) 2023.02.27
Gradle이란  (0) 2022.11.25
Spring Web 계층  (0) 2022.09.19
DTO 클래스  (0) 2022.09.19
Spring의 데이터 처리 방법  (0) 2022.09.19
Comments