Tomcat과 Spring 배포에 대해서 공부를 하다보니 자연스럽게 War와 Jar의 차이점에 대해서 자연스럽게 궁금하게 되었다.
단순히 빌드 후 나오는 결과물의 확장자 정도로만 알고있었지 더 자세히는 알려고 하지 않았었는데, 이 참에 공부를 진행해보려고 한다.
먼저 둘의 공통점은 JAVA의 jar 툴을 이용하여 생성된 압축(아카이브) 파일이며, 애플리케이션을 쉽게 배포하고, 동작시킬 수 있도록 관련 파일들을 패키징해준다는 것이다.
쉽게 이야기하면, 둘 다 JAVA 애플리케이션을 패키징하는 방식이다.
독립적인 Java 애플리케이션을 패키징 할 수 있고, 실행 가능한 Jar 파일로 만들어서 개발자가 쉽게 애플리케이션을 실행할 수 있다.
또한 압축된 형식으로 클래스, 리소스, 라이브러리 등을 포함하므로 배포와 전달이 용이하다.
그리고 Java 애플리케이션의 진입점인 main 메서드를 포함하고 있음으로 JVM에서 직접 실행하기에 별도의 웹 컨테이너나 서버가 필요 없다.
반면 단점으로는 JSP나 서블릿 컨테이너에 대한 표준 기능을 활용하기 어려워 웹 애플리케이션을 개발하는데 WAR에 비해 상대적으로 어렵다.
웹 구성 요소인 JSP, 서블릿, 필터, 리스너등과 웹 애플리케이션을 실행하기 위한 서블릿 컨테이너에서 필요한 설정 파일, 라이브러리, 리소스등을 포함하여 한번에 배포 및 실행 할 수 있다.
웹 컨테이너(서블릿 컨테이너)를 통해 애플리케이션을 실행하므로 다양한 웹 기능과 서버 환경을 활용할 수 있다.
또한 원하는 구성을 할 수 있는 Jar과 다르게 WEB-INF 및 META-INF 디렉토리로 사전 정의된 구조를 사용한다.
반면 단점으로는 웹 컨테이너나 서비에 종속적이며, 특정한 웹 컨테이너 환경이 필요하다.
WAR와 JAR 모두 압축된 아카이블 파일인데, WAR은 JAR에서 웹 어플리케이션을 배포하기 위해 고안되어 특정 구조를 가지고 있다는게 핵심이다.