WEBBOOK CHAPTER

WAR 배포, 밤에 깨지 않게: 1장 WAR는 ZIP 파일보다 큰 계약이다

1장 WAR는 ZIP 파일보다 큰 계약이다

WAR(Web Application Archive)는 Servlet 컨테이너가 읽는 웹 애플리케이션 묶음이다. 압축 형식만 보면 ZIP과 비슷하지만 경로에 의미가 있다.


releaseportal.war
├── index.html
├── health.json
├── META-INF/
│   └── build-info.json
└── WEB-INF/
    ├── web.xml
    ├── classes/        # 컴파일된 애플리케이션 클래스
    └── lib/            # 애플리케이션이 함께 배포하는 JAR

WEB-INF 아래 파일은 브라우저가 직접 읽는 공개 자원이 아니다. classeslib는 웹 애플리케이션 classloader가 사용한다. 컨테이너가 제공하는 Servlet API를 WAR에 중복 포함하면 classloader 충돌이 생길 수 있다.

책 루트에서 첫 WAR를 만든다.


cd war-deployment-operations
npm run build:war
jar --list --file build/releaseportal.war
# Linux
sha256sum build/releaseportal.war
# macOS에서는: shasum -a 256 build/releaseportal.war

목록에 WEB-INF/web.xml, health.json, META-INF/build-info.json이 있어야 한다. 체크섬은 빌드마다 다를 수도 있다. JAR 도구가 파일 시각을 기록하기 때문이다. 조직에서 완전한 재현 빌드를 요구한다면 빌드 도구의 reproducible archive 설정과 SOURCE_DATE_EPOCH 지원을 별도로 고정한다. 이 실습의 핵심은 “보낸 파일”과 “배포한 파일”의 체크섬이 같음을 증명하는 것이다.