WindsomeProject - 카테고리 테이블 설계

박민수·2024년 8월 29일
post-thumbnail

개요

WindsomeProject에서는 다양한 상품을 효율적으로 관리하고 검색할 수 있도록, 셀프 참조 구조를 활용한 카테고리 테이블을 설계했다. 이번 글에서는 그 설계 과정과 고려 사항에 대해 간략하게 정리해 보고자 한다.

설계 목표

카테고리 테이블을 설계할 때 주요 목표는 다음과 같다.

  • 계층적 구조 관리: 카테고리 간의 상하위 관계를 명확하게 정의하여, 계층 구조를 쉽게 확장할 수 있도록 한다.
  • 유연한 검색과 정렬: 카테고리별로 상품을 쉽게 검색하고 정렬할 수 있도록 최적화된 구조를 설계한다.
  • 확장성: 새로운 카테고리가 추가되거나 기존 카테고리가 변경되더라도, 시스템에 무리가 없도록 확장성을 고려한다.

카테고리 엔티티 설계

카테고리 엔티티는 계층적 구조를 관리하기 위해 self-referencing 방식으로 설계했다. 이 방식은 상위 카테고리와 하위 카테고리 간의 관계를 명확하게 정의하며, 계층 구조가 깊어지더라도 유연하게 확장할 수 있는 구조이다.

엔티티 필드

@Entity
@Getter @Setter @EqualsAndHashCode(of = "id", callSuper = false)
@Builder @AllArgsConstructor @NoArgsConstructor
@ToString(exclude = {"parent", "children"})
public class Category {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "category_id")
    private Long id;

    private String name;

    private String tier;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private Category parent;

    @OneToMany(mappedBy = "parent")
    private List<Category> children = new ArrayList<>();
}

필드 설명

  • id: 카테고리의 고유 식별자이다. @GeneratedValue를 사용해 자동으로 ID를 생성하며, 기본 키로 사용된다.
  • name: 카테고리의 이름이다. 각 카테고리를 구분하기 위한 필드이다.
  • tier: 카테고리의 계층을 나타내는 필드이다. 예를 들어, 1단계(상위) 카테고리인지, 2단계(하위) 카테고리인지를 구분하는 데 사용된다.
  • parent: 상위 카테고리를 참조하는 @ManyToOne 관계의 필드이다. 각 카테고리는 상위 카테고리를 가질 수 있으며, 이를 통해 계층적 구조를 형성한다. fetch = FetchType.LAZY를 사용하여 필요할 때만 상위 카테고리를 로딩하도록 최적화했다.
  • children: 하위 카테고리 목록을 관리하는 @OneToMany 관계의 필드이다. parent 필드와 양방향 연관 관계를 맺고 있어, 한 카테고리가 여러 하위 카테고리를 가질 수 있다.

설계 시 고민한 사항

계층적 구조의 관리

계층적 카테고리 구조를 효과적으로 관리하기 위해 self-referencing 방식으로 엔티티를 설계했다. 상위 카테고리와 하위 카테고리 간의 관계를 명확하게 정의하고, 계층의 깊이에 따라 유연하게 확장할 수 있도록 설계했다. 상위 카테고리의 ID를 parent 필드로 참조하여 하위 카테고리를 연결하였다.

카테고리 확장성

새로운 카테고리가 추가되거나 기존 카테고리가 변경되더라도, 시스템에 무리가 없도록 확장성을 고려했다. 각 카테고리가 독립적으로 관리될 수 있도록 parent와 children 관계를 설정하여, 기존 카테고리 구조에 영향을 주지 않고 새로운 카테고리를 추가할 수 있도록 했다.

효율적인 검색과 정렬

카테고리별로 상품을 쉽게 검색하고 정렬할 수 있도록 tier 필드를 추가하여, 검색 조건에 따라 특정 계층의 카테고리만 선택적으로 검색할 수 있도록했다. 예를 들어, 1단계 카테고리만 조회하거나, 특정 상위 카테고리에 속한 모든 하위 카테고리를 한 번에 검색할 수 있도록 했다.

또한, QueryDSL을 활용해 카테고리별 상품 검색 및 정렬을 처리했으며, 카테고리 구조와 연계하여 동적 쿼리를 생성할 수 있도록 했다.

결론

JPA에서의 셀프 참조 관계를 활용하여 계층형 카테고리를 구현하는 방법을 배울 수 있었다. 앞으로는 이 경험을 바탕으로 더욱 복잡한 카테고리 설계를 시도해보고자 한다.

profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글