프로젝트/디버깅 경험

AWS Docker와 JMeter 연동 문제(빈 등록 안 됨) 디버깅

j1adev 2025. 5. 29. 13:41

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에 포함되지 않았거나,  
복사/로드 누락이 있었던 것으로 보인다.