Back-End/Spring

Hibernate Naming Strategies

h_jinnny 2024. 6. 26. 15:46

혼자 공부할겸 프로젝트를 진행하다가 예상치못한 오류에 막혀서 많은 시간을 소요하였다.

데이터베이스의 테이블에서 값을 전혀 불러오지 못하는 문제였다.

아무리 찾아봐도 문제를 찾지 못하다가 혹시나 하는 마음에 모든 테이블을 조회해보았고 생성한 적 없는 테이블이 만들어져있는 것을 봤다.

기존에 만든 테이블은 orderItems인데 새로 생성된 테이블은 order_items가 있었다.

분명 엔티티에서 table(name="orderItems")로 작성해서 orderItems테이블과 매핑이 되어있을 것이라고 생각했는데 order_items테이블이 새로 생기며 여기와 매핑을 하고 있던 것이다.

 

이는 바로 Hibernate Naming Strategies의  Physical Naming Strategy의한 것이다.

 

Hibernate Naming Strategies 

Naming Strategies는 Hibernate가 엔티티 클래스의 필드와 데이터베이스 테이블의 컬럼을 매핑하는 방식을 정의한다. 이를 통해 코드를 간결하게 유지하고, 일관된 네이밍 규칙을 적용할 수 있다. Hibernate는 두 가지 주요 네이밍 전략을 제공한다

  • Physical Naming Strategy: 데이터베이스의 실제 테이블 및 컬럼 이름을 결정한다. 논리적 이름을 실제 데이터베이스에 적용할 물리적 이름으로 변환한다.
  • Implicit Naming Strategy: 명시적으로 지정되지 않은 테이블 및 컬럼 이름을 결정한다.

1. Physical Naming Strategy

PhysicalNamingStrategy는 Java 엔티티 필드 이름을 데이터베이스의 실제 테이블 및 컬럼 이름으로 변환하는 방법을 정의한다.

@Entity
@Table(name = "orderItems")
public class OrderItem {
    @Id
    private Long id;
    private String productName;
}

논리적 이름 지정

  • @Table(name = "orderItems")에 의해 논리적 테이블 이름은 orderItems로 지정됩니다.

물리적 이름 변환

  • PhysicalNamingStrategyStandardImpl가 논리적 이름 orderItems를 물리적 이름 order_items로 변환합니다.
  • 즉 카멜케이스를 스네이크케이스로 바꾼다고 볼 수 있다.

2. Implicit Naming Strategy

ImplicitNamingStrategy는 명시적으로 지정되지 않은 경우 기본값으로 사용될 이름을 정의한다. 기본적으로 제공되는 구현은 다음과 같다:

  • ImplicitNamingStrategyLegacyJpaImpl: JPA의 기본 네이밍 규칙을 따른다.
  • ImplicitNamingStrategyComponentPathImpl: 필드명을 기반으로 명명한다.
  • ImplicitNamingStrategyJpaCompliantImpl: JPA 2.0 명명 규칙을 따른다.
@Entity
@Getter
@Setter
public class UserAccount {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String userName;
}

ImplicitNamingStrategyLegacyJpaImpl을 사용할 경우, UserAccount 엔티티는 user_account 테이블에 매핑되고, userName 필드는 user_name 컬럼에 매핑된다.

 

 

모두들 테이블명과 컬럼명에 잘 매핑했다고 생각하고 그냥 넘어가지말고 다시한번 확인해보며 시간을 줄이면 좋을거같다