이번 카카오 테크 캠퍼스에서 @Table(value="")와 @Column(value="")에서 선언했던 value들이 제대로 적용되지 않는 문제가 발생하게 되었다.
구글링을 통해서 이름 매핑 전략을 사용하라는 조언들을 찾을 수 있었는데, 이름 매핑 전략은 무엇일까?
지금부터 같이 알아보자.
Java에서는 관례상 roleType과 같이 카멜 표기법을 주로 사용한다.
데이터베이스는 관례상 role_type과 같이 언더 스코어를 주로 사용한다.
이렇게 상이한 서로간의 표기법이 매핑시에 충돌 나기에 Spring에서는 아래와 같이 직접적으로 매핑할 수 있는 방법이있다.
@Column(name=”role_type”)
String roleType
위 코드와 같이 직접적으로 표기법을 변경하는 것 말고, 속성을 통해 표기법을 변경할 수 있는 방법이 있다.
Hiberante는 org.hibernate.cfg.ImprovedNamingStrategy
클래스를 제공한다.
해당 클래스는 테이블 명이나 컬럼 명이 생략되면 자바의 카멜 표기법을 테이블의 언더 스코어 표기법으로 매핑한다.
Spring Boot 디폴트는 org.springframework.boot.orm.jpa.SpringNamingStrategy
이며,
SpringNamingStrategy는 ImprovedNamingStrategy 을 상속한 클래스이다.
그렇기에 Spring boot에서는 기본적으로 테이블 명이나 컬럼 명이 생략되면 자바의 카멜 표기법을 테이블의 언더 스코어 표기법으로 매핑한다는 것을 알 수 있다.
만약 내가 선언한 자바의 변수 이름대로 테이블 네이밍을 희망하는 경우에는 어떤 속성을 사용할 수 있을까?
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
← 해당 속성은 java에서 선언했던 변수 이름을 테이블 매핑시에 그대로 사용한다는 뜻이다.
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
← 이 속성 또한 java에서 선언했던 변수 이름을 테이블 매핑시에 그대로 사용한다는 뜻이다.
implicitStrategy 는 value등을 통해서 명시적으로 지정하지않은 테이블들의 규칙을 지정한다.
그외 physical 은 모든 규칙이 적용되고 가장 마지막에 적용되는 규칙이므로 공통적인 DB 규칙을 지정할때 사용하게된다.