[Spring Boot/JPA] Hibernate Naming Strategy

엔티티, 필드 등의 도메인 모델 이름을 데이터베이스의 테이블, 컬럼 등의 물리적 스키마 이름으로 변환하는 규칙을 정의하는 전략
용어
- 논리적 이름(logical name): ORM 매핑 레벨에서 사용하는 추상화된 이름
- 물리적 이름(physical name): 실제 데이터베이스에서 사용되는 최종 이름
- Implicit Naming Strategy:
@Table,@Column을 안 썼을 때 생성되는 논리적 이름을 어떤 규칙으로 만들지 결정하는 전략 - Physical Naming Strategy: 논리적 이름을 바탕으로, 실제 DB 스키마에서 쓸 물리적 이름을 결정하는 전략
변환 과정
명시적 이름이 있는 경우
논리적 이름 → PhysicalNamingStrategy → 물리적 이름 → DB
명시적 이름이 없는 경우
ImplicitNamingStrategy → 논리적 이름 → PhysicalNamingStrategy → 물리적 이름 → DB
사용 방법
방법 1 (권장)
# spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
# spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
spring:
jpa:
hibernate:
naming:
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
physical-strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
방법 2 (Hibernate 네이티브 설정)
# spring.jpa.properties.hibernate.implicit_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
# spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
spring:
jpa:
properties:
hibernate:
implicit_naming_strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
physical_naming_strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
방법 3 (Bean 등록)
ApplicationContext에 PhysicalNamingStrategy 또는 ImplicitNamingStrategy 타입의 Bean이 있으면, Hibernate를 자동으로 그 Bean을 쓰도록 설정
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.boot.model.naming.PhysicalNamingStrategySnakeCaseImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class HibernateNamingConfig {
@Bean
public ImplicitNamingStrategy implicitNamingStrategy() {
return new ImplicitNamingStrategyJpaCompliantImpl();
}
@Bean
public PhysicalNamingStrategy physicalNamingStrategy() {
return new PhysicalNamingStrategySnakeCaseImpl();
}
}
기존에 존재하는 전략 말고, 커스텀으로 전략을 만들어서 적용할 수도 있다.
Implicit Naming Strategy 속성
ImplicitNamingStrategyJpaCompliantImpl
org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
기본값(Hibernate/Spring Boot)
명시를 안하는 경우
- 엔티티→테이블: 클래스명 그대로
- 필드→컬럼: 필드명 그대로
- FK → <필드명>_<참조PK명>
ImplicitNamingStrategyComponentPathImpl
org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
ImplicitNamingStrategyJpaCompliantImpl 와 기본적으로 같은데, 임베디드 타입이면 속성 경로를 컬럼명에 포함시킨다.
<임베디드필드명>_<내부속성명>(_<PK>)처럼 경로 기반으로 만들어짐@AttributeOverride사용 빈도를 감소 ⇒ 컴포넌트 필드명이 컬럼 접두사로 붙여서 충돌을 줄여준다
그 외 (레거시)
- org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
- legacy-jpa(JPA 1.0)를 위한 전략
- org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
- legacy-hbm (hbm.xml 시절)
Physical Naming Strategy 속성
CamelCaseToUnderscoresNamingStrategy
org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
Spring Boot 기본값
- CamelCase를 snake_case로 변환하고 소문자로 만듦
- 특이사항: hibernate에
@Deprecated(since="7", forRemoval=true)이 붙어있고, 대신PhysicalNamingStrategySnakeCaseImpl을 사용하라고 한다.
PhysicalNamingStrategySnakeCaseImpl
org.hibernate.boot.model.naming.PhysicalNamingStrategySnakeCaseImpl
CamelCaseToUnderscoresNamingStrategy 와 동일하게 동작한다.
PhysicalNamingStrategyStandardImpl
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Hibernate 기본값 (Spring Boot 미사용 시)
아무런 변환 없이 논리적 이름을 그대로 물리적 이름으로 사용한다.
레퍼런스
- https://docs.spring.io/spring-boot/appendix/application-properties/index.html#application-properties.data.spring.jpa.hibernate.naming.implicit-strategy
- https://docs.hibernate.org/orm/7.2/javadocs/org/hibernate/boot/model/naming/PhysicalNamingStrategy.html
- https://docs.hibernate.org/orm/7.2/javadocs/org/hibernate/boot/model/naming/ImplicitNamingStrategy.html
'개발 > Backend' 카테고리의 다른 글
| 무신사 코딩테스트 결과물 개선 및 부하테스트 해보기 (5) | 2026.02.21 |
|---|---|
| Spring Security 이해 (2) - 인증 아키텍처 (0) | 2026.02.11 |
| Spring Security 이해 (1) - 서블릿 기반 아키텍처 (0) | 2026.02.10 |
| [Spring Boot] DataSource & HikariCP 설정 정리 (0) | 2026.01.10 |