1. 소개
Spring Data JPA는 애플리케이션에서 JPA를 사용할 수 있는 많은 기능을 제공합니다. 이러한 기능 중에는 DDL 및 DML 쿼리 모두에서 테이블 및 열 이름의 표준화가 있습니다.
이 짧은 사용방법(예제)에서는 이 기본 명명 규칙을 구성하는 방법을 살펴보겠습니다.
2. 기본 명명 규칙
먼저 테이블 및 열 이름에 관한 Spring의 기본 명명 규칙을 살펴보겠습니다.
Person 엔터티 가 있다고 가정해 보겠습니다 .
@Entity
public class Person {
@Id
private Long id;
private String firstName;
private String lastName;
}
여기에 데이터베이스에 매핑해야 하는 몇 가지 이름이 있습니다. 음, Spring은 기본적으로 소문자 스네이크 케이스를 사용합니다. 즉, 소문자만 사용하고 단어를 밑줄로 구분합니다. 따라서 Person 엔터티 에 대한 테이블 생성 쿼리는 다음과 같습니다.
create table person (id bigint not null, first_name varchar(255), last_name varchar(255), primary key (id));
모든 이름을 반환하는 선택 쿼리는 다음과 같습니다.
select first_name from person;
이를 위해 Spring은 Hibernate의 PhysicalNamingStrategy 버전 인 SpringPhysicalNamingStrategy 를 구현했습니다 .
3. RDMS 대소문자 구분
사용자 지정 명명 규칙을 만드는 방법에 대해 자세히 알아보기 전에 RDMS가 식별자의 대/소문자를 관리하는 방법에 대해 조금 이야기해 보겠습니다.
고려해야 할 두 가지 시나리오가 있습니다. RDMS는 대소문자를 구분하거나 그렇지 않습니다.
첫 번째 상황 에서 RDMS는 대소문자가 동일한 식별자를 엄격하게 일치시킵니다 . 따라서 이 예에서는 다음 쿼리가 작동합니다.
select first_name from person;
이것은 오류를 발생시키고 결과를 반환하Map 않습니다.
select FIRST_NAME from PERSON;
반면 대소문자를 구분하지 않는 RDMS의 경우 두 쿼리가 모두 작동했을 것입니다.
RDMS가 케이스와 관련된 식별자도 일치하도록 강제하려면 어떻게 해야 합니까? 인용된 식별자 (예: "사람")를 사용할 수 있습니다.
식별자 주위에 따옴표를 사용하여 해당 식별자를 테이블 및 열 이름과 비교할 때 대소문자도 일치해야 한다고 데이터베이스에 알립니다. 따라서 여전히 예제를 사용하면 다음 쿼리가 작동합니다.
select "first_name" from "person";
이것은 그렇지 않지만:
select "first_name" from "PERSON";
하지만 이론적으로는 각 RDMS가 고유한 방식으로 인용된 식별자를 관리하므로 마일리지가 다양 합니다.
4. 사용자 지정 명명 규칙
이제 고유한 명명 규칙을 구현해 보겠습니다.
Spring 소문자 스네이크 케이스 전략을 사용할 수 없지만 대문자 스네이크 케이스를 사용해야 한다고 상상해 보십시오. 그런 다음 PhysicalNamingStrategy 구현을 제공 해야 합니다 .
스네이크 케이스를 유지할 것이므로 가장 빠른 옵션은 SpringPhysicalNamingStrategy 에서 상속 하고 식별자를 대문자로 바꾸는 것입니다.
public class UpperCaseNamingStrategy extends SpringPhysicalNamingStrategy {
@Override
protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
return new Identifier(name.toUpperCase(), quoted);
}
}
우리는 슈퍼 클래스에서 식별자를 소문자로 바꾸는 일을 담당하는 getIdentifier() 메서드를 재정의할 뿐입니다. 여기서는 대문자로 변환하는 데 사용합니다.
일단 구현을 작성했으면 Hibernate가 그것을 사용한다는 것을 알 수 있도록 그것을 등록해야 합니다. Spring을 사용하면 이는 application.properties 에서 spring.jpa.hibernate.naming.physical-strategy 속성 을 설정하여 수행됩니다 .
spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UpperCaseNamingStrategy
이제 쿼리는 대문자 식별자를 사용합니다.
create table PERSON (ID bigint not null, FIRST_NAME varchar(255), LAST_NAME varchar(255), primary key (ID));
select FIRST_NAME from PERSON;
RDMS가 대소문자를 일치시키도록 인용된 식별자를 사용한다고 가정해 봅시다. 그런 다음 Identifier () 생성자 의 인용 된 인수 로 true 를 사용해야 합니다 .
@Override
protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
return new Identifier(name.toUpperCase(), true);
}
쿼리가 인용된 식별자를 표시한 후:
create table "PERSON" ("ID" bigint not null, "FIRST_NAME" varchar(255), "LAST_NAME" varchar(255), primary key ("ID"));
select "FIRST_NAME" from "PERSON";
5. 결론
이 짧은 기사에서 우리는 Spring Data JPA를 사용하여 사용자 정의 이름 지정 전략을 구현할 가능성과 RDMS가 내부 구성과 관련하여 DDL 및 DML 문을 처리하는 방법에 대해 이야기했습니다.
늘 그렇듯이 이 기사의 전체 코드는 GitHub 에서 찾을 수 있습니다 .