Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- 쿠키로그인
- 서버 꺼짐
- llm
- 프로그래머스
- Dockerfile
- springboot
- 회고
- openAI
- fastapi
- docker
- 커밋 메시지
- 알고리즘
- 코딩테스트
- 프로젝트
- crud
- mysql
- 부트스트랩
- 로그인
- 네팔
- Java
- 해외봉사
- 게시판
- OOM
- cors
- 우테코
- Spring
- spring boot
- LV2
- 세션로그인
- Lv.2
Archives
- Today
- Total
s00jin 님의 블로그
[Docker/EC2] 배포한 서버가 수정된 코드로 반영되지 않던 이유 본문
돈굴돈굴 돈굴이 프로젝트 진행 중 발생한 트러블 슈팅이다.
프로젝트를 진행하면서 발생한 문제는 크게 두 가지이다.
1. 코드 수정 후 다시 배포를 했지만 배포한 서버에 반영이 안되던 문제
2. 프론트에서 api 요청시 CORS 문제
이렇게 두가지 문제를 해결하는데 제일 오랜 시간을 투자했다.
여기서는 1번 문제에 대한 기록이다.
문제 상황 분석
서버 배포 후 아래와 같은 오류가 발생했다.
2025-06-11T00:16:06.990Z WARN 1 --- [nio-8081-exec-2]
Resolved [org.springframework.web.bind.MissingServletRequestParameterException:
Required request parameter 'budget' for method parameter type int is not present]
기존 코드에서는 budget 파라미터를 받았으나, 수정 된 코드에서는 제거했다.
로컬에서 테스트 후 -> 도커 이미지 생성 & 도커 허브 push -> 서버에서 pull 후 서버 실행 -> budget 문제 발생
로컬에서는 정상 동작했으나, 서버 배포 시 이전 코드가 실행되는 것을 보아 Dockerfile 문제로 판단했다.
원인 분석 | 기존 Dockerfile
# 베이스 이미지 jdk 17
FROM openjdk:21-jdk-slim
# 컨테이너 내부에서 작업할 디렉토리
WORKDIR /app
# 현재 디렉토리의 모든 소스를 아래 도커 디렉토리로 복사
COPY . .
# gradlew에 실행 권한 부여
RUN chmod +x ./gradlew
RUN ./gradlew clean build -x test
# build/libs/PIN-1.0-SNAPSHOT.jar을 /app/PIN.jar로
COPY build/libs/Account-Book-0.0.1-SNAPSHOT.jar /app/ProjectLab_BE.jar
# 컨테이너로 띄울 때 항상 실행되어야 하는 명령어 java -jar /app/PIN.jar
ENTRYPOINT ["java", "-jar", "/app/ProjectLab_BE.jar"]
기존 도커 파일을 살펴보니 copy하는 부분에서 문제가 발생했다.
- COPY . . 로 소스를 복사한 뒤
- 다시 COPY build/libs/... 로 jar 파일을 덮어씀
이 부분에서 최신 코드가 반영된 jar 파일이 아닌 이전에 빌드 된 jar 파일이 컨테이너에 들어가던 것이였다.
문제 해결 | 수정된 Dockerfile
copy 문제를 해결하는 김에 멀티 스테이지 빌드를 적용하여 빌드 환경과 런타임 환경을 분리했다.
# 멀티 스테이지 빌드 사용 -> 빌드 환경과 런타임 환경 분리
# 빌드 단계
# 베이스 이미지 jdk 17
FROM openjdk:21-jdk-slim AS builder
# 컨테이너 내부에서 작업할 디렉토리
WORKDIR /app
# 현재 디렉토리의 모든 소스를 아래 도커 디렉토리로 복사
COPY . .
# gradlew에 실행 권한 부여
RUN chmod +x ./gradlew
RUN ./gradlew clean build -x test
# 런타임 환경
FROM openjdk:21-jdk-slim
WORKDIR /app
# 빌드 환경에서 생성된 jar 파일을 복사
COPY --from=builder /app/build/libs/Account-Book-0.0.1-SNAPSHOT.jar /app/ProjectLab_BE.jar
# 컨테이너로 띄울 때 항상 실행되어야 하는 명령어 java -jar /app/PIN.jar
ENTRYPOINT ["java", "-jar", "/app/ProjectLab_BE.jar"]
수정 된 도커 파일로 다시 배포하니 정상 작동 한다.

문제 해결과 덤으로 멀티 스테이지 빌드를 적용해 이미지 최적화까지 얻었다..!!ㅎㅎ
'프로젝트 > 트러블슈팅' 카테고리의 다른 글
| [동시성 문제] 더블 클릭과 네트워크 문제로 인한 동시성 문제 해결 (0) | 2025.09.18 |
|---|---|
| [CORS 오류] 프론트에서 api 호출 시 CORS 오류 발생 (1) | 2025.09.15 |
| [EC2/MySQL] EC2 서버가 몇 시간 만에 꺼지는 이유와 해결 - OOM 문제 (0) | 2025.09.10 |