문제 상황
- 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는 내부 동작
- BaseTimeEntity.id → id 컬럼 생성
- 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 |