Wanna be Brilliant Full-Stack Developer

SPringBoot 구독하기 API 구현하기 연관관계 개념! 본문

Back-End/Spring Boot

SPringBoot 구독하기 API 구현하기 연관관계 개념!

Flashpacker 2022. 2. 14. 11:20

목표

구독하기 API를 구현하기 위해서 연관관계에대한 개념을 잡아야한다 

구독하기 만들고 구독 취소하기 만들것이다! 

 

Board라는 테이블이 있고 User라는 테이블이 있다.

하나는 게시글이고 하나는 유저이다.

하나의 유저에는 글을 한개만 쓸수 있으면 블로그를 못만드니 한명의 유저에는 게시글을 여러개를 쓸 수 있어서 1:N관계라고 불린다.

반대로 보면 하나의 게시글에는 몇명의 유저가 쓸수 있는가? 한개의 게시글은 한명이 쓰는거지 여러명이 동시에 쓰는것이 아니다. 이것은 1:1의 관계가 나온다. 

이두개의 관계는 큰쪽으로 보게되는데 큰쪽이 N , 그리고 둘다 1이 같으니까 N:1의 관계라고 보고 

Board입장에서 봤을때는 JPA에서는 ManyToOne이라고 하고

user입장에서는 OneToMany라고 말한다!

 

실제 테이블을 보면 

보드에 Id 와 title이 있고 user테이블에도 Id , username이 있다면 

id / title  id / username
1. 내용 1  1. ssar
1. 내용 2  2. cos
1. 내용 3   3. love

Many                                                                        One

여기서 포린키는 누가 가져가와할것인지 봐야한다!

이게 두개가 연관관계가 없으면 이 게시글을 누가 작성했는지 알수가 없다.

ssar이라는 애가 어떤 게시글을 작성했는지 확인이 안된다. 

만약에 게시글이라는 애가 있으면 ssar이라는애가 1번을 작성했다고 볼수 있지만 user는 게시글을 여러개 작성할수 있기 때문에 2개를 작성하면 1 , 2 콤마해서 넣어야하는 경우는 안된다.

방법은 Board 테이블에 게시글 옆에 누가 작성했는지 유저로 표시를 할수 있다.

전 케이스 같은 경우에는 원자성이 꺠졌다 라는 말이 있는데 하나의 컬럼에는 하나의 데이터만 있어야하는데 콤마를 해서 두개가 들어가는 포린키의 주인은 Many쪽으로 간다. 이건 공식이다. 

포린키는 Many가 들고있다. 

 

1. FK는 Many가 가지고간다.

 

이번에는 User테이블과 Movie 테이블이 있는데 

한명의 유저는 영화를 여러번 볼수있다. 

그러면 1:N 관계일수 있는데 

반대로 하나의 영화는 ( 어벤져스) 한명의 유저가 볼수가 있는가 여러명의 유저가 볼수 있는가? 여러명의 유저가 볼수있다. 그러면 N:1이 또 된다. 

둘다 큰쪽을 보면 N : N이다. 1 보다는 N이 크기떄문 

이둘의 관계는 위의 관계와는 다르게  N:N의 관계라고 불린다 

N:N의 관계가 되었을때 공식이 있다.

둘다 한컬럼에 하나의데이터이상이 들어가는 원자성이 꺠질수 있기 떄문에 어떠한 규칙 이 있냐면

N:N 관계에서는 두개의 관계에 대해서 항상 중간 테이블(예매) 이 생기게 된다

중간테이블이 생기면 관계를 다시봐야한다. 유저와 중간테이블과 , 무비와 중간테이블을 봐야한다.

한명의 유저는 예매를 많이할수있고 , 하나의 예매자체는 한명의 유저가 하는것이다. 

영화도 예매 하나만할수 있는것이 아니라 많이 받을수 있어서 1:N , N:1관계이다 

이것들을 규칙으로 만들어져있는데 

2. N:N의 관계는 중간 테이블이 생긴다. 

중간 테이블과의 관계는 항상 1:N 관계가 된다 

 

결론: 구독은 어떤 유저한명이 다른 유저를하는것이다.

다른 테이블 관계를 봐야한다. 

한명의 유저는 한명만 구독하는것이 아니라 여러명을 구독할수 있다. 

반대쪽으로는 한명의 유저는 여러명을 구독할수있다.

이러면 또 N:N 관계가 나왔다. 

N:N의 관계는 중간 테이블이 나오고 여기서는 구독하기라는 테이블을 만들것이다. 

이 Subscribe 테이블은 이들의 관계는 중간 테이블은 항상 N이되어야한다.

우리는 구독하기를 만들거니까 중간테이블 Subscirbe 테이블이 필요하고 포린키도 Subscribe 테이블에 있어야하고 

구독하는 유저와 구독받는 유저 필드가 필요하다!