F-LAB JAVA · 6주차 · Phase 2 · 웹 인프라 기초
🏆 Phase 2 완주 + Part A 완주 — 배포 패키징의 선택
이 Unit을 끝내면 다음을 답할 수 있어야 한다.
JAR 는 Class·라이브러리를 담아 JRE 만으로 java -jar 로 실행하고, WAR 는 거기에 JSP·Servlet·WEB-INF 를 더해 외부 WAS 에 배포하며, Spring Boot 는 WAS(Tomcat)를 내장한 JAR 를 선택해 배포·실행을 간단하게 만들었다.
JAR (Java Archive) 는 Class 파일과 라이브러리를 담은 압축 파일로, JRE 만 있으면java -jar app.jar로 실행되며 구조가 자유롭다.
WAR (Web Application Archive) 는 JAR 에 JSP·Servlet·WEB-INF·META-INF 를 더한 것으로, 외부 WAS (Tomcat 등) 에 배포해야 실행되며 사전 정의된 디렉터리 구조를 따른다.
Spring Boot 는 JAR 를 선택 했는데, WAS (Tomcat) 를 내장하여 별도 WAS 운영이 불필요해 배포·실행이 간단하고 DevOps 부담이 줄기 때문이다.
Spring Boot JAR 는BOOT-INF/lib에 내장 톰캣을 포함한 의존성을 담고BOOT-INF/classes에 애플리케이션 코드를 담아 실행 가능한 fat JAR 가 되며, JSP 레거시나 외장 WAS 정책이 있을 때만 WAR 를 쓴다.
JAR vs WAR = 완제품 가전 vs 조립 부품:
JAR (Spring Boot, 완제품):
- 전원 코드 내장 (톰캣 내장)
- 콘센트만 꽂으면 (JRE)
- 바로 작동 (java -jar)
- 별도 설치 불필요
WAR (조립 부품):
- 본체만 (서블릿/JSP)
- 전원 장치 별도 (외부 WAS)
- WAS 에 설치해야 작동
- 정해진 규격 (디렉터리 구조)
Spring Boot 선택 (JAR):
- WAS 내장 (전원 내장)
- 배포 간단 (jar 하나)
- DevOps 부담 ↓
BOOT-INF/lib:
- 내장 톰캣 부품 보관함
- 의존성 + 톰캣
WAR 필요 (예외):
- JSP 레거시
- 외장 WAS 정책
- 공용 톰캣 사용 환경
→ JAR(JRE만, java -jar) vs WAR(외부 WAS), Spring Boot=JAR(톰캣 내장, 간단).
1. JAR란
2. WAR란
3. JAR vs WAR 차이
4. Spring Boot의 JAR 선택
5. 내장 톰캣 방식
6. BOOT-INF/lib 구조
7. WAR가 필요한 경우
8. Part A 완주 정리
9. 면접 + 자기 점검
JAR (Java Archive):
자바 아카이브:
- Class 파일
- 라이브러리
- 리소스
- 압축 (zip 기반)
JAR 포함:
- .class 파일
- 라이브러리 (의존성)
- META-INF/MANIFEST.MF
- 리소스 (설정, 이미지)
JAR 실행:
java -jar app.jar:
- JRE 만 있으면
- Main-Class 실행
- 외부 WAS 불필요
자유 구조:
JAR 내부:
- 사전 정의 X
- 패키지 구조
- 자유
JAR (ILIC):
ilic-backend.jar:
- Spring Boot 코드 (.class)
- 모든 의존성 (라이브러리)
- 내장 Tomcat
- 설정 (application.yml)
실행:
java -jar ilic-backend.jar
→ 별도 Tomcat 설치 X
→ 즉시 실행 (431 API)
JAR (Java Archive) 란?
답:
1. JAR:
포함:
실행:
구조:
WAR (Web Application Archive):
웹 애플리케이션 아카이브:
- JAR + 웹 자원
- JSP, Servlet
- WEB-INF, META-INF
WAR 포함:
- Class 파일
- 라이브러리
- JSP 파일
- WEB-INF/web.xml
- 정적 자원
WAR 디렉터리 (사전 정의):
/
├── WEB-INF/
│ ├── web.xml
│ ├── classes/
│ └── lib/
├── *.jsp
└── 정적 자원
→ 정해진 구조
WAR 실행:
외부 WAS 필요:
- Tomcat 에 배포
- webapps/ 에 넣음
- WAS 가 실행
WAR (개념, ILIC 는 JAR):
ilic.war (만약 WAR 였다면):
/
├── WEB-INF/
│ ├── web.xml
│ ├── classes/ (코드)
│ └── lib/ (의존성)
├── *.jsp (JSP 페이지)
└── 정적
배포:
- Tomcat webapps/ 에 복사
- Tomcat 이 실행
→ ILIC 는 JAR 선택 (다음 섹션)
WAR (Web Application Archive) 란?
답:
1. WAR:
포함:
구조:
실행:
| 항목 | JAR | WAR |
|---|---|---|
| 정식 명칭 | Java Archive | Web Application Archive |
| 포함 | Class, 라이브러리 | + JSP, Servlet, WEB-INF |
| 실행 환경 | JRE | 외부 WAS |
| 실행 | java -jar | WAS 배포 |
| 구조 | 자유 | 사전 정의 |
포함 차이:
JAR:
- Class + 라이브러리
WAR:
- + JSP, Servlet
- + WEB-INF
- 웹 전용
실행 환경:
JAR:
- JRE 만
- 독립 실행
WAR:
- 외부 WAS
- WAS 위에서
실행 방법:
JAR:
java -jar app.jar
WAR:
Tomcat webapps/ 배포
또는 deploy
JAR vs WAR (ILIC 선택)
ILIC = JAR:
- java -jar ilic-backend.jar
- 내장 Tomcat
- JRE 만
- Docker 컨테이너 간단
만약 WAR 였다면:
- 별도 Tomcat 설치
- webapps/ 배포
- Tomcat 운영 부담
→ JAR 가 컨테이너/배포에 유리
JAR vs WAR 의 차이는?
답:
1. 포함:
실행 환경:
실행:
구조:
Spring Boot = JAR:
내장 WAS (Tomcat):
- jar 안에 톰캣
- 별도 설치 X
- java -jar 실행
JAR 선택 이유:
- 배포 간단 (jar 하나)
- 실행 간단 (java -jar)
- WAS 운영 불필요
- DevOps 부담 ↓
fat JAR (uber JAR):
모든 것 포함:
- 앱 코드
- 모든 의존성
- 내장 톰캣
→ 단일 실행 파일
자기 완결성:
Spring Boot JAR:
- 독립 실행
- 외부 의존 최소 (JRE)
- 어디서든 동일
→ 이식성
Spring Boot JAR (ILIC)
ILIC backend:
- Spring Boot 3
- ./gradlew bootJar
- ilic-backend.jar 생성
실행:
java -jar ilic-backend.jar
→ 내장 Tomcat 시작
→ 431 API 서빙
Docker:
FROM eclipse-temurin:17-jre
COPY ilic-backend.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
→ 간단한 컨테이너
→ WAS 설치 단계 없음 (JAR 덕분)
Spring Boot가 JAR를 선택한 이유는?
답:
1. JAR 선택:
이유:
fat JAR:
완결성:
내장 톰캣:
Spring Boot JAR:
- 톰캣을 라이브러리로 포함
- spring-boot-starter-web
- jar 안에 톰캣
시작 흐름:
java -jar app.jar
→ main() 실행
→ SpringApplication.run
→ 내장 톰캣 시작
→ 포트 바인딩 (8080)
→ 요청 대기
임베디드 서버:
내장 (embedded):
- 애플리케이션에 포함
- 코드로 시작
- 설정 (application.yml)
vs 외장:
- 별도 설치/운영
// 내장 서버 교체 (선택)
// 기본: Tomcat
// Jetty 로:
// spring-boot-starter-web 에서
// tomcat 제외 + jetty 추가
// build.gradle (개념)
// implementation('org.springframework.boot:spring-boot-starter-web') {
// exclude module: 'spring-boot-starter-tomcat'
// }
// implementation 'org.springframework.boot:spring-boot-starter-jetty'
내장 톰캣 (ILIC)
ilic-backend.jar 실행:
1. java -jar ilic-backend.jar
2. IlicApplication.main()
3. SpringApplication.run(IlicApplication.class)
4. 내장 Tomcat 시작
5. 포트 8080 바인딩
6. DispatcherServlet 등록
7. 431 API 매핑
8. 요청 대기
application.yml:
server:
port: 8080
→ 톰캣 설정 (코드로)
→ 별도 Tomcat 설치/설정 X
Spring Boot JAR가 내장 톰캣을 가지는 방식은?
답:
1. 내장 톰캣:
시작:
임베디드:
교체:
Spring Boot fat JAR 구조:
app.jar
├── META-INF/
│ └── MANIFEST.MF
├── org/springframework/boot/loader/
│ └── (부트 로더)
├── BOOT-INF/
│ ├── classes/ ← 앱 코드
│ └── lib/ ← 의존성 + 톰캣
└── ...
BOOT-INF/classes:
애플리케이션 코드:
- 내 .class 파일
- 리소스 (application.yml)
→ 내가 작성한 코드
BOOT-INF/lib:
의존성 JAR:
- 내장 톰캣 (tomcat-embed-*.jar)
- Spring (spring-*.jar)
- 기타 라이브러리
→ 모든 의존성
부트 로더:
org.springframework.boot.loader:
- JAR 안의 JAR 로딩
- 중첩 JAR 처리
- 특수 클래스 로더
→ fat JAR 실행 가능하게
ILIC fat JAR 구조
ilic-backend.jar
├── META-INF/MANIFEST.MF
│ (Main-Class: ...JarLauncher)
├── org/springframework/boot/loader/
│ (부트 로더)
├── BOOT-INF/
│ ├── classes/
│ │ ├── com/ilic/ (431 API 코드)
│ │ └── application.yml
│ └── lib/
│ ├── tomcat-embed-core-*.jar (내장 톰캣!)
│ ├── spring-boot-*.jar
│ ├── spring-webmvc-*.jar
│ ├── mysql-connector-*.jar
│ └── ... (모든 의존성)
└── ...
→ BOOT-INF/lib 에 톰캣 + 의존성
→ classes 에 ILIC 코드
→ 부트 로더가 실행
BOOT-INF/lib 구조는?
답:
1. fat JAR:
classes:
lib:
부트 로더:
WAR 필요:
- JSP 레거시 (반드시 JSP)
- 외장 WAS 정책
- 공용 톰캣 환경
- 기존 인프라
JSP 레거시:
JSP 사용 시:
- 내장 톰캣 JSP 제약
- WAR 권장
→ 레거시 JSP 프로젝트
외장 WAS 정책:
기업 정책:
- 표준 WAS 운영
- 공용 톰캣
- WAR 배포
→ 인프라 정책
// Spring Boot 도 WAR 가능
// 1. SpringBootServletInitializer 상속
@SpringBootApplication
public class IlicApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {
return builder.sources(IlicApplication.class);
}
}
// 2. build.gradle: war + providedRuntime tomcat
// → 외장 WAS 배포 가능
WAR 판단 (ILIC)
ILIC = JAR 선택:
- JSP 안 씀 (Vue SPA)
- 외장 WAS 정책 없음
- Docker 컨테이너 배포
- 마이크로서비스 지향
→ WAR 불필요, JAR 적합
만약 WAR 필요했다면:
- 회사 표준 외장 Tomcat 운영
- 또는 JSP 레거시 통합
→ SpringBootServletInitializer
→ ILIC 환경엔 JAR 가 최적
WAR가 필요한 경우는?
답:
1. 필요 상황:
JSP:
정책:
Spring Boot WAR:
Part A — 학습 도구와 환경
Phase 1 — JUnit 테스트 (5 Unit):
- 단위 테스트, assertThat
- 실행 방식, 새 인스턴스
- 픽스처
Phase 2 — 웹 인프라 (4 Unit):
- 웹서버 vs WAS
- 서블릿/JSP
- SSR vs CSR
- JAR vs WAR
Part A 핵심 메시지:
"5주차 IoC/DI 코드를
테스트로 검증하고 (Phase 1),
웹 백엔드 인프라를
이해한다 (Phase 2).
→ Spring MVC 학습 준비 완료"
마이크로서비스 JAR:
JAR 선호:
- 독립 실행 (서비스별)
- 컨테이너 친화
- 배포 간단
- 확장 쉬움
→ MSA 표준
Part A → Part B:
- 환경 → DB 접근
Part B — DB 접근의 진화 (정점):
Phase 3 — JDBC
Phase 4 — Connection Pool
Phase 5 — DataSource
Phase 6 — 트랜잭션 ACID
Phase 7 — JdbcTemplate
Part A의 종합은?
답:
1. Phase 1:
Phase 2:
메시지:
다음:
| Q | 핵심 답변 |
|---|---|
| JAR? | Class+라이브러리, JRE |
| WAR? | +JSP/WEB-INF, 외부 WAS |
| 차이 3가지? | 포함/실행환경/실행 |
| Spring Boot JAR? | 내장 톰캣, 간단 |
| 내장 톰캣? | 라이브러리 포함 |
| BOOT-INF/lib? | 의존성+톰캣 |
| WAR 필요? | JSP/외장 정책 |
| MSA JAR? | 독립/컨테이너 |
| fat JAR? | 모든 것 포함 |
| 부트 로더? | 중첩 JAR 실행 |
답:
답:
답:
답:
답:
1. JAR vs WAR
2. Spring Boot의 JAR
3. WAR 필요 + MSA
🌐 Phase 2 — 웹 인프라 기초
✅ Unit 2.1 웹서버 vs WAS
✅ Unit 2.2 서블릿과 JSP
✅ Unit 2.3 SSR vs CSR
✅ Unit 2.4 JAR vs WAR ← 여기, Phase 2 완주
🧪 Part A — 학습 도구와 환경 완주!
✅ Phase 1 — JUnit 테스트 (5 Unit)
✅ Phase 2 — 웹 인프라 기초 (4 Unit)
💾 Part B — DB 접근의 진화
Phase 3 — JDBC 표준화 (3 Unit)
Phase 4 — Connection Pool (4 Unit, 4.2 ★깊이)
Phase 5 — DataSource (4 Unit, 5.3 ★깊이)
Phase 6 — 트랜잭션 ACID (6 Unit, 6.2~6.6 ★깊이)
Phase 7 — JdbcTemplate (5 Unit, 7.2 ★깊이)
🧪 Part A — 학습 도구와 환경 (9 Unit) ← 완주
✅ Phase 1 — JUnit 테스트 (5)
✅ Phase 2 — 웹 인프라 기초 (4)
💾 Part B — DB 접근의 진화
⏭ Phase 3~7 (19 Unit)
총: 9/28 Unit
🏆 Phase 2 완주 + Part A 완주