자바 애플리케이션 배포
4. 응용 변형 예제
4.1 폐쇄망 반입과 체크섬
인터넷이 없는 서버에는 jar 를 USB 나 반입 서버로 옮깁니다. 옮기기 전후 체크섬을 비교해 손상을 확인합니다.
sha256sum app.jar > app.jar.sha256 # 반출 측
sha256sum -c app.jar.sha256 # 반입 측: app.jar: OK
scp app.jar app.jar.sha256 deploy@server:/tmp/체크섬 파일을 jar 와 함께 옮기고, 배포 스크립트 첫 단계에서 -c 검사를 넣으면 잘린 파일로 배포하는 사고를 막습니다.
4.2 시작 확인 — 헬스 체크 대기
start 뒤 1초 생존 확인만으로는 부족합니다. Spring 이 뜨는 데 20~40초 걸리므로 헬스 URL 이 200 을 줄 때까지 기다립니다.
for _ in $(seq 1 60); do
curl -sf localhost:8080/actuator/health >/dev/null && { echo "healthy"; exit 0; }
sleep 1
done
echo "60초 안에 안 뜸"; tail -n 20 logs/stdout.log; exit 1curl -sf 는 실패 시 종료 코드만 돌려주고 출력은 없습니다. 06 네트워크 레슨에서 curl 옵션을 더 다룹니다.
4.3 두 인스턴스 무중단 교체
같은 서버에 8080·8081 두 인스턴스를 두고 앞단 nginx 가 분배하면, 하나씩 내려 교체하는 동안 서비스가 끊기지 않습니다.
for port in 8081 8080; do
APP_NAME=myapp-$port bash app.sh stop
APP_NAME=myapp-$port JAVA_OPTS="$JAVA_OPTS --server.port=$port" bash app.sh start
until curl -sf localhost:$port/actuator/health >/dev/null; do sleep 1; done
doneAPP_NAME 을 바꾸면 pid 파일이 달라져 인스턴스가 구분됩니다. 실제로는 nginx 에서 해당 포트를 먼저 빼는 단계가 앞에 붙습니다.
4.4 JAR 안 정보 확인
서버에 있는 jar 가 어떤 버전인지 확인하는 방법입니다. 빌드 시 MANIFEST.MF 나 build-info.properties 에 버전이 들어갑니다.
unzip -p current/app.jar META-INF/MANIFEST.MF | grep -i 'implementation-version'
unzip -p current/app.jar BOOT-INF/classes/META-INF/build-info.properties
unzip -l current/app.jar | grep -c '\.class