JPA와 Hibernate를 사용하고 있는 개발자라면 hibernate ddl option에 의해 엔티티 클래스가 데이터베이스에 테이블로 자동으로 생성되는 것을 알고 있을 것이다. 이때 테이블명은 여러 전략에 의해 정해지는데 기본적으로는 엔티티 클래스명을 따르고 소문자에 언더바를 넣는 전략을 선택한다.
@Entity
public class UserHistory{
@Id
@GenerateValue(strategy = GenerationType.IDENTITY)
private Long id;
// ..... 기타 등등
}
위와 같이 엔티티 클래스를 작성했을 때 특별한 설정이 없었다면, Hibernate는 다음과 같은 이름으로 테이블을 생성한다.
CREATE TABLE user_history (
id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
.....
}
하지만 다음과 같이 테이블명에 일괄된 이름을 붙이고 싶을 경우도 있다.
# 모든 테이블에 admin_ 이라는 이름이 붙는 예
CREATE TABLE admin_user_history (
....
)
CREATE TABLE admin_user (
....
)
CREATE TABLE admin_log (
....
)
이럴 땐 Hibernate에서 사용하는 PhysicalNamingStrategyStandardImpl를 상속받아 입맛에 맞게 구현하면 된다.
다음 예는 테이블명에 "jpa_"라는 Prefix를 넣는 예제 코드이다.
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.beans.factory.annotation.Value;
public class CustomNamingStrategy extends PhysicalNamingStrategyStandardImpl {
private String PREFIX = "jpa_";
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
Identifier prefixedTableName = new Identifier(PREFIX + name.getText().toLowerCase(), name.isQuoted());
return super.toPhysicalTableName(prefixedTableName, context);
}
}
위와 같이 커스텀 네이밍 클래스를 구현하고 application.yml 또는 appication.properties의 hibernate의 naming속성을 다음과 같이 설정하면 된다(YAML 포맷의 예이다).
spring:
datasource:
url: jdbc:mysql://localhost:3306/jpa
username: root
password: 1234
jpa:
hibernate:
ddl-auto: create
naming:
physical-strategy: com.tistory.johnmarc.jpashop.config.CustomNamingStrategy
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
properties:
hibnerate:
format_sql: true
open-in-view: false
위와 같이 설정하고 어플리케이션을 실행하면 다음과 같이 테이블명 앞에 "jpa_"가 붙어서 생성되는 것을 확인할 수 있다.
쿼리 로그를 보면 성공적으로 테이블을 잘 생성한 것 같다. 실제로 DB에 테이블이 잘 생겼는지 확인을 해보자.
Intellij(Ultimate 버전)에서는 DB를 연동하고 DB와 관련된 조작을 할 수 있는 환경이 기본으로 제공된다. 애플리케이션에서 사용하고 있는 DB를 연동하고, 현재 DB에 있는 테이블을 조회해보면 "jpa_"라는 이름으로 시작하는 테이블이 잘 생성된 것을 확인할 수 있다.
요약: JPA, Hibernate를 사용하고 hibernate의 ddl 기능을 사용하여 테이블을 생성할 때 테이블명에 일관된 명칭을 부여하고 싶은 경우 CustomNamingStrategyClass 를 구현하면 된다.
'Programming > Java' 카테고리의 다른 글
[Intellij IDEA Plugin, Java] SonarLint 코드 퀄리티를 높여보자! (3) | 2020.02.03 |
---|---|
[Java8] Stream API 공부 정리 (1) (2) | 2020.01.16 |
[Gradle] Gradle 에서 Launch4j Plugin 사용해서 exe 실행파일 만들기 (0) | 2019.11.14 |
[Intellij(인텔리제이)] Intellij 내장 Http Client로 API 테스트 해보기 (2) | 2019.08.16 |
Gradle 5.0 버전대에서 Querydsl 사용하기 (2) | 2019.07.21 |