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 아래 파일은 브라우저가 직접 읽는 공개 자원이 아니다. classes와 lib는 웹 애플리케이션 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 지원을 별도로 고정한다. 이 실습의 핵심은 “보낸 파일”과 “배포한 파일”의 체크섬이 같음을 증명하는 것이다.