나 JAVA 봐라

Embeddable Type 본문

Spring/Spring Boot

Embeddable Type

cool_code 2024. 1. 9. 16:27

review 엔티티에 이어, review에 대한 반응을 남기는 기능을 구현하기 위해 Embedded Type에 대해 알아보게 되었다.

 

review 반응을 저장하기 위한 review_reaction DB를 새로 구상해보았더니 필드를 아래와 같이 구성해야한다.

  • reviewReactionPK(ReviewReactionPK) : reviewId와 userId를 갖는 Embedded PK
  • reviewReaction(int) : 어떤 반응을 남겼는지를 나타내는 int (반응은 1부터 5까지 있다. )

Embedded Type이란,

  • 여러 개의 컬럼을 하나의 객체로 묶어서 사용하는 것을 의미하며, 이 객체를 엔티티의 일부로 사용할 수 있다.
  • @Embeddable : JPA에서 임베디드 타입을 정의하는데 사용되는 어노테이션, 해당 클래스가 Embedded Type임을 JPA에게 알린다.
  • ex) 주소 정보를 갖는 Address 클래스가 있고 이를 User 엔터티에 포함하고 싶을 때, Address 클래스에 @Embeddable을 붙이고 User 엔터티 클래스에서 @Embedded 어노테이션을 사용하여 포함할 수 있다.

위의 필드 중, ReviewReactionPK을 클래스로 구현을 해보았다.

@Embeddable 을 사용했다.

@Getter
@EqualsAndHashCode
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Embeddable
public class ReviewReactionPK implements Serializable {

    @Column(name = "user_id", nullable = false)
    private Long userId;

    @Column(name = "review_id", nullable = false)
    private Long reviewId;

    private ReviewReactionPK(Long userId, Long reviewId) {
        this.userId = userId;
        this.reviewId = reviewId;
    }

    public static ReviewReactionPK of(Long userId, Long reviewId) {
        return new ReviewReactionPK(
                userId,
                reviewId
        );
    }
}

그리고 위와 같이 생성해준 클래스를 포함하는 ReviewReaction 를 아래와 같이 구현했다.

@EmbeddedId 를 사용하여 복합키로 선언했다.

@Slf4j
@ToString
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = {"reviewReactionPK"})
@EntityListeners(AuditingEntityListener.class)
@Entity(name = "review_reaction")
public class ReviewReaction {

    @EmbeddedId
    private ReviewReactionPK reviewReactionPK;

    @Column(name = "reaction_type", nullable = false)
    private int reactionType;

    private ReviewReaction(ReviewReactionPK reviewReactionPK, int reactionType) {
        this.reviewReactionPK = reviewReactionPK;
        this.reactionType = reactionType;
    }

    public static ReviewReaction of(ReviewReactionPK reviewReactionPK, int reactionType) {
        return new ReviewReaction(
                reviewReactionPK,
                reactionType
        );
    }
}