kjp0411 님의 블로그
내일배움캠프 단기심화 Java - 본 캠프 Day 59 본문
TIL - 2026.05.07
오늘 한 일
오늘은 MSA 티켓팅 시스템의 통합 테스트 환경을 점검하면서 Keycloak 인증 설정, Eureka 서비스 등록 상태, Docker Compose 기반 서비스 실행 흐름을 확인했다.
특히 Gateway, Config Server, Eureka, Keycloak, 각 도메인 서비스가 정상적으로 연결되는지 확인했고, 일부 서비스가 Eureka에 등록되지 않거나 Spring Boot 애플리케이션이 반복적으로 재시작되는 문제를 중심으로 원인을 분석했다.
또한 Keycloak Realm import 동작과 JWT Access Token 만료 시간 설정이 실제 테스트 흐름에 어떤 영향을 주는지도 함께 확인했다.
진행한 작업
1. Keycloak Realm Import 동작 확인
Keycloak 컨테이너 로그를 확인했을 때 다음과 같은 메시지가 출력되었다.
Realm 'ticketing' already exists. Import skipped
Import finished successfully
이를 통해 Keycloak은 컨테이너 실행 시 realm-export.json을 import하려고 하지만, 이미 동일한 Realm이 존재하면 기존 설정을 덮어쓰지 않는다는 것을 확인했다.
따라서 realm-export.json 파일에서 Access Token Lifespan 값을 수정하더라도 기존 Realm이 이미 존재하는 상태라면 해당 변경 사항이 바로 반영되지 않는다.
이 경우 설정을 반영하려면 다음과 같은 방법이 필요하다.
1. Keycloak 관리자 콘솔에서 직접 수정
2. 기존 Realm 삭제 후 다시 import
3. Keycloak DB 볼륨을 삭제하고 초기 상태에서 import
이번 작업을 통해 단순히 설정 파일만 수정하고 컨테이너를 재시작하는 것으로는 Keycloak 기존 Realm 설정이 변경되지 않을 수 있다는 점을 알게 되었다.
2. JWT 토큰 만료 시간 설정 확인
통합 테스트 중 JWT 토큰이 빠르게 만료되면 API 자체에는 문제가 없어도 Gateway 인증 단계에서 요청이 차단될 수 있다.
현재 인증 흐름은 다음과 같다.
사용자 로그인
→ Keycloak에서 JWT 발급
→ Gateway에서 JWT 검증
→ 내부 서비스로 요청 전달
즉, Gateway가 먼저 JWT를 검증하기 때문에 Access Token Lifespan이 너무 짧으면 테스트 도중 인증 실패가 발생할 수 있다.
MVP 통합 테스트를 안정적으로 진행하기 위해 Keycloak의 Access Token 만료 시간 설정을 확인했고, 실제 설정이 반영되었는지 관리자 콘솔과 로그를 기준으로 함께 점검했다.
3. Eureka 서비스 등록 상태 점검
Docker Compose로 여러 서비스를 실행했지만 Eureka Dashboard에 모든 서비스가 등록되지 않는 문제가 있었다.
이 경우 Eureka 화면만 확인하는 것이 아니라 각 서비스 컨테이너가 정상 실행 중인지 먼저 확인해야 한다.
확인에 사용한 명령어는 다음과 같다.
docker ps
docker logs --tail=300 컨테이너명
Eureka에 서비스가 등록되지 않는 대표적인 원인은 다음과 같다.
1. 서비스가 정상 실행되지 않고 재시작되는 경우
2. Config Server 연결 실패로 애플리케이션 부팅이 중단되는 경우
3. Eureka defaultZone 설정이 잘못된 경우
4. Docker 내부 네트워크 기준 주소와 localhost 기준 주소가 섞인 경우
5. DB, Kafka, Redis 등 의존 인프라 연결 실패로 서비스가 종료되는 경우
특히 Docker 컨테이너 내부에서 localhost는 내 PC가 아니라 자기 자신을 의미한다.
따라서 컨테이너끼리 통신할 때는 다음과 같이 Docker Compose의 서비스명을 기준으로 접근해야 한다.
eureka:
client:
service-url:
defaultZone: http://eureka-server:10001/eureka/
반대로 로컬 IDE에서 직접 실행할 때는 다음처럼 localhost 기준 주소가 필요할 수 있다.
eureka:
client:
service-url:
defaultZone: http://localhost:10001/eureka/
이번 점검을 통해 로컬 실행 환경과 Docker 실행 환경의 설정을 분리하거나, 환경변수로 관리하는 것이 중요하다는 점을 다시 확인했다.
4. Spring Boot 반복 재시작 원인 분석
일부 서비스에서 Spring Boot 로고가 계속 반복해서 출력되는 상황이 있었다.
처음에는 서비스가 실행되는 것처럼 보였지만, 실제로는 애플리케이션이 부팅 중 예외로 종료되고 컨테이너가 다시 시작되는 상황일 가능성이 높았다.
이런 경우에는 다음 명령어를 통해 컨테이너 상태와 로그를 확인해야 한다.
docker ps
docker logs --tail=300 컨테이너명
docker inspect 컨테이너명
특히 docker ps에서 STATUS가 계속 바뀌거나 Restarting 상태라면 정상 실행이 아니라 재시작 루프에 빠진 것이다.
이번에 다시 정리한 확인 순서는 다음과 같다.
1. 컨테이너 상태 확인
2. 서비스 로그 확인
3. Config Server 연결 여부 확인
4. DB, Kafka, Redis 연결 설정 확인
5. Eureka 등록 여부 확인
문제 상황
오늘 발생한 주요 문제는 다음과 같다.
- Keycloak realm-export.json 수정 내용이 바로 반영되지 않음
- JWT 토큰 만료 시간 설정이 기존 Realm에 적용되지 않을 가능성 확인
- Docker Compose로 서비스 실행 후 Eureka에 일부 서비스가 보이지 않음
- 일부 Spring Boot 서비스가 정상 실행되지 않고 반복 재시작되는 현상 발생
- Docker 환경과 로컬 IDE 실행 환경의 주소 설정 기준이 달라 혼동 발생
해결 및 확인한 내용
각 문제에 대해 다음과 같이 확인했다.
- Keycloak 로그를 통해 기존 Realm이 존재하면 import가 skip된다는 것을 확인했다.
- Access Token Lifespan 변경은 관리자 콘솔 또는 Realm 재생성이 필요하다는 것을 확인했다.
- Eureka에 보이지 않는 서비스는 먼저 해당 서비스 컨테이너 로그를 확인해야 한다는 점을 정리했다.
- Spring Boot 로고가 반복 출력되는 경우 컨테이너 재시작 루프를 의심해야 한다는 것을 확인했다.
- Docker 내부 통신에서는 localhost가 아니라 Compose 서비스명을 사용해야 한다는 점을 다시 점검했다.
알게 된 점
MSA 통합 테스트에서는 단순히 개별 서비스의 코드만 맞는다고 전체 흐름이 정상 동작하지 않는다.
다음 요소들이 모두 맞물려야 정상적인 통합 테스트가 가능하다.
- Gateway 라우팅
- Keycloak JWT 인증
- Access Token 만료 시간
- Eureka 서비스 등록
- Config Server 설정 주입
- Docker 네트워크
- DB, Kafka, Redis 연결
- 각 서비스의 포트 및 환경변수
특히 오늘은 Keycloak과 Eureka 관련 설정에서 많은 것을 배웠다.
Keycloak은 Realm이 이미 존재하면 import 파일을 다시 적용하지 않을 수 있고, Eureka는 서비스가 정상적으로 부팅되어야만 등록된다.
따라서 문제가 발생했을 때는 단순히 화면에 보이는 결과만 보는 것이 아니라, 로그와 실행 상태를 기준으로 원인을 좁혀야 한다.
느낀 점
오늘 작업을 하면서 MSA 환경에서는 기능 구현만큼이나 실행 환경 구성과 서비스 간 연결 상태를 관리하는 것이 중요하다는 것을 느꼈다.
단일 서버 프로젝트에서는 애플리케이션 하나만 실행하면 되지만, MSA에서는 Gateway, Config Server, Eureka, Keycloak, DB, Kafka, Redis 등 여러 구성 요소가 함께 정상 동작해야 한다.
특히 팀 프로젝트에서는 각 서비스의 포트, 설정 파일, 환경변수, 라우팅 기준이 다르면 통합 테스트 과정에서 문제가 계속 발생할 수 있다.
앞으로는 통합 테스트를 진행하기 전에 다음 항목을 먼저 확인하는 습관을 가져야겠다.
1. Docker 컨테이너 상태
2. 각 서비스 로그
3. Config Server 연결 여부
4. Eureka 등록 여부
5. Gateway 라우팅 설정
6. Keycloak JWT 설정
7. 실제 API 요청 결과
오늘은 단순히 에러를 해결하는 것을 넘어서, MSA 환경에서 문제를 추적하는 순서와 기준을 정리할 수 있었던 하루였다.
내일 할 일
- Eureka에 등록되지 않는 서비스 로그 추가 확인
- 반복 재시작되는 서비스의 정확한 예외 원인 분석
- Gateway 라우팅과 각 서비스 API 경로 점검
- Keycloak 토큰 만료 시간 설정 최종 확인
- MVP 통합 테스트 흐름 재정리'TIL' 카테고리의 다른 글
| 내일배움캠프 단기심화 Java - 본 캠프 Day 61 (0) | 2026.05.12 |
|---|---|
| 내일배움캠프 단기심화 Java - 본 캠프 Day 60 (0) | 2026.05.08 |
| 내일배움캠프 단기심화 Java - 본 캠프 Day 58 (0) | 2026.05.06 |
| 내일배움캠프 단기심화 Java - 본 캠프 Day 57 (0) | 2026.05.04 |
| 내일배움캠프 단기심화 Java - 본 캠프 Day 56 (0) | 2026.05.01 |
