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
);
}
}