til icon indicating copy to clipboard operation
til copied to clipboard

Hibernate Naming Strategies

Open raycon opened this issue 3 years ago • 1 comments

Naming Strategies

객체를 데이터베이스에 매핑할 때 하이버네이트는 2 단계의 프로세스를 거친다.

  • 첫째로, 도메인 모델 매핑으로부터 적절한 논리적 이름을 결정한다. 논리적 이름은 사용자가 @Column 이나 @Table을 사용해서 명시적으로 선언하거나, 하이버네이트의 ImplicitNamingStrategy에 의해 암시적으로 결정된다.
  • 두번째로, 논리적 이름을 PhysicalNamingStrategy를 사용해서 물리적 이름으로 변경한다.

이러한 이름 전략은 개발자가 도메인 모델에 제공해야 하는 반복되는 정보의 양을 최소화 하기 위해 고안되었다.

JPA 스펙에서는 논리적 이름이 물리적 이름과 동일하다.

accountNumber -- logical -> accountNumber -- physical -> acct_num

ImplicitNamingStrategyaccountNumberacct_num으로 변환할수도 있지만, 여기서 중요한 것은 관심사의 분리를 통해서 각자의 역할을 분리하는 것이다. ImplicitNamingStrategy는 명시적인 이름이 부여되지 않았을 경우에만 적용되지만, PhysicalNamingStrategy는 열 이름이 명시적으로 지정되었는지, 암시적으로 지정되었는지와 관계 없이 적용된다.

Spring Data JPA

스프링 부트에서는 SpringImplicitNamingStrategySpringPhysicalNamingStrategy가 기본으로 사용된다.

SpringPhysicalNamingStrategy는 논리적 이름이 camelCase일 경우 snake_case로 변경하기 때문에 다음과 같은 코드에서 에러가 발생한다.

@Column("columnName")    // columnName -> column_name 으로 변환된다.
private String columnOne;

@Column("column_name")
private String columnTwo;

논리적 이름을 그대로 사용하기 위해서는 SpringImplicitNamingStrategy 대신 PhysicalNamingStrategyStandardImpl을 사용해야 한다.

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

raycon avatar Mar 30 '21 05:03 raycon

https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#naming

raycon avatar Mar 30 '21 05:03 raycon