인프런 커뮤니티 질문&답변

lbd4946@gmail.com님의 프로필 이미지
lbd4946@gmail.com

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 목록 검색, 취소

엔티티설계질문입니다.

작성

·

436

1

강의 잘봤습니다!! 역시 꿀강의!!!

배운 것을 토대로 토이프로젝트를 간단하게 진행 해보려고 합니다.

그래서 팁좀 받을 수 있을까... 해서요!!!

요구사항은 이렇습니다.

- 회원엔티티는 본인의 플레이리스트 엔티티를 조회한다.

- 플레이리스트의 정보는 동영상 엔티티에 저장되어 있다.

- 회원은 본인의 플레이리스트 목록을 삭제할 수 있다.

- 회원은 본인의 플레이리스트 중 가장많이 들은 곡 리스트를 조회할 수 있다.

-  모든 사용자는 동영상 엔티티에 있는 모든 곡 중 가장 많이 들은 곡 리스트를 조회할 수 있다.

위와 같은 결과로 아래와 같이 설계하였습니다.

가능하시다면 피드백 가능할까요 ㅜ.ㅜ

@Entity
public class Member {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;
private String email;

@OneToMany(mappedBy = "member")
private List<PlayList> playList = new ArrayList<>();
}
@Entity
public class Video {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String title;

@Column(name = "video_no")
private String videoNo;
private String image;
private int count; // 재생 횟수
}
@Entity
public class PlayList {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private int count; // 재생 수

@ManyToOne
@JoinColumn(name = "member_id")
private Member member;

@ManyToOne
@JoinColumn(name = "video_id")
private Video video;
}

답변 3

2

김영한님의 프로필 이미지
김영한
지식공유자

네 1.2 포함해서 같이 답변 드릴께요^^

playlist만 member를 알아도 충분할 것 같습니다. playlist -> member 단방향이지요. 제가 답변에서 playlist를 강조드린 이유도 이것 때문입니다^^!

툴은 다음을 참고해주세요. https://www.inflearn.com/questions/53694

감사합니다.

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. lbd4946님 이제부터 진짜 많이 배우시겠네요 ㅎㅎ

그런데 이전에 질문하신 내용을 지우고 다시 작성하셨군요.  전에 질문하신 내용은 회원이 PlayList를 참조하지 않았는데, 지금은 양방향 참조가 되어버렸네요.

이전에 질문하신 내용중에 정말 중요한 내용이 있어서 제가 다시 달아둘께요.

완강 후 간단하게 토이프로젝트 하면서 설계를 하는 중인데요

제대로 이해한게 맞는지 해서 질문 드립니다!!

먼저 간단한 요구사항은 이렇습니다.

- 회원은 영상을 검색하여 조회할 수 있다.

- 회원은 검색한 영상을 플레이리스트에 담을 수 있다.

- 회원은 플레이리스트를 조회할 수 있다.

- 회원은 플레이리스트의 목록을 삭제할 수 있다.

그래서 엔티티 설계를 아래와 같이 했습니다.

이유는 이렇습니다.

1. 회원은 플레이리스트는 1 : N이고 외래키가 있는 곳에 참조를 

만들기 위해 플레이리스트에 멤버를 N : 1 단방향으로 걸었습니다.

2. 플레이리스트는 회원별로 여러개의 비디오를 가질 수도 있기 때문에 플레이리스트와 비디오를 N : 1 단방향으로 걸었습니다.

3. 비디오는 어떠한 객체의 정보도 알 필요가 없습니다.

단지 비디오 정보를 가지고 제공해주는 엔티티 입니다.

4. 1번에서와 같은 이유로 플레이리스트 조회 시

회원을 조회한 후 해당 아이디로 플레이리스트를 조회하려고 합니다. 

아니면 회원과 플레이리스트를 1 : N 단방향으로 걸어서
플레이리스트 조회 시 편하게 가져올 수 있게 설계해야 할까요?

이렇게 하면 단점은 역시 1쪽에 참조가 걸린다는 것 입니다.

이렇게 되면 헷갈리게 되는 상황이 온다고 알고 있습니다.

마지막에 중요한 질문을 하셔서, 지금부터 설계에서 가장 중요한 포인트를 한가지를 말씀드릴께요.

처음 객체 설계를 할 때는 사람을 중심으로 생각하게 됩니다. 당연히 회원이 playlist를 등록하고, 조회하기 때문에 회원이 playlist를 관리해한다고 생각합니다. 만약 이렇게 모든 것을 회원 중심으로 설계하게 되면, 회원 엔티티는 정말 세상의 거의 모든 엔티티를 다 알고 있어야 합니다. 결국 회원이 모든 것의 중심이 되고, 매우 복잡해지겠지요. 그런데 이것은 객체지향의 특징을 아직 잘 이해하지 못한 것입니다.

객체지향에서 정말 너무너무 중요한 것이 있습니다. 바로 객체지향은 객체 하나하나가 능동적인 주인이 된다는 점입니다. 여기서 playlist와 관련된 것은 playlist 중심으로 생각하시면 됩니다. playlist가 회원도 video도 담고 있는 거지요. 비즈니스 로직도, 조회 기능도 playlist 기능의 경우 playlist를 중심으로 개발하시면 됩니다^^

도움이 되셨길 바래요^^

0

답변 정말 감사합니다!!!
의문이 2가지 있습니다

1. 현재 양방향으로 대체한 것이 올바른 것인가요? 양방향으로 하여도 playlist 중심으로 하여, 외래키 참조를 설정한 것이 올바르다고 생각하거든요. 1 : N은 테이블의 외래키 참조가 1에 있기 때문에 헷갈리기 때문이죠

2. 객체는 능동적이어야 하며, playlist 기능은 playlist를 중심으로 하라고 하셨는데 이 말씀은
     순수하게 기능적인 면에서 보았을 때 member, playlist, video의 기능을 각각 자기 중심적으로 개발하라는 말씀이신거죠?
     회원조회의 기능이라면 member가 참조를 가지고 있는 것이 좋은 것이겠구요. 하지만 저는 회원조회 할 일이 없으니
     그럴 필요가 없구요. 다만 playlist는 회원의 기능이 아닌 playlist의 기능이기 때문에 playlist가 중심이 되는 것 이구요

아!! 그리고 혹시 엔티티 설계나 테이블 설계 같은거 하실 때 그림은 어떤 툴을 사용하시나요?

lbd4946@gmail.com님의 프로필 이미지
lbd4946@gmail.com

작성한 질문수

질문하기