Member와 StudyRoom의 관계 매핑을 지으려고 생각하다보니, 두 엔티티의 관계는 일대다, 다대일 관계가 아니라 다대다임을 알게 되었다. 물론 @ManyToMany를 써서 두 엔티티를 매핑하는 것이 이론적으로 불가능한 것은 아니다.(오히려 편리해보이기도 한다.) 하지만 여기에는 고려할 사항이 몇 가지 더 있었다.
이러한 문제점들을 이해하고, 나는 Member와 StudyRoom을 잇는 MemberStudyRoom이라는 엔티티를 만들었다. 객체는 아래와 같이 구성했다.
@Getter
@NoArgsConstructor
@Entity
public class MemberStudyRoom {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MEMBER_ID")
private Member member;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STUDYROOM_ID")
private StudyRoom studyRoom;
public MemberStudyRoom(Member member, StudyRoom studyRoom) {
setMember(member);
setStudyRoom(studyRoom);
}
public void setMember(Member member) {
this.member = member;
member.getMemberStudyRooms().add(this);
}
public void setStudyRoom(StudyRoom studyRoom) {
this.studyRoom = studyRoom;
studyRoom.getMemberStudyRooms().add(this);
}
}
그리고 생성자를 통해서 어떤 Member가 어떤 StudyRoom에 Join할 때 서로에게 연관관계가 잘 매핑될 수 있도록 연관 편의 메소드도 추가해주었다.