[JPA] 싱글 테이블 전략

Oublie-le·2024년 10월 9일

스프링(게시판)

목록 보기
2/3

단일 테이블 상속 전략(Single Table Inheritance)

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
-@DiscriminatorColumn을 통해 상속 구조를 구성
-공통 부모 클래스를 두고, 하위 클래스를 구분하여 관리할 수 있는 구조

주요 개념

Discriminator Column(구분 컬럼): @DiscriminatorColumn을 부모 클래스에 설정하면, 해당 테이블에 상속받은 엔티티의 종류를 구분하는 컬럼이 생성됩니다. 예를 들어, 부모 클래스가 Heart일 때, 이 테이블에 dtype이라는 구분 컬럼이 생기고, 이 컬럼에 POST 또는 COMMENT 등의 값이 들어갑니다.

Discriminator Value(구분 값): 각 자식 클래스에서 @DiscriminatorValue를 통해 해당 클래스가 테이블에 어떻게 구분되어 저장될지를 정의합니다. 예를 들어, PostHeart라는 클래스는 @DiscriminatorValue("POST")로 지정해줄 수 있고, CommentHeart는 @DiscriminatorValue("COMMENT")로 지정할 수 있습니다.

예시코드

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 상속 전략으로 단일 테이블 사용
@DiscriminatorColumn(name = "dtype") // 구분 컬럼 "dtype" 생성
public abstract class Heart {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;
}

@Entity
@DiscriminatorValue("POST") // "POST"로 구분되는 하위 클래스
public class PostHeart extends Heart {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    private Post post;
}

@Entity
@DiscriminatorValue("COMMENT") // "COMMENT"로 구분되는 하위 클래스
public class CommentHeart extends Heart {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "comment_id")
    private Comment comment;
}

이 방법의 장점:

테이블 절약: SINGLE_TABLE 전략은 하나의 테이블에서 상속 관계를 관리하므로, 좋아요와 관련된 모든 데이터를 한 테이블에 저장합니다. 따라서 테이블 수가 줄어들고, 한 번의 조회로 좋아요 데이터를 가져올 수 있어 성능상 이점이 있을 수 있습니다.

구조적 일관성: dtype 컬럼을 사용해 특정 좋아요가 게시글을 대상으로 한 것인지, 댓글을 대상으로 한 것인지를 구분할 수 있습니다. 이를 통해 Heart라는 공통된 부모 클래스를 통해 재사용 가능한 비즈니스 로직을 구현할 수 있습니다.

확장성: 새로운 좋아요 유형(예: 첨부 파일에 대한 좋아요 등)이 생길 경우, 이를 간단히 상속 구조로 추가하면 되므로 확장성이 좋습니다.

SINGLE_TABLE 전략의 단점:

단일 테이블에 모든 데이터를 저장하기 때문에 테이블이 비대해질 수 있습니다. 특히 좋아요가 많은 경우, 모든 좋아요 데이터를 한 테이블에 저장하면 테이블 크기가 매우 커질 수 있습니다.

nullable한 컬럼이 늘어날 수 있습니다. 예를 들어, PostHeart는 post_id가 있지만 comment_id는 null이 되고, 반대로 CommentHeart는 comment_id가 있지만 post_id가 null이 됩니다. 즉, 데이터가 많아질수록 테이블 내의 null 값이 증가할 수 있습니다.

profile
개발자 지망생

0개의 댓글