Spring Data JPA
에서 인덱싱(Indexing)은 데이터베이스 테이블에서 특정 열(column)에 대한 검색 성능을 최적화하기 위한 중요한 개념입니다. 인덱스는 데이터를 빠르게 조회할 수 있도록 도와주는 데이터 구조로, 특히 대규모 데이터셋에서 검색 성능을 크게 향상시킵니다.
JPA에서는 인덱스를 추가하기 위해 엔티티(Entity) 클래스에 @Index 어노테이션을 사용합니다. 이는 해당 엔티티와 매핑된 데이터베이스 테이블에 인덱스를 생성하겠다는 의미입니다. 인덱스는 주로 자주 검색되거나 필터링에 사용되는 열에 추가하는 것이 일반적입니다.
@Table 어노테이션의 사용:
JPA에서는 @Table
어노테이션을 사용하여 테이블 수준에서 인덱스를 정의할 수 있습니다. 이를 통해 여러 열을 기준으로 복합 인덱스(composite index)도 만들 수 있습니다.
import javax.persistence.*;
@Entity
@Table(name = "user", indexes = {
@Index(name = "idx_username", columnList = "username"),
@Index(name = "idx_email", columnList = "email")
})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false, unique = true)
private String email;
// Getter and Setter methods
}
username
과 email
필드에 각각 인덱스가 생성됩니다.@Index
어노테이션의 name
속성은 인덱스의 이름을 지정하며, columnList
속성은 인덱스가 생성될 열을 지정합니다.@Table
의 indexes
속성에 인덱스 정보를 배열 형태로 전달하여 복수의 인덱스를 정의할 수 있습니다.복합 인덱스(Composite Index):
복합 인덱스는 여러 열을 결합하여 하나의 인덱스를 생성하는 방법입니다. 데이터가 다수의 열을 기준으로 자주 검색될 때 사용됩니다.
@Entity
@Table(name = "order", indexes = {
@Index(name = "idx_order_customer_product", columnList = "customer_id, product_id")
})
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "customer_id")
private Long customerId;
@Column(name = "product_id")
private Long productId;
// Getter and Setter methods
}
customer_id
와 product_id
열을 결합하여 복합 인덱스를 생성합니다.