[Spring][프로젝트] JPA Naming 전략

모두한·2021년 12월 6일
3

쇼핑몰프로젝트

목록 보기
2/3
post-thumbnail
post-custom-banner

JPA의 기본 테이블 DDL Naming 전략

  • 기본적으로 JPA는 DDL을 진행할 때 Entity이름과 해당 필드들을 lower_under_score 방식을 이용합니다.
  • 예를들어


이 Entity는

이와 같은 lowerCarmelCaselower_snake_case로 변환하여 테이블을 생성합니다.

문제 발생 지점

  • 저희 프로젝트에서는 테이블과 컬럼명을 모두 UPPER_SNAKE_CASE로 명명하기로 기획했습니다.
  • 따라서 위와 같은 기본 JPA Naming전략은 맞지가 않습니다.

MySQL같은 경우는 쿼리를 날릴 때 두가지 설정인 경우가 있습니다. 문자의 대소문자를 확실히 구분하는 설정과 그렇지 않은 설정
예를들어, SELECT team_id FROM team; SELECT TEAM_ID FROM TEAM; 을 구분하여 조회하는 설정(두 쿼리의 결과가 다른)과 그렇지 않은(두 쿼리의 결과가 같은)설정입니다. 저희 DB설정은 전자인 상황이었습니다.

문제 해결 방법

새로운 전략클래스를 SpringPhysicalNamingStrategy를 상속받아 Custom하여 설정값으로 물려주는 방법

SpringPhysicalNamingStrategy

클래스를 잠시 들어가봅니다. 들어가서 소스를 보게 되면 위에서 말한 기본전략이 구현되어있는 부분을 보실 수 있습니다.

  • 이 부분 때문에 위와같은 Naming 기법이 적용되었던 것입니다.
  • 이 부분만 잘 오버라이딩하여 SpringBoot에 설정 해주면 됩니다.
public class UpperCaseNamingStrategy extends SpringPhysicalNamingStrategy {

    @Override
    protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
        return new Identifier(name.toUpperCase(), quoted); // 파라미터로 넘어온 name값을 대문자화 시킵니다.
    }
}
  1. 위와 같은 UpperCaseNamingStrategy 클래스를 만듭니다.
  2. 파라미터로 넘어온 name값을 대문자화 시켜 리턴시킵니다.

    참고로 파라미터로 넘어오는 name의 값은 아래 그림과 같습니다.

    OrderItem 이란 클래스를 Order_Item으로 만들어 버리는군요

  3. application.yml에 아래와 같은 설정을 넣어줍니다.
spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: web.common.strategy.UpperCaseNamingStrategy # 커스텀클래스 패키지

이렇게 설정 후에 다시 로그를 보시면

저희가 원한대로 UPPER_SNAKE_CASE가 적용된 모습을 볼 수 있습니다.

참고사이트
1. https://www.baeldung.com/spring-data-jpa-custom-naming
2. https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/howto-data-access.html#howto-configure-hibernate-naming-strategy

profile
개발자 모두한
post-custom-banner

0개의 댓글