Spring 개발일지

[대규모 AI 시스템 프로젝트] 트러블 슈팅

김둘리 2026. 4. 8. 10:00

문제 상황

Spring Boot + JPA + PostgreSQL 환경에서 API 테스트(Postman) 중 아래와 같은 에러가 발생했다.

java.lang.ClassCastException: Cannot cast java.lang.Long to java.util.UUID

또한, 문제 해결 과정에서 DB 스키마를 초기화한 후 서버를 실행했을 때
애플리케이션이 88%에서 멈추고 더 이상 진행되지 않는 현상도 함께 발생했다.


 원인 분석

1. Long → UUID 타입 불일치

기존 프로젝트에서는 PK를 Long 타입으로 사용하고 있었으나,
리팩토링 과정에서 모든 식별자를 UUID로 변경하였다.

하지만 DB에는 여전히 기존 BIGINT(Long) 타입 컬럼이 남아 있었고,
JPA는 이를 UUID로 매핑하려다 캐스팅 에러가 발생했다.

즉, 구분타입

DB BIGINT
Entity UUID

이 불일치로 인해 ClassCastException 발생


2. Hibernate 실행 중 무한 대기 (88% 멈춤)

DB 스키마를 초기화한 후 ddl-auto: create 옵션으로 실행했을 때
Hibernate가 테이블을 생성하는 과정에서 무한 대기 상태에 빠졌다.

원인은 다음과 같다:

  • 기존 DB 세션이 종료되지 않음
  • PostgreSQL에서 락(lock)이 유지된 상태
  • Hibernate가 테이블 생성 중 락을 기다리며 정지

해결 과정

1. DB 스키마 초기화

기존 테이블을 모두 삭제하고 새로 생성하기 위해 스키마를 초기화했다.

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

2. DB 세션 강제 종료

락 문제 해결을 위해 현재 DB를 점유하고 있는 세션을 종료했다.

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'qpang_db'
AND pid <> pg_backend_pid();

 3. 실행 모듈 문제 해결

멀티 모듈 프로젝트에서 common 모듈을 실행하려다 실패했다.

Main class name has not been configured

👉 common은 실행 모듈이 아니므로
실제 서비스 모듈(product, company 등)에서 실행해야 한다.

./gradlew :product:bootRun

4. Hibernate 옵션 조정

초기 안정적인 실행을 위해 다음과 같이 설정 변경

jpa:
  hibernate:
    ddl-auto: create-drop
  • create: 생성 중 문제 발생 시 꼬일 수 있음
  • create-drop: 종료 시 자동 삭제 → 안정적

결과

  • UUID 기준으로 테이블 정상 생성
  • API 호출 정상 동작
  • ClassCastException 해결
  • Hibernate 무한 대기 문제 해결

느낀 점

  1. DB 타입과 Entity 타입은 반드시 일치해야 한다
  2. UUID 전환 시 기존 데이터/스키마 정리가 필수
  3. PostgreSQL은 세션 기반이라 락 관리가 중요하다
  4. 멀티 모듈에서는 실행 모듈을 정확히 구분해야 한다
  5. Hibernate ddl-auto 옵션은 상황에 맞게 사용하는 것이 중요하다