개요

댓글에 댓글처럼 어떤 엔티티가 줄을 타고 이어지는 경우가 있다. 사내에서 도메인 서비스를 개발하면서 비슷한 케이스가 있어서 고민해보았었다.

예시 서비스는 사용자에게 특정 기능의 연장 기능을 제공한다. 사용자는 해당 기능이 만료되기 일정 기간 전부터 연장을 신청할 수 있으며, 연장 신청 시 새로운 인스턴스가 생성된다. 이 과정에서 새 인스턴스와 이전 연장의 이력 관리가 중요하다.

따라서, 이 서비스에 대한 엔티티 설계에서 연장 이력의 연속성을 관리하는 방안에 대한 효율성을 탐구해야 한다.

사실 엄청 별거 아니지만 그때 고민한 내용과 생각해보았던 내용들을 간단하게 기록해보았다.

목차

현재 방식과 문제점

현재 방식은 엔티티에서 특정 필드를 통해 이전 인스턴스와 연결하는 방식이다.

public class ServiceFeature {
    private String previousInstanceId;

    private boolean isExtendable;
}

이와 같은 방식은 연장 이력의 연속성을 유지하는 데에 직관적이고 효과적이지만, 엔티티들이 계속 연결되면서 발생할 수 있는 성능 문제에 대해서 우려 사항이 있다.

참조 관계를 개선하기

기존 extendFrom 필드를 개선하여, 모든 항목들이 원본 항목을 참조하는 구조로 변경했다. 이를 통해, 모든 항목들이 공통된 원본 ID를 공유함으로써, 이력 관리를 효율적으로 할 수 있게 되었다.

필드명을 originallyDerivedFrom으로 변경하여, 최초 생성된 항목의 ID를 표시하게 함으로써, 각 항목이 어떤 원본에서 파생되었는지 명확히 한다.

@Column(length = 30, columnDefinition = "VARCHAR(30) COMMENT '최초 생성된 항목 아이디'")
private String originallyDerivedFrom;