[Spring] N:M, 다대다 연관 관계

WJ·2023년 7월 20일

Mr-Playlist

목록 보기
1/2
post-thumbnail

문제

설계 미스로 playlist 엔티티와 music 엔티티간 관계가 N:1로 설정되어 있었고,
원하는 실제 동작은 플레이리스트는 N개의 음악을 가지고, 음악 또한 M개의 플레이리스트를 가질 수 있도록 하는 것이기에 설계를 변경해야함

해결 방안

  1. 다대다 매핑

    @Entity
    public class Playlist {
    
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "playlist_id")
        private Long id;
    
        @ManyToMany
        @JoinTable(name = "playlist_music")
        private List<Music> musicList = new ArrayList<>();
    }

    @ManyToMany 어노테이션 사용 시 @JoinTable 어노테이션을 활용해
    중간 테이블을 Hibernate가 생성해주지만, 중간 테이블에 PK, FK만 매핑해주기에
    추후에 키 이외의 필요한 정보를 컬럼으로 넣어주고자 할 때 문제가 발생

  2. 직접 중간 테이블 엔티티 생성하여 매핑
    1:N, N:1 관계로 분리한 엔티티를 만들고, 이를 사용하여 매핑
    playlist(1) - playlist_music(N) - music(1)
    이 후 스펙이 변경될 것을 고려하여 2번을 선택

ERD

아래와 같은 구조로 ER-Diagram을 변경

코드

#Playlist entity
@EntityListeners(AuditingEntityListener.class)
@Entity
public class Playlist {
	...
    @OneToMany(mappedBy = "playlist")
    private List<Music> musicList = new ArrayList<Music>();
    ...
}
@Entity
#중간 테이블
public class PlaylistMusic {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "playlist_music_id")
    private Long id;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "playlist_id")
    private Playlist playlist;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "music_id")
    private Music music;
}

설정한대로 playlist(1) - playlist_music(N) - music(1) 이 되도록 함

profile
주니어 개발자

0개의 댓글