영한님의 스프링 MVC 강의를 듣던 중...
스프링 초기 세팅을 하는데!
![](https://velog.velcdn.com/images/llocr/post/7a2c96c7-f08a-4856-8cbd-8a57d297ee9a/image.png)
"JSP 써야 하니까 JAR 말고 WAR
를 선택하세요!"
![](https://i.pinimg.com/564x/05/b2/b5/05b2b5bd2a1ef19d49cb854f8d2b32ce.jpg)
ㄹㅇ 이런 표정으로 영한샘를 바라보게 된 나...
항상 JAR 선택해서 썼지만? 그게 뭔지도 몰랐던 나!
이번 기회에 JAR와 WAR를 간단하게 알아 보려고 한다 🧐
그래서 JAR, WAR 그게 뭔데..?
JAR(Java Archive)
WAR(Web Application Archive)
JAR와 WAR 모두 Java의 jar 툴을 이용하여 생성된 압축(아카이브)파일
!
어플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일(리소스, 속성 파일)을 패키징
해주는 것이 주 역할이다
JAR (Java Archive)
- Class와 같은 Java 리소스, 속성파일, 라이브러리 파일 등이 압축된다
- 쉽게 말해서 Java 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 것이다
.jar
확장자를 가진다
- 플랫폼에 귀속되는 점을 제외하면 .jar 와 .zip은 동일한 구조이다
- 원하는 구조로 구성이 가능하다
- JDK에 포함하고 있는 JRE만 가지고도 실행이 가능하다
장점
- 독립적인 Java 애플리케이션을 패키징할 수 있고, 실행 가능한 JAR 파일로 만들어서 개발자가 쉽게 애플리케이션을 실행할 수 있다
- 압축된 형식으로 클래스, 리소스, 라이브러리를 포함하기 때문에 배포와 전달에 용이하다
- Java 애플리케이션의 진입점인 main 메서드를 포함하고 있어 JVM에서 직접 실행하기 때문에 별도의 웹 컨테이너나 서버가 필요하지 않다
단점
- 웹 애플리케이션을 개발할 때, WAR 파일에 비해 제약사항이 있다
JSP, 서블릿 컨테이너에 대한 기능을 활용하기 어렵다
- 웹 애플리케이션에서 동적인 웹 컨텐츠 생성 및 관리가 제한적이다
WAR (Web Application Archive)
- Servlet / JSP 등을을 WAS 컨테이너 위에서 동작하게끔 빌드된 압축 파일 포맷이다
- JSP, SERVLET, JAR, CLASS, XML, HTML, JAVASCRIPT 등 Servlet Context 관련 파일들로 패키징되어 있다
- WAR는 웹 응요 프로그램을 위한 포맷이기 때문에 웹 관련 자원만 포함하고 있으면 이를 사용해서 웹 애플리케이션을 쉽게 배포하고 테스트할 수 있다
- WEB-INF / META-INF 와 같은 사전 정의된 구조를 사용한다
장점
- Java 웹 애플리케이션을 패키징하는 데 최적화 되어 있다
- 웹 구성 요소 (JSP, Servlet, Filter, Listener)와 웹 애플리케이션을 실행하기 위한 서블릿 컨테이너에서 필요한 설정 파일, 라이브러리, 리소스 등을 포함해서 한 번에 배포 및 실행을 할 수 있다
- 웹 컨테이너(서블릿 컨테이너)를 통해 애플리케이션을 실행하기 때문에 다양한 웹 기능과 서버 환경을 활용할 수 있다
단점
- 웹 컨테이너나 서버에 종속적이기 때문에 특정한 웹 컨테이너 환경이 필요하다
- 배포 및 전달에 있어서 JAR 파일에 비해 크고 번거로울 수 있다
- 원하는 구조로 생성이 불가능하다
JAR, WAR 그래서 뭘 써야 하나요?
SpringBoot를 사용한다면...
-
스프링부트는 내장 Tomcat
서버를 가지고 있기 때문에 JAR 로 패키징 하는 것이 일반적이다
스프링부트에서 가이드하는 표준도 JAR 이다..!
-
하지만 꼭 JSP
로 화면을 구성해야 한다, 외장 WAS
를 사용해야 한다면 WAR 로 패키징을 하자!
JAR, WAR 선택시 고려 사항
- 프로젝트 유형
JAR : 독립적인 Java 애플리케이션
WAR : 웹 애플리케이션
- 배포 환경
JAR : 애플리케이션을 서버나 웹 컨테이너 없이 실행
WAR : 애플리케이션 실행을 위해 특정한 웹 컨테이너에서 호스팅 해야 하면
- 기능 요구사항에 따라서
JAR
- 일반적인 Java 애플리케이션에 적합
- 독립 실행 가능한 형태
- 개발자가 애플리케이션을 실행하고 테스트 가능
WAR
- 웹 애플리케이션의 웹 구성요소(Servlet, JSP 등) 포함
- 웹 애플리케이션 개발에 필요한 기능을 활용
- 확장성
JAR : 독립적인 애플리케이션을 패키징, 특정한 환경에 종속되지 않고 단일 기능을 수행하는 애플리케이션을 개발
하는 데 적합
WAR : 웹 애플리케이션의 구성 요소를 통합하여 패키징하기 때문에, 웹 컨테이너의 다양한 기능과 라이브러리를 활용할 수 있어서 확장성 높음
개발자가 잘 판단해서 사용하자!
JAR, WAR는 애플리케이션 리소스를 패키징 하는 방법
에 차이가 있을 뿐!
뭘 사용하느냐는 개발자의 판단
에 따른다! 완벽한 답은 없다 :-)