DB/JPA

[JPA] ddl-auto를 썼는데 컬럼이 삭제되지 않는 이유

annovation 2025. 4. 12. 10:35

문제 상황

  • BaseTimeEntity라는 공통 상속 클래스에 id 필드가 존재
  • Schedule이라는 엔티티 클래스에도 별도로 id 필드 존재 (이름이 다르게 설정됨)
  • 두 클래스 모두 @Id 필드 존재 → Hibernate가 각각을 다른 컬럼으로 인식
  • 이후 BaseTimeEntity의 id 필드를 제거했는데, DB에는 여전히 해당 컬럼이 존재하는 문제 발생

왜 삭제가 안되지..?


원인 분석

🔎 Hibernate는 DDL "삭제"까지 책임지지 않는다

Spring Boot에서는 보통 이렇게 ddl-auto를 설정합니다

spring:
  jpa:
    hibernate:
      ddl-auto: update
  • 엔티티만 바꿔도 자동으로 테이블과 컬럼을 생성해준다

💡 하지만, ddl-auto: update의 한계

기능 지원 여부
새로운 컬럼 추가 ✅ 지원
컬럼 수정 (nullable, length 등) ⚠️ 제한적
컬럼 삭제 ❌ 미지원
  • Hibernate는 삭제를 지원하지 않는다.
  • 안전성을 보장하기 위해, Hibernate 입장에선 “진짜 지워도 되는지?”를 판단할 수 없기 때문이다.

왜 컬럼이 중복 생성되었을까?

BaseTimeEntity에 @Id private Long id; → 컬럼명 id
Schedule에 @Id @Column(name = "schedule_id") private Long id; → 컬럼명 schedule_id

 

🔎 Hibernate는 내부 동작

  1. BaseTimeEntity.id → id 컬럼 생성
  2. Schedule.id → schedule_id 컬럼 생성

➡️ 결과 : 둘 다 생성됨

그리고 이후에 BaseTimeEntity.id를 삭제하더라도, Hibernate는 update 모드에서 이걸 감지하고 지우지 않는다.


해결 방법

1. 수동으로 컬럼 삭제

DB 툴에서 해당 컬럼을 직접 삭제

ALTER TABLE schedule DROP COLUMN id;
  • ⚠️ 주의 : FK/PK 의존성 있는 경우 먼저 관계 제거 필요

2. ddl-auto: create로 리셋 (초기 개발 단계에서만 추천)

이 설정은 매번 애플리케이션 실행 시 테이블을 드랍하고 새로 생성

ddl-auto: create
  • ⚠️ 실무에서는 절대 사용 금지 (데이터 날라갑니다)

결론

질문 답변
왜 컬럼이 안 지워졌나요? ddl-auto: update는 컬럼 삭제를 지원하지 않기 때문입니다.
왜 컬럼이 중복 생성됐나요? 서로 다른 이름(@Column)으로 인해 Hibernate가 다른 컬럼으로 판단했기 때문입니다.
어떻게 해결하나요? 수동 삭제 or Flyway 등으로 DDL 관리 도입
실무에선 어떻게 하나요? ddl-auto: none 또는 validate 설정 + 스키마는 직접 관리

 

✅ 요약 : Hibernate는 컬럼을 지워주지 않습니다. 그래서 실수로 남은 컬럼은, 직접 지우는 수밖에 없습니다.


출처

OpenAI ChatGPT (https://openai.com)

반응형

'DB > JPA' 카테고리의 다른 글

[JPA] 더티 체킹 (Dirty Checking)  (0) 2025.03.13
[JPA] 기본키 생성 전략 (추가설명) (업데이트중...)  (0) 2025.03.12
[JPA] 기본키 생성 전략  (0) 2025.03.03
[JPA] BaseEntity  (0) 2025.02.28
[JPA] Enity Annotation  (1) 2024.12.19