til
til copied to clipboard
Hibernate Naming Strategies
Naming Strategies
객체를 데이터베이스에 매핑할 때 하이버네이트는 2 단계의 프로세스를 거친다.
- 첫째로, 도메인 모델 매핑으로부터 적절한 논리적 이름을 결정한다. 논리적 이름은 사용자가
@Column
이나@Table
을 사용해서 명시적으로 선언하거나, 하이버네이트의ImplicitNamingStrategy
에 의해 암시적으로 결정된다. - 두번째로, 논리적 이름을
PhysicalNamingStrategy
를 사용해서 물리적 이름으로 변경한다.
이러한 이름 전략은 개발자가 도메인 모델에 제공해야 하는 반복되는 정보의 양을 최소화 하기 위해 고안되었다.
JPA 스펙에서는 논리적 이름이 물리적 이름과 동일하다.
accountNumber -- logical -> accountNumber -- physical -> acct_num
ImplicitNamingStrategy
로 accountNumber
를 acct_num
으로 변환할수도 있지만, 여기서 중요한 것은 관심사의 분리를 통해서 각자의 역할을 분리하는 것이다. ImplicitNamingStrategy
는 명시적인 이름이 부여되지 않았을 경우에만 적용되지만, PhysicalNamingStrategy
는 열 이름이 명시적으로 지정되었는지, 암시적으로 지정되었는지와 관계 없이 적용된다.
Spring Data JPA
스프링 부트에서는 SpringImplicitNamingStrategy
와 SpringPhysicalNamingStrategy
가 기본으로 사용된다.
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
https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#naming