1. 문제 상황
JMeter를 활용해 Spring Boot 프로젝트를 AWS EC2 위 Docker 환경에서 테스트하는 중, 예상치 못한 문제가 발생했다.
하나의 Test Group 안에는 현재 Thread Group1, Thread Group2가 있는데 하나는 성공, 하나는 실패하는 것이다.
JMeter 시나리오 구성:
- Thread Group 1: Slack 메시지 수신 API 테스트( /slack/events ) → 성공, 200 OK
- Thread Group 2: 스케줄러 수동 트리거 API 테스트( /test/run-daily-scheduler )→ 실패, 500 Internal Server Error
- Docker 로그에는 해당 컨트롤러( TestSchedulerController 라는 이름이다) 관련 로그가 전혀 출력되지 않음
- 그러나 IDE(IntelliJ)에서는 문제없이 정상 동작
2. 특이사항 및 증상
- /test/run-daily-scheduler 호출 시 500 에러
- Docker 환경에서는 로그가 아예 출력되지 않음
- @PostConstruct, System.out.println, static {} 블록을 넣어도 전혀 동작하지 않음
- IDE에서 실행하면 @PostConstruct 로그가 잘 출력됨
👉 이 시점에서 의심했다. 클래스 자체가 메모리에 올라가지 않았고, Spring의 빈으로 등록되지 않았다는 것이다. 단순히 메서드가 호출되지 않은 게 아니라, 애초에 컨트롤러 자체가 생성되지 않은 상태였다.
3. 원인 추정 및 진단
3.1 프로파일 미적용 가능성
Dockerfile에 다음처럼 ENTRYPOINT로 프로파일을 지정했으나:
ENTRYPOINT ["java", "-Dspring.profiles.active=docker,mock-openai", "-jar", "/app.jar"]
이렇게 하면 프로파일 설정이 실제로 적용되지 않는다. 즉 application-docker.yml이 무시된다. 그러면 이 속의 spring.data.redis.host: redis도 무시되어서 Redis의 도커 연결도 해지되니 더 문제가 심각해진다.
안정적으로 프로파일을 적용하려면 아래처럼 환경변수로 프로파일을 전달하자.
조치: ENTRYPOINT 설정을 제거하고, docker run 시 환경 변수로 프로파일 전달:
docker run -e SPRING_PROFILES_ACTIVE=docker,mock-openai ...
→ 이후 application-docker.yml 정상 반영 + Redis 연결도 복구됨
3.2 컨트롤러가 빈으로 등록되지 않음
Docker 로그에는 아무런 로그조차 찍히지 않았다.
| static {} 안 찍힘 | JVM이 아예 클래스를 로딩하지 않음 |
| @PostConstruct 안 찍힘 | 빈 등록조차 안 됨 |
해당 컨트롤러는 com.jia.study_tracker.controller라는 별도 패키지에 위치했었다. 이는 다른 컨트롤러와는 다른 곳이었다.
즉, 컨트롤러가 스캔 대상에서 누락되어 빈으로 등록되지 않았던 것이다.
그래서 해당 컨트롤러는 다른 정상작동되는 컨트롤러와 같은 위치에 놓아두었고 그제서야 해결했다.
조치: 문제되는 그 해당 컨트롤러( TestSchedulerController )를 다른 컨트롤러가 있는 곳으로 패키지 이동 → 로그 정상 출력, API 정상 응답 확인
4. 해결 결과
- /test/run-daily-scheduler API: 200 OK 응답
- Redis 연결 정상화 → /actuator/health: UP
- JMeter 부하 테스트 성공
5. 내가 배운 점
✅ 프로파일은 ENTRYPOINT보다 환경변수로 설정하자
- -Dspring.profiles.active=... 방식은 Docker 내에서 예측 불가능한 문제가 발생할 수 있음
- -e SPRING_PROFILES_ACTIVE=...는 Spring이 공식 지원하는 방식이며 신뢰도 높음
✅ 로그가 없다 = 아예 실행되지 않은 것일 수 있다
- 로그가 하나도 없다면, 애초에 빈 등록이 안 된 것일 가능성이 높다
처음에는 해당 컨트롤러가 `com.jia.study_tracker.controller` 패키지에 있었다.
이 위치는 `@SpringBootApplication` 기준으로 볼 때 스캔 대상이 맞았지만,
이상하게도 Docker 환경에서는 아무 로그도 출력되지 않았다.
그러나 같은 코드를 `com.jia.study_tracker.slack` 패키지( 정상작동되는 다른 컨트롤러가 있는 곳)로 옮기자마자
바로 `@PostConstruct`가 실행되고, API 응답도 200 OK가 나왔다.
이는 단순한 컴포넌트 스캔 문제라기보다는,
빌드 과정에서 특정 패키지의 클래스가 JAR에 포함되지 않았거나,
복사/로드 누락이 있었던 것으로 보인다.
'프로젝트 > 디버깅 경험' 카테고리의 다른 글
| Spring 테스트가 끝나지 않던 이유: subscribe(), @Value, MockWebServer (1) | 2025.06.18 |
|---|