1. 개요
WAR(WEB Application Archive)와 JAR(Java Archive)는 Java 기반 애플리케이션을 패키징하는 두 가지 방식입니다.
- JAR (Java Archive): 일반적인 Java 애플리케이션을 실행 가능한 파일로 패키징하는 방식.
- WAR (Web Application Archive): 웹 애플리케이션을 패키징하여 웹 서버(WAS, Tomcat 등)에 배포하는 방식.
2. WAR vs JAR 개념
구분 |
WAR (Web Application Archive) | JAR (Java Archive) |
설명 | 웹 애플리케이션을 위한 패키징 방식 (Servlet, JSP, Spring MVC) | 일반적인 Java 애플리케이션 패키징 방식 (Spring Boot, Java 프로그램) |
사용 대상 | 전통적인 Spring MVC + 외부 WAS(Tomcat, JBoss 등) | Spring Boot + 내장 WAS 포함 |
실행 방식 | Tomcat, Jetty, JBoss 등 별도의 WAS에 배포 | java -jar myapp.jar 로 직접 실행 가능 |
구조 | WEB-INF/web.xml, WEB-INF/classes, WEB-INF/lib 포함 | 단일 실행 파일로 모든 클래스 및 라이브러리를 포함 |
내장 서버 | 포함되지 않음 (별도 WAS 필요) | 포함됨 (내장 Tomcat, Jetty, Undertow 지원) |
크기 | 비교적 큼 (서버 설정 포함) | 작음 (필요한 파일만 포함) |
배포 방식 | WAR 파일을 WAS(Web Application Server)에 배포 | 독립 실행형 JAR로 직접 실행 |
마이크로서비스 적합성 | ❌ (별도 WAS 필요, 설정 복잡) | ✅ (내장 서버 포함, 배포 간편) |
3. WAR와 JAR의 구조 차이
(1) WAR 파일 구조
WAR 파일은 웹 애플리케이션의 모든 파일을 포함하고 있으며, WEB-INF 폴더 내 web.xml 설정 파일을 가질 수 있습니다.
myapp.war
├── WEB-INF/
│ ├── web.xml (설정 파일)
│ ├── classes/ (컴파일된 클래스 파일)
│ ├── lib/ (의존성 JAR 파일)
│ └── views/ (JSP, HTML 파일)
├── META-INF/
└── index.jsp
- WEB-INF/web.xml: 서블릿 및 필터 등을 설정하는 XML 파일
- WEB-INF/classes/: Java 클래스 파일이 위치하는 곳
- WEB-INF/lib/: 필요한 JAR 라이브러리 포함
실행 방식:
- WAR 파일을 생성한 후 Tomcat, JBoss, WildFly 등 WAS(Web Application Server)에 배포
- WAS가 WAR 파일을 로드하여 실행
cp myapp.war $TOMCAT_HOME/webapps/ $TOMCAT_HOME/bin/startup.sh
- 실행하려면 Tomcat을 먼저 실행한 후 배포해야 함.
- 외부 WAS(Web Application Server)에 의존함.
(2) JAR 파일 구조
JAR 파일은 일반적인 Java 실행 파일처럼 META-INF/MANIFEST.MF와 필요한 클래스 파일 및 라이브러리를 포함합니다.
myapp.jar
├── BOOT-INF/
│ ├── classes/ (컴파일된 클래스 파일)
│ ├── lib/ (의존성 JAR 파일)
│ ├── META-INF/
│ └── application.properties
└── org/springframework/boot/loader/ (Spring Boot 로더)
- META-INF/MANIFEST.MF: 실행 가능한 메인 클래스 정보 포함
- lib/: 추가 라이브러리 포함
실행 방식:
- JAR 파일을 생성 (spring-boot-starter-web 사용)
- 단일 파일로 실행 가능 (내장 Tomcat 포함)
java -jar myapp.jar
- 내장된 main() 메서드가 실행되면서 애플리케이션이 시작됨.
- Spring Boot의 경우, 내장 Tomcat을 포함할 수 있어 별도의 WAS 없이 실행 가능.
- 마이크로서비스, 컨테이너(Docker) 환경에서 유리.
4. Spring Boot에서 JAR 패키징 방법
(1) JAR 패키징 (Spring Boot 기본)
Spring Boot 프로젝트는 기본적으로 JAR로 패키징된다.
1️⃣ pom.xml 설정 (JAR 패키징)
<packaging>jar</packaging>
2️⃣ Spring Boot JAR 실행 클래스
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
3️⃣ 빌드 및 실행
mvn clean package
cp target/myapp.war /opt/tomcat/webapps/
✅ 내장 서버 포함! 별도의 WAS 없이 실행 가능.
5. 언제 WAR와 JAR를 사용할까?
상황 |
WAR | JAR |
기존 레거시 시스템 (Tomcat, JBoss 등 사용) | ✅ 적합 | ❌ 부적합 |
새로운 Spring Boot 프로젝트 | ❌ 불필요 | ✅ 기본 선택 |
마이크로서비스 (Microservices) | ❌ 부적합 (외부 WAS 필요) | ✅ 적합 (내장 서버 포함) |
클라우드 & 컨테이너 환경 (Docker, Kubernetes) | ❌ 불편 (배포 복잡) | ✅ 이상적 (독립 실행 가능) |
빠른 개발 및 배포 | ❌ 설정 필요 | ✅ 빠르고 간단함 |
6. 결론
- Spring Boot는 기본적으로 JAR 패키징을 사용하며, 내장 서버(Tomcat, Jetty 등)가 포함되어 있어 독립적으로 실행 가능.
- WAR 패키징은 기존의 Spring MVC와 같은 전통적인 웹 애플리케이션에서 사용되며, 외부 WAS(Tomcat, JBoss 등)가 필요.
- 마이크로서비스, 클라우드 환경에서는 JAR 패키징이 훨씬 유리하며, java -jar 명령만으로 실행 가능.
- 기존 레거시 시스템과의 통합이 필요한 경우 WAR 패키징을 고려할 수 있지만, 새로운 프로젝트라면 JAR 패키징이 더 효율적.
✅ 즉, 새로운 Spring Boot 프로젝트라면 JAR 패키징을 기본으로 사용하고, 기존 WAS 환경에서 배포해야 하는 경우 WAR 패키징을 선택하면 된다.
연관된 글 :
참고:
gpt
'개발 > Java' 카테고리의 다른 글
[JAVA] 정적 팩토리 메서드(Static Factory Method) (0) | 2025.03.02 |
---|---|
[Java] Stream API - map과 flatMap (1) | 2024.06.06 |
POJO(Plain Old Java Object) (0) | 2024.06.06 |
[JAVA] DTO, VO, DAO, Entity 의 차이 (0) | 2023.05.25 |
[JAVA] Lombok 어노테이션 (0) | 2023.04.29 |
1. 개요
WAR(WEB Application Archive)와 JAR(Java Archive)는 Java 기반 애플리케이션을 패키징하는 두 가지 방식입니다.
- JAR (Java Archive): 일반적인 Java 애플리케이션을 실행 가능한 파일로 패키징하는 방식.
- WAR (Web Application Archive): 웹 애플리케이션을 패키징하여 웹 서버(WAS, Tomcat 등)에 배포하는 방식.
2. WAR vs JAR 개념
구분 |
WAR (Web Application Archive) | JAR (Java Archive) |
설명 | 웹 애플리케이션을 위한 패키징 방식 (Servlet, JSP, Spring MVC) | 일반적인 Java 애플리케이션 패키징 방식 (Spring Boot, Java 프로그램) |
사용 대상 | 전통적인 Spring MVC + 외부 WAS(Tomcat, JBoss 등) | Spring Boot + 내장 WAS 포함 |
실행 방식 | Tomcat, Jetty, JBoss 등 별도의 WAS에 배포 | java -jar myapp.jar 로 직접 실행 가능 |
구조 | WEB-INF/web.xml, WEB-INF/classes, WEB-INF/lib 포함 | 단일 실행 파일로 모든 클래스 및 라이브러리를 포함 |
내장 서버 | 포함되지 않음 (별도 WAS 필요) | 포함됨 (내장 Tomcat, Jetty, Undertow 지원) |
크기 | 비교적 큼 (서버 설정 포함) | 작음 (필요한 파일만 포함) |
배포 방식 | WAR 파일을 WAS(Web Application Server)에 배포 | 독립 실행형 JAR로 직접 실행 |
마이크로서비스 적합성 | ❌ (별도 WAS 필요, 설정 복잡) | ✅ (내장 서버 포함, 배포 간편) |
3. WAR와 JAR의 구조 차이
(1) WAR 파일 구조
WAR 파일은 웹 애플리케이션의 모든 파일을 포함하고 있으며, WEB-INF 폴더 내 web.xml 설정 파일을 가질 수 있습니다.
myapp.war
├── WEB-INF/
│ ├── web.xml (설정 파일)
│ ├── classes/ (컴파일된 클래스 파일)
│ ├── lib/ (의존성 JAR 파일)
│ └── views/ (JSP, HTML 파일)
├── META-INF/
└── index.jsp
- WEB-INF/web.xml: 서블릿 및 필터 등을 설정하는 XML 파일
- WEB-INF/classes/: Java 클래스 파일이 위치하는 곳
- WEB-INF/lib/: 필요한 JAR 라이브러리 포함
실행 방식:
- WAR 파일을 생성한 후 Tomcat, JBoss, WildFly 등 WAS(Web Application Server)에 배포
- WAS가 WAR 파일을 로드하여 실행
cp myapp.war $TOMCAT_HOME/webapps/ $TOMCAT_HOME/bin/startup.sh
- 실행하려면 Tomcat을 먼저 실행한 후 배포해야 함.
- 외부 WAS(Web Application Server)에 의존함.
(2) JAR 파일 구조
JAR 파일은 일반적인 Java 실행 파일처럼 META-INF/MANIFEST.MF와 필요한 클래스 파일 및 라이브러리를 포함합니다.
myapp.jar
├── BOOT-INF/
│ ├── classes/ (컴파일된 클래스 파일)
│ ├── lib/ (의존성 JAR 파일)
│ ├── META-INF/
│ └── application.properties
└── org/springframework/boot/loader/ (Spring Boot 로더)
- META-INF/MANIFEST.MF: 실행 가능한 메인 클래스 정보 포함
- lib/: 추가 라이브러리 포함
실행 방식:
- JAR 파일을 생성 (spring-boot-starter-web 사용)
- 단일 파일로 실행 가능 (내장 Tomcat 포함)
java -jar myapp.jar
- 내장된 main() 메서드가 실행되면서 애플리케이션이 시작됨.
- Spring Boot의 경우, 내장 Tomcat을 포함할 수 있어 별도의 WAS 없이 실행 가능.
- 마이크로서비스, 컨테이너(Docker) 환경에서 유리.
4. Spring Boot에서 JAR 패키징 방법
(1) JAR 패키징 (Spring Boot 기본)
Spring Boot 프로젝트는 기본적으로 JAR로 패키징된다.
1️⃣ pom.xml 설정 (JAR 패키징)
<packaging>jar</packaging>
2️⃣ Spring Boot JAR 실행 클래스
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
3️⃣ 빌드 및 실행
mvn clean package
cp target/myapp.war /opt/tomcat/webapps/
✅ 내장 서버 포함! 별도의 WAS 없이 실행 가능.
5. 언제 WAR와 JAR를 사용할까?
상황 |
WAR | JAR |
기존 레거시 시스템 (Tomcat, JBoss 등 사용) | ✅ 적합 | ❌ 부적합 |
새로운 Spring Boot 프로젝트 | ❌ 불필요 | ✅ 기본 선택 |
마이크로서비스 (Microservices) | ❌ 부적합 (외부 WAS 필요) | ✅ 적합 (내장 서버 포함) |
클라우드 & 컨테이너 환경 (Docker, Kubernetes) | ❌ 불편 (배포 복잡) | ✅ 이상적 (독립 실행 가능) |
빠른 개발 및 배포 | ❌ 설정 필요 | ✅ 빠르고 간단함 |
6. 결론
- Spring Boot는 기본적으로 JAR 패키징을 사용하며, 내장 서버(Tomcat, Jetty 등)가 포함되어 있어 독립적으로 실행 가능.
- WAR 패키징은 기존의 Spring MVC와 같은 전통적인 웹 애플리케이션에서 사용되며, 외부 WAS(Tomcat, JBoss 등)가 필요.
- 마이크로서비스, 클라우드 환경에서는 JAR 패키징이 훨씬 유리하며, java -jar 명령만으로 실행 가능.
- 기존 레거시 시스템과의 통합이 필요한 경우 WAR 패키징을 고려할 수 있지만, 새로운 프로젝트라면 JAR 패키징이 더 효율적.
✅ 즉, 새로운 Spring Boot 프로젝트라면 JAR 패키징을 기본으로 사용하고, 기존 WAS 환경에서 배포해야 하는 경우 WAR 패키징을 선택하면 된다.
연관된 글 :
참고:
gpt
'개발 > Java' 카테고리의 다른 글
[JAVA] 정적 팩토리 메서드(Static Factory Method) (0) | 2025.03.02 |
---|---|
[Java] Stream API - map과 flatMap (1) | 2024.06.06 |
POJO(Plain Old Java Object) (0) | 2024.06.06 |
[JAVA] DTO, VO, DAO, Entity 의 차이 (0) | 2023.05.25 |
[JAVA] Lombok 어노테이션 (0) | 2023.04.29 |