본문 바로가기

- Spring

[JPA] PhysicalNamingStrategy - Table, Column명 커스텀

반응형

 

저는 보통 테이블이나 컬럼명을 대문자로 사용하는데,

그럴 경우 엔티티에 아래와 같이 테이블이나 컬럼명을 지정해줘야합니다.

 

jpa 설정 시 아래와 같이 physical-strategy를 지정하여 사용하면,

자동으로 대문자로 변환하여 사용할 수 있도록 변경할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
spring:
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
    open-in-view: false
    show-sql: true
    hibernate:
      ddl-auto: none
      format_sql: true
      naming:
        implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
        physical-strategy: com.halfjang.food.mapapi.common.config.NamingStrategy
 

 

기존의 PhysicalNamingStrategy를 아래와 같이 구현하여

원하는 영역만 변경할 수 있는데,

저는 테이블명과 컬럼명만 변경하여 사용하고 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.halfjang.food.mapapi.common.config;
 
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
 
public class NamingStrategy implements PhysicalNamingStrategy {
 
  @Override
  public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
    return convert(name);
  }
 
  @Override
  public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
    return convert(name);
  }
 
  @Override
  public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) {
    return name;
  }
 
  @Override
  public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) {
    return name;
  }
 
  @Override
  public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) {
    return name;
  }
 
  private Identifier convert(Identifier name) {
    if (name == null) {
      return null;
    }
 
    StringBuilder sb = new StringBuilder(name.getText());
    for (int i = 1; i < sb.length() - 1; i++) {
      if (Character.isLowerCase(sb.charAt(i - 1)) && Character.isUpperCase(sb.charAt(i))
          && Character.isLowerCase(sb.charAt(i + 1))) {
        sb.insert(i++'_');
      }
    }
 
    return new Identifier(sb.toString().toUpperCase(), name.isQuoted());
  }
}

 

설정 파일은 애플리케이션 로딩 시 싱글스레드로 동작하여 StringBuffer가 아닌 StringBuilder를 사용했습니다.

 

반응형