1. 소개

이 사용방법(예제)에서는 JPA의 @Index 어노테이션을 사용하여 인덱스를 정의하는 방법에  대해 설명 합니다. 예제를 통해 JPA와 Hibernate를 사용하여 첫 번째 인덱스를 정의하는 방법을 배웁니다. 그런 다음 인덱스를 사용자 지정하는 추가 방법을 보여주는 정의를 수정할 것입니다.

2. @인덱스 어노테이션

빠른 요약을 통해 시작하겠습니다. 데이터베이스 인덱스는 추가 쓰기 및 저장 공간을 희생 하여 테이블에 대한 데이터 검색 작업의 속도를 향상시키는 데이터 구조입니다 . 대부분 단일 테이블에서 선택한 데이터 열의 복사본입니다 . 지속성 계층의 성능을 높이려면 인덱스를 만들어야 합니다.

JPA를 사용하면 @Index를 사용하여 코드에서 인덱스를 정의하여 이를 달성할 수 있습니다 . 이 어노테이션은 스키마 생성 프로세스에 의해 해석되어 자동으로 아티팩트를 생성합니다. 엔티티에 대한 인덱스를 지정할 필요는 없습니다.

이제 정의를 살펴보겠습니다.

2.1. javax.persistence.Index

인덱스 지원은 javax.persistence.Index에 의해 JPA 2.1 사양에 최종적으로 추가되었습니다 . 이 어노테이션을 사용하면 테이블에 대한 인덱스를 정의하고 그에 따라 사용자 정의할 수 있습니다.

@Target({})
@Retention(RUNTIME)
public @interface Index {
    String name() default "";
    String columnList();
    boolean unique() default false;
}

보시다시피 columnList 속성 필수이며 정의해야 합니다. 나중에 예제를 통해 각 매개변수를 더 자세히 살펴보겠습니다.

여기서 주목해야 할 한 가지 측면은 어노테이션이 기본 인덱싱 알고리즘인 btree 변경을 지원하지 않는다는 것입니다.

2.2. JPA 대 최대 절전 모드

JPA는 사양일 뿐입니다. 올바르게 작동하려면 지속성 공급자도 지정해야 합니다. 기본적으로 Hibernate Framework는 Spring에서 제공하는 JPA의 구현입니다. 자세한 내용은 여기에서 읽을 수 있습니다 .

인덱스 지원이 JPA에 매우 늦게 추가되었음을 기억해야 합니다. 그 전에 많은 ORM 프레임워크는 다르게 작동할 수 있는 자체 사용자 정의 구현을 도입하여 인덱스를 지원합니다. Hibernate Framework도 이를 수행하고 org.hibernate.annotations.Index 어노테이션을 도입했습니다 . 해당 프레임워크로 작업하는 동안 JPA 2.1 사양 지원 이후로 더 이상 사용되지 않으며 JPA의 프레임워크를 사용해야 합니다.

이제 기술적인 배경 지식이 있으면 예제를 살펴보고 JPA에서 첫 번째 인덱스를 정의할 수 있습니다.

3. @Index 정의하기

이 섹션에서는 인덱스를 구현합니다. 나중에 다른 사용자 정의 가능성을 제시하면서 수정을 시도할 것입니다.

시작하기 전에 프로젝트를 올바르게 초기화하고 모델을 정의해야 합니다 .

학생 엔터티를 구현해 보겠습니다  .

@Entity
@Table
public class Student implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    // getters, setters
}

모델이 있으면 첫 번째 인덱스를 구현해 보겠습니다. @Index 어노테이션을 추가하기만 하면 됩니다. 우리는에 그렇게 @Table 세 이하 어노테이션 인덱스의 속성. 열의 이름을 지정하는 것을 잊지 마십시오.

@Table(indexes = @Index(columnList = "firstName"))

firstName 열을 사용하여 첫 번째 인덱스를 선언했습니다 . 스키마 생성 프로세스를 실행할 때 유효성을 검사할 수 있습니다.

[main] DEBUG org.hibernate.SQL -
  create index IDX2gdkcjo83j0c2svhvceabnnoh on Student (firstName)

이제 추가 기능을 표시하는 선언을 수정할 차례입니다.

3.1. @인덱스 이름

보시다시피 인덱스에는 이름이 있어야 합니다. 기본적으로 지정하지 않으면 공급자 생성 값입니다. 사용자 지정 레이블을 원할 때 name 속성을 추가하기만 하면 됩니다 .

@Index(name = "fn_index", columnList = "firstName")

이 변형은 사용자 정의 이름으로 인덱스를 생성합니다.

[main] DEBUG org.hibernate.SQL -
  create index fn_index on Student (firstName)

또한, 우리는에서 스키마의 이름을 지정하여 다른 스키마에서 색인을 생성 할 수 있습니다 이름 :

@Index(name = "schema2.fn_index", columnList = "firstName")

3.2. 여러 열 @Index

이제 columnList 구문을 자세히 살펴보겠습니다 .

column ::= index_column [,index_column]*
index_column ::= column_name [ASC | DESC]

이미 알고 있듯이 인덱스에 포함될 열 이름을 지정할 수 있습니다. 물론 단일 인덱스에 여러 열을 지정할 수 있습니다. 이름을 쉼표로 구분하여 수행합니다.

@Index(name = "mulitIndex1", columnList = "firstName, lastName")

@Index(name = "mulitIndex2", columnList = "lastName, firstName")
[main] DEBUG org.hibernate.SQL -
  create index mulitIndex1 on Student (firstName, lastName)
   
[main] DEBUG org.hibernate.SQL -
  create index mulitIndex2 on Student (lastName, firstName)

지속성 공급자는 지정된 열 순서를 준수해야 합니다. 이 예에서 인덱스는 동일한 열 집합을 지정하더라도 약간 다릅니다.

3.3. @인덱스 오더

이전 섹션에서 구문을 검토한 것처럼 column_name 뒤에 ASC (오름차순) 및 DESC (내림차순) 값을 지정할 수도 있습니다  . 인덱싱된 열에 있는 값의 정렬 순서를 설정하는 데 사용합니다.

@Index(name = "mulitSortIndex", columnList = "firstName, lastName DESC")
[main] DEBUG org.hibernate.SQL -
  create index mulitSortIndex on Student (firstName, lastName desc)

각 열의 순서를 지정할 수 있습니다. 그렇지 않으면 오름차순으로 가정합니다.

3.4. @인덱스 고유성

마지막 선택적 매개변수는 인덱스가 고유한지 여부를 정의 하는 고유한 속성입니다. 고유 인덱스는 인덱싱된 필드가 중복 값을 저장하지 않도록 합니다. 기본적으로 false 입니다. 변경하고 싶다면 다음과 같이 선언할 수 있습니다.

@Index(name = "uniqueIndex", columnList = "firstName", unique = true)
[main] DEBUG org.hibernate.SQL -
  alter table Student add constraint uniqueIndex unique (firstName)

그런 식으로 인덱스를 만들 때 @Column 어노테이션 고유 속성 과 마찬가지로 열에 고유성 제약 조건을 추가합니다 . @Index다중 열 고유 제약 조건을 선언할 수 있기 때문에 @Column 보다 이점이 있습니다 .

@Index(name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)

3.5. 단일 엔터티의 여러 @Index

지금까지 다양한 색인 변형을 구현했습니다. 물론 엔터티에 대해 단일 인덱스를 선언하는 것으로 제한되지 않습니다. 선언을 수집하고 모든 단일 인덱스를 한 번에 지정합시다. 중괄호로 @Index 어노테이션 을 반복 하고 쉼표로 구분하여 이를 수행합니다.

@Entity
@Table(indexes = {
  @Index(columnList = "firstName"),
  @Index(name = "fn_index", columnList = "firstName"),
  @Index(name = "mulitIndex1", columnList = "firstName, lastName"),
  @Index(name = "mulitIndex2", columnList = "lastName, firstName"),
  @Index(name = "mulitSortIndex", columnList = "firstName, lastName DESC"),
  @Index(name = "uniqueIndex", columnList = "firstName", unique = true),
  @Index(name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)
})
public class Student implements Serializable

또한 동일한 열 집합에 대해 여러 인덱스를 만들 수도 있습니다.

3.6. 기본 키

인덱스에 대해 이야기할 때 기본 키에서 잠시 멈춰야 합니다. 알다시피 EntityManager관리하는 모든 엔터티 는 기본 키에 매핑되는 식별자를 지정해야 합니다.

일반적으로 기본 키는 특정 유형의 고유 인덱스입니다. 이전에 제시된 방식으로 이 키의 정의를 선언할 필요가 없다는 점을 추가할 가치가 있습니다. 모든 것은 @Id 어노테이션에 의해 자동으로 수행됩니다 .

3.7. 비 엔터티 @Index

인덱스를 구현하는 다양한 방법을 배운 후에는 @Table인덱스 를 지정하는 유일한 장소가 아니라는 점을 언급 해야 합니다. 같은 방식으로 @SecondaryTable , @CollectionTable, @JoinTable , @TableGenerator 어노테이션 에서 인덱스를 선언할 수 있습니다 . 이러한 예는 이 문서에서 다루지 않습니다. 자세한 내용은 javax.persistence JavaDoc을 확인하세요 .

4. 결론

이 기사에서는 JPA를 사용하여 인덱스를 선언하는 방법에 대해 논의했습니다. 우리는 그들에 대한 일반적인 지식을 검토하는 것으로 시작했습니다. 나중에 우리는 첫 번째 인덱스를 구현했고 예제를 통해 이름, 포함된 열, 순서 및 고유성을 변경하여 인덱스를 사용자 지정하는 방법을 배웠습니다. 마지막으로 기본 키와 이를 선언할 수 있는 추가 방법 및 위치에 대해 이야기했습니다.

항상 그렇듯이 기사의 예제는 GitHub에서 사용할 수 있습니다 .

Persistence footer banner