Entity에 여러 테이블의 정보를 갖는 dataclass 만들기

nbh·2023년 11월 28일

기록용으로 작성하는 것이므로 참고만 해주세요.

연결이 필요하다!

다소 나중의 이야기이긴 하지만, 코드를 작성하다보니 AlbumDao 또는 SongDao 둘 중 하나만을 불러오는 것으로는 문제가 있었다.
예를 들어서, 곡의 정보를 출력할 때, 거의 항상 곡 이름, 아티스트 이름, 앨범 이름을 가져와야 했는데, 곡 이름은 SongDao에, 앨범 이름과 아티스트 이름은 AlbumDao에 들어있어서 두 Dao를 모두 불러와야 했다.
그렇다고 테이블 구조나 Entity를 수정하기에는

  • 아티스트 이름과 앨범 이름을 Song 테이블에도 넣는다 → 데이터 중복
  • 모르겠다! 그냥 전부 한 테이블에 합쳐버려 → 관계형 DB를 쓰는 의미가 없음

이라는 문제가!

아무튼 Song 테이블과 Album 테이블을 함께 불러와야했다.

해결 방법은?
객체간의 관계를 설정한다!!!

@Embedded와 @Relation 어노테이션을 사용해 SongWithAlbum 이라는 Song 테이블과 ALbum 테이블을 모두 불러오는 data class를 만들었다.

data class SongWithAlbum(
    @Embedded
    val song:SongEntity,
    @Relation(
        parentColumn = "albumName",
        entityColumn = "name"
    )
    val album: AlbumEntity
)

이 코드에서 중요한 부분은 @Relation 어노테이션인데, 기존에 Entity에서 외래키로 설정해준 관계를 여기에 넣어주면 외래키를 이용해서 연결되는 데이터를 가져올 수 있다.
Song이 SongWithAlbum객체라고 할때,
Song.~~ 로는 SongDao의 함수들을 사용할 수 있고,
Song.Album.~~ 로는 Song과 연결된 앨범에 대하여 AlbumDao의 함수들을 사용 할 수 있다.

🙋 왜 Song으로 Album에 접근하나요?
Album에서도 Song에 대한 접근을 설정해 AlbumWithSongs라는 Entity를 만들어야 하는게 아닌가요?

나도 처음에는 모두 매칭이 되도록 각각의 Entity에서 다른 Entity로 접근할 수 있는 관계Entity들을 만들었다.
하지만 Song을 출력할 때 AlbumEntity의 정보를 불러올 일은 많았지만, (ex. 노래를 불러온다면 앨범 정보와 아티스트도 함께 출력함) Album을 출력할 때 SongEntity의 정보를 불러올 일은 거의 없었다.
그래서 일단 지금 작성되어 있는 프로젝트 코드에는 Album으로 Album의 노래들의 접근할 수 있도록 AlbumWithSongs라는 Entity를 정의해놓고 사용하게 되면 Dao를 구현하려고 했는데, 결국 아직은 필요성을 느끼지 못해서 Dao는 구현되어있지 않다.

그러고 나서 생각한건데,
결국엔 자주 사용하는 방식으로만 관계를 설정하는게 낫지 않나 싶었다.
Album을 통해서 Song에 접근해야 하는 이유가 있는게 아니라면...
그리고 웬만해서는 SongWithAlbumDao에 정의한 함수들로 접근할 수 있기 때문에
코드에 혼동이 생기지 않도록, 가독성을 고려하여...

라는 생각을 했다

사실 이 글을 작성하는 지금 시점으로, 간단하게 노래와 앨범 테이블만 만들어서 읽고 출력했던 것과는 다르게 데이터베이스 기말과제를 하면서 데이터베이스 추가, 수정, 삭제랑 다른 추가적인 테이블 구현까지 할 생각이라...
다음 글들은 기말과제가 끝나고 작성할 것 같다.
DB를 다루는 범위가 넓어져서 지금 작성한 글들과는 또 다른 코드를 작성할 수도 있을 것 같다.

0개의 댓글