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<>();
}
계층적 카테고리 구조를 효과적으로 관리하기 위해 self-referencing 방식으로 엔티티를 설계했다. 상위 카테고리와 하위 카테고리 간의 관계를 명확하게 정의하고, 계층의 깊이에 따라 유연하게 확장할 수 있도록 설계했다. 상위 카테고리의 ID를 parent 필드로 참조하여 하위 카테고리를 연결하였다.
새로운 카테고리가 추가되거나 기존 카테고리가 변경되더라도, 시스템에 무리가 없도록 확장성을 고려했다. 각 카테고리가 독립적으로 관리될 수 있도록 parent와 children 관계를 설정하여, 기존 카테고리 구조에 영향을 주지 않고 새로운 카테고리를 추가할 수 있도록 했다.
카테고리별로 상품을 쉽게 검색하고 정렬할 수 있도록 tier 필드를 추가하여, 검색 조건에 따라 특정 계층의 카테고리만 선택적으로 검색할 수 있도록했다. 예를 들어, 1단계 카테고리만 조회하거나, 특정 상위 카테고리에 속한 모든 하위 카테고리를 한 번에 검색할 수 있도록 했다.
또한, QueryDSL을 활용해 카테고리별 상품 검색 및 정렬을 처리했으며, 카테고리 구조와 연계하여 동적 쿼리를 생성할 수 있도록 했다.
JPA에서의 셀프 참조 관계를 활용하여 계층형 카테고리를 구현하는 방법을 배울 수 있었다. 앞으로는 이 경험을 바탕으로 더욱 복잡한 카테고리 설계를 시도해보고자 한다.