JAR과 WAR

양치는 하셨나요·2024년 7월 30일
post-thumbnail

Jar과 War 파일이라… Jar 파일은 자바에서 DB 연동을 할 때, War 파일은 인터넷에서 압축 파일을 다운 받을 때 봤던 기억이 있다. 특히 Jar 파일은 자바 DB 연동 시 어떤 데이터베이스 소프트웨어를 쓸 지 정하는 드라이버의 역할을 했던 것으로 기억한다. 어찌나 말을 안들어서 삭제와 재설치를 반복했던지..

우선 내가 간단하게 아는 것은 둘 모두 압축 파일(Archive) 이라는 것, Jar의 j는 java의 것, War의 w는 Web의 것이라는 것이다. 하지만 두 파일의 정확한 동작 원리와 차이점은 탐구해 본 적이 없었다.

이번 시간에 두 파일의 개념, 장단점, 사용 등을 살펴볼 것이다.


JAR(Java Archive)

개념

JAR(Java Archive, 자바 아카이브)는 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다. - 위키백과

정확히 무엇인지 알기 위해 사전적 개념을 먼저 가져왔는데 개념적인 말을 보자면 아래와 같다.

  • 자바를 이용해 작성한 클래스 파일과 필요 리소스를 하나의 파일로 만든다.
  • 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 패키지 파일 포맷이다.

특징

  • 압축 방식은 zip과 같으며 하나의 컨테이너 역할과 같다.
  • 클래스 파일을 가지고 있기 때문에 JAR파일 자체가 하나의 실행 가능한 애플리케이션이 된다.
  • META-INF 폴더를 포함하며 메타 데이터를 저장한다.
  • META-INF 안에는 MANIFEST.MF 파일이 있고 여기서 매니페스트 파일을 선택적으로 포함한다.
    • JAR 파일이 실행 가능하기 위해선 여기에 main 메서드가 있는 클래스의 이름이 기술되어 있어야 한다.
    • 매니페스트 파일은 어떻게 jar 파일을 이용할지 기술한 엔트리 정보가 적혀있다.
    • META-INF는 가장 첫 번째 파일이다.

이런 특징들 때문에 자바로 이뤄진 라이브러리들이 JAR형식인 것을 볼 수 있고 gradle과 maven에 등록하는 프로젝트의 의존성에도 JAR파일들이 포함되는 것을 쉽게 볼 수 있다고 한다.

장점

  • 독립적 애플리케이션 패키징
    → 실행 가능한 JAR파일로 개발자가 쉽게 애플리케이션을 실행할 수 있다.
  • 하나의 압축된 파일이므로 배포와 전달이 용이하다.
  • Java 애플리케이션의 진입점인 main 메서드를 포함해 JVM에서 직접 실행한다. 따라서 웹 컨테이너나 서버가 필요하지 않다.
    → 독립 실행이 가능하다.
    - JVM: 자바 가상 머신. 클래스로더를 이용해 자바 애플리케이션을 읽어 자바 API와 함께 실행한다.
    - 웹 컨테이너(or 서블릿 컨테이너): 웹 서버 컨포넌트 중 하나로 자바 서블릿과 상호작용한다. 서블릿의 생명주기를 관리하고 URL과 특정 서블릿을 매핑해 URL 요청이 올바른 접근 권한을 갖도록 보장한다.

단점

  • JSP나 서블릿 컨테이너에 대한 표준 기능 활용이 어렵다.
    → 웹 애플리케이션에서는 부적합하다.
  • 웹 애플리케이션에서 동적인 웹 컨텐츠 생성 및 관리가 제한적이다.
    → 확장성에 한계가 있다.

WAR(Web Application Archive)

JAR포맷의 단점인 웹 애플리케이션에 부적합하다는 점과 확장성의 한계를 보완하기 위해 WAR 포맷이 등장했다. 개념부터 차례대로 어떤 점이 좋아졌는지 살펴본다.

개념

소프트웨어 공학에서 자바서버 페이지, 자바 서블릿, 자바 클래스, XML, 파일, 태그 라이브러리, 정적 웹 페이지 (HTML 관련 파일) 및 웹 애플리케이션을 함께 이루는 기타 자원을 한데 모아 배포하는데 사용되는 JAR 파일이다. - 위키백과

이번에도 사전적 개념을 가져왔는데 여기서도 내용에서 개념적인 말을 본다.

  • JAR 파일이다.
  • 기존 JAR 파일에서 자바 서버 페이지, 자바 서블릿, xml 등의 자원을 추가하여 웹 애플리케이션에 필요한 자원을 한데 모아 배포에 사용하는 포맷이다. → 웹 애플리케이션 전체를 패키징 하기위한 JAR 파일이다.

특징

  • 웹 관련 자원을 포함한다.
    • META-INF 폴더와 같이 WEB-INF 폴더가 있다. WEB-INF 폴더에는
      • WEB-INF 폴더: 해당 압축파일의 자바 관련 규약을 모아둔 것.
        • PHP, JSP와 같은 웹 외부 라이브러리와 애플리케이션을 구현해둔 클래스들을 호출하기 위한 파일들이 있다.
        • web.xml 파일이 있고 이 파일은 웹 애플리케이션의 구성을 결정한다. 이는 필터, 서블릿, DB source 등 웹 컨테이너가 구동하는데 이용하는 환경 설정 파일이라고 할 수 있다.
        • classes에는 클래스들을 호출하기 위한 파일들이 있으며 클래스 로더도 존재하여 어떤 순서로 클래스들을 작동 시키는지 명시되어있다.
  • 사전 정의된 구조를 사용한다.
    • JAR도 마찬가지지만 META-INF와 WEB-INF 처럼 필요한 폴더와 내부 파일들이 정해져있다.
  • servlet / JSP 컨테이너에 배치할 수 있다.
    • 해당 컨테이너에 있는 라이브러리들을 이용하도록 WAR 안에 명시되어 있기에 가능하다.

장점

  • 필요 웹 라이브러리와 웹 구성 등이 포함 되어 있기 때문에 웹 애플리케이션 패키징에 최적화되어있다.
  • 웹 구성 요소인 JSP, 서블릿, 필터, 리스너 등과 웹 애플리케이션을 실행하기 위한 웹 컨테이너에서 필요한 설정 파일, 라이브러리, 리소스 등을  포함하여 한 번에 배포 및 실행할 수 있다.
  • 위의 장점으로 인해 컨테이너에 의한 종속적 실행이 가능하여 다양한 웹 기능과 서버 환경을 활용할 수 있다.

단점

  • 장점에 적었듯 컨테이너에 종속적이어서 특정 웹 컨테이너 환경이 필요하다.
  • 배포 및 전달할 때 웹 내용이 포함되어 있어 JAR 파일에 비해 크고 번거로울 수 있다.

차이점

WAR 포맷이 JAR 포맷을 확장한 개념이기에 둘의 차이점은 WAR의 확장된 내용들이 된다.

JAR은 Java 애플리케이션을 패키징 한 것이고 WAR은 여기에 웹 내용들을 추가하여 패키징 한 것이기 때문에 JAR 은 자바 애플리케이션을 패키징하고 실행하는 것에 적합하고 WAR은 웹 애플리케이션을 패키징하고 실행하는 것에 적합하다.

→ JAR은 독립적으로 실행, WAR은 웹 환경에서 실행 가능한 파일이다.

선택

차이점에서 볼 수 있듯 두 파일은 내부 내용과 용도가 다르다. 그럼 어떨 때 어떤 파일을 써야 효율적일까?

요소

  1. 배포 환경

    단독 실행이 가능한 Java 파일일 경우 JAR, 웹 애플리케이션을 배포하기 위해선 WAR를 써야 한다.

  2. 프로젝트 형태

    프로젝트가 Java 단독으로 동작하도록 구현되었다면 JAR, 특정한 웹 컨테이너를 사용하여 구동해야 한다면 WAR가 적합하다.

  3. 확장성

    제일 처음 이야기 했던 Java 드라이버와 같이 단독적으로 구동 가능한 파일이라면 JAR, 웹 애플리케이션의 구성을 넣어 웹 컨테이너에 있는 외부 라이브러리들을 이용하려면 WAR를 써야한다.

    → JAR는 독립 실행이 가능하기에 편리하지만 WAR처럼 컨테이너에 적재하여 외부 라이브러리를 사용하기 어렵다.

  4. 환경

    위의 내용들을 포함하여 내가 구현하는 환경이 어떤 형식을 지원하고 최종 개발된 내용이 어디에서 동작하는지를 확인하고 둘 중 더 유리한 것을 선택하는 것이 중요하다.


Spring Boot에서의 선택.

앞서 말했듯, JAR와 WAR는 패키징 방법에 차이가 있을 뿐, 뭘 사용해야 하느냐는 개발자의 판단이 중요하다. 선택에서 나온 내용 중 WAR를 사용해야만 하는 이유가 있는 것이 아니라면 뭘 사용할지에 대한 완벽한 해답은 없다.

  • JSP를 사용하여야 한다거나 외장 WAS를 이용할 계획이 있는 등의 이유가 있다면 WAR를 사용해야 하지만 말이다.

하지만 Spring Boot에서의 기준은 JAR이다.

  • WAR는 웹 컨테이너에 적재할 필요성이 있을 때 사용해야 하지만 Spring Boot는 이러한 웹 관련 기술 지원이 마련되어 있기 때문에 굳이 WAR를 통해 내부에 다시 구조를 정의해 줄 필요가 없다.

따라서 기본적으로는 JAR가 더 우선시되는 것이 좋다.


결론

JAR는 자바 애플리케이션을 패키징 하기 위한 압축 파일이다.

WAR는 JAR에 더해 웹 애플리케이션을 위한 환경을 추가적으로 저장하고 웹 컨테이너에서 실행할 수 있도록 되어있으며 서버에 배포하기 위한 형식이다.

Spring Boot에서는 기본이 JAR이어서 특별한 이유가 있지 않으면 JAR가 더 우선시된다.

profile
프로그래밍을 잘하고 싶어요..

0개의 댓글