엔티티, 필드 등의 도메인 모델 이름을 데이터베이스의 테이블, 컬럼 등의 물리적 스키마 이름으로 변환하는 규칙을 정의하는 전략

용어

  • 논리적 이름(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 미사용 시)

아무런 변환 없이 논리적 이름을 그대로 물리적 이름으로 사용한다.

 

 

 

레퍼런스