인스타그램 클론 프로젝트-(5)

Claudia Hong·2021년 8월 15일
0

Project

목록 보기
11/26
  1. 연관관계 개념
    (1) 공식
  • Foreign Key는 Many가 가지고 있어야 한다.

예를 들어 블로그라고 했을 때, 한명의 유저는 여러 게시글을 쓸 수 있다.

게시글 N 유저 1

게시글은 한 유저만이 쓸 수 있다.

게시글 1 유저 1

이런 관계를 가질 때, 많은 쪽 (N>1)의 입장에서 ManyToOne 이라고 하고, 적은쪽의 입장에서는 OneToMany라고 한다. 그리고 큰쪽의 관계를 따르므로 N:1의 관계라고 한다.

그리고 게시글과 유저를 하나의 테이블로 놨을 때 어느쪽이 Foreign Key(FK)를 가질 것인지를 보면 유저의 테이블에서는 원자성이 깨지므로(유저1-게시글1,2,3...) 게시글 테이블이 유저를 FK로 갖는다. 이것을 공식처럼 쓸 수 있다.

  • N:N의 관계는 중간 테이블이 생긴다. 그리고 중간테이블 간의 관계에서 항상 중간테이블이 N 이고 양측이 1이 된다.

유저가 영화를 본다고 했을 때, 한명의 유저가 여러 영화를 볼 수 있고 한 영화를 여러명이 볼 수 있다.

유저 1 영화 N

유저 N 영화 1

이 관계를 N:N 이라고 한다.

N:N 관계를 테이블로 만들면 양쪽 모두 원자성이 깨지게 되므로, 이때 중간테이블인 '예매'를 만든다.

유저 1 예매 N 유저는 여러개의 예매를 할 수 있다.
유저 1 예매 1 예매를 할 때는 한명의 유저만 가능하다.

그러므로, 유저와 예매는 1:N 관계를 가진다.

예매 1 영화 N 하나의 영화는 예매를 여러번 할 수 있다.
예매 1 영화 1 하나의 예매는 한번에 한 영화만 가능하다.

그러므로, 예매와 영화는 N:1의 관계를 가진다.

(2) 구독하기에서의 관계로 생각해보기

구독하기 관계는 특이한게 유저테이블과 유저테이블 즉 같은 테이블 간의 관계이다. 또한 한명의 유저가 다수의 다른 유저를 구독이 가능하므로

유저 1 예매 N
유저 N 예매 1

N:N의 관계를 가진다. >> 중간테이블 Subscribe 를 만든다.

유저 1 구독 N 유저 1

위의 관계를 가지게 된다.(두번째 법칙)
그리고 항상 Many가 FK를 가지므로 Subscribe 테이블이 FK 들을 갖는다.(FK: 구독하는 유저/구독받는 유저)

2.구독하기 모델 만들기

User와 동일하게 하되, JoinColumn을 이용해서 카멜표기법으로 적용시켜준다. 레포지토리는 인터페이스로 JpaRepository를 상속받는 걸로 만든다.

구독 하는 유저와 구독 받는 유저의 관계는 중복이 되면 안된다.
유저1이 유저2를 구독하고 있는데 또 유저1이 유저2를 구독하게 되면 안된다. 그걸 설정해주기 위해서는 아래와 같이 어노테이션 해준다. (참고용)

30줄 : 이 유니크 제약조건의 이름
31줄 : 유니크 제약조건 관계의 두개의 이름을 적는다. 실제 DB 테이블의 컬럼명을 적어야 함.

  1. 구독하기 기능 만들기

1) 컨트롤러
컨트롤러는 데이터만 리턴하는 컨트롤러 API컨트롤러를 만든다.

구독하기 기능 >> "누구가를 구독하겠다"를 의미하므로, to user >> followeeId
(주체) 누가 구독하는가? >> "현재 로그인한 사람이 누군가를 구독한다."

25줄 : @AuthenticationPrincipal PrincipalDetails principalDetails 은 로그인한 사람을 의미하며, @PathVariable int followeeId 는 누가를 의미한다.

2) 서비스

구독하기 서비스를 만드려는데, 받는 값이 Integer 값인 followerId와 followeeId 이므로 Repository.save() 로 저장 방법은 쓸 수 없다.

이유? 저장하기 위해서는 subscribe 객체가 필요한데 Integer 값으로는 오브젝트인 객체를 만들지 못하기 때문이다.

그러므로 네이티브 쿼리를 짜서 저장을 하도록 한다.

':' 은 변수를 바인드 해서 넣겠다는 의미이다. followerId는 쿼리의 followerId에, followeeId는 쿼리의 followeeId에게.

9,14줄 :@Modifying은 DB에 변경을 주는 (INSERT, DELETE,UPDATE) 네이티브 쿼리를 작성하려면 이 어노테이션이 필요하다.

11,16줄 : 끝에 nativeQuery = true 라고 꼭 해야한다.

12, 17줄 : 원래 int로 잡았는데, 오류가 터지면 익셉션 처리를 핸들러에서 별도로 처리해주기로 하고 void 값으로 변경함. int로 타입을 잡은 이유, 한 건 당 성공하면 1 오류가 나면 -1이 리턴되기 때문이다. 변경된 행의 갯수만큼 리턴이 된다. >> 10건의 데이터가 INSERT 등으로 변경이 되면 10이 리턴된다. (0은 변경된 건이 없을 때)

m은 내가 만들었다는 것을 의미하는 약어다.

  1. 예외처리하기

유저1이 유저2를 두번 구독하기를 하게 되면 error code 500이 뜬다. 에러메시지는 Duplicate entry '2-1' for key 'subscribe_uk'임. 유니크제약사항에 걸려서 에러가 뜨는 것.

이런 때의 익셉션 처리를 하기 위해 별도의 익셉션을 만든다.(기존의 CustomValidationApiException을 그대로 가져다 쓰도록 한다. 다만, errorMap은 필요없으므로 String Message만을 리턴하는 메소드만 남긴다.)

그리고 서비스에서 try catch 를 이용해서 익셉션 처리를 해준다.

0개의 댓글

관련 채용 정보