[유신사 프로젝트] 상품 1

2025. 11. 16. 22:24프로젝트

코드를 작성하다 보면 @Table 안에 @Index가 들어간 걸 종종 보게 된다.

@Table(
    indexes = {
        @Index(name = "idx_products_seller", columnList = "seller_id"),
        @Index(name = "idx_products_status", columnList = "status"),
        @Index(name = "idx_products_name", columnList = "name")
    }
)

겉으로 보기엔 단순한 설정처럼 보이지만, 내부적으로는 데이터베이스 성능 최적화와 깊은 관련이 있다.
이번 글에서는 내가 개발하면서 헷갈렸던 부분, 새로 이해한 개념을 한 번 정리해보려고 한다.

 

1. @Index란 무엇인가?

JPA 엔티티 수준에서 “이 컬럼으로 인덱스를 생성해줘”라고 명령하는 어노테이션이다.

이 설정은 애플리케이션 실행 시 JPA가 아래와 같은 DDL을 자동으로 생성하는 효과와 동일하다.

CREATE INDEX idx_products_seller ON products(seller_id);
CREATE INDEX idx_products_status ON products(status);
CREATE INDEX idx_products_name ON products(name);

2. 인덱스가 필요한 이유

인덱스는 결국 조회 성능 최적화다.
상품 테이블처럼 데이터가 지속적으로 늘어나는 테이블은 다음과 같은 쿼리가 매우 자주 사용된다.

  • 판매자 ID로 상품 목록 가져오기
  • 노출 상태로 필터링
  • 상품명 검색

이런 조회는 인덱스가 없으면 풀 테이블 스캔이 발생한다.

데이터가 많아지면 많아질수록 차이가 극명해지게 된다.


3. JPA에서 @Index를 사용하면 좋은 점

JPA는 엔티티 정보를 기반으로 테이블을 만들거나 갱신하는데,
이 과정에서 인덱스 설정도 함께 처리해준다.

이 말은 즉,

  • 테이블 생성·수정 시 DDL을 직접 관리할 필요가 줄어들고
  • 운영/개발 환경 간 스키마 차이가 줄어들고
  • 팀 단위 개발 시 인덱스 누락 같은 실수가 사라진다

라는 뜻이다.

특히 대규모 서비스에서는 “인덱스가 있는지 없는지”가
페이지 로딩 속도를 좌우하기 때문에
인덱스를 엔티티 레벨에서 안정적으로 관리하는 게 훨씬 안전하다.