Wanna be Brilliant Full-Stack Developer

SprignBoot 구독 API 모델 만들기 본문

Back-End/Spring Boot

SprignBoot 구독 API 모델 만들기

Flashpacker 2022. 2. 14. 11:48


목표 

모델 만들기! 

package com.cos.photogramstart.domain.subscribe;

import java.time.LocalDateTime;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import com.cos.photogramstart.domain.user.User;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Subscribe {
		@Id
		@GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략이 데이터베이스를 따라간다. 
		private int id;
		
		private User fromUser; //구독하는유저 
		
		private User toUser; //구독받는애 
		
}

Susbscribe 중간 테이블을 만들기위해 구독하는 유저와 구독받는 테이블을 생성하고 

연관관계를 보는데 User가 1이고 Subscirbe는 N 

니까 @ManyToOne 어노테이션을 두개에다 올려놓으면 Subscribe 테이블을 생성해준다 

시간이 있어야하니까 시간을 복사해온다 .

그리고 테이블을 만들어진것을 확인해보면 

자동으로 fromUser, ToUser을 보고 자동으로 테이블 이름을 설정한것이 ORM? 이라고한다

나는 오브젝트를 만들고 그오브젝트를 따라 Entity(@Entity)가 만들어진것이다. 

하지만 이름이 마음에 들지 않으면 변경할수도 있는데 

package com.cos.photogramstart.domain.subscribe;

import java.time.LocalDateTime;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;

import com.cos.photogramstart.domain.user.User;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Subscribe {
		@Id
		@GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략이 데이터베이스를 따라간다. 
		private int id;
		
		@JoinColumn(name="fromUserId")
		@ManyToOne
		private User fromUser; //구독하는유저 
		
		@JoinColumn(name="ToUserId")
		@ManyToOne
		private User toUser; //구독받는애 
		
		private LocalDateTime createDate;
		
		@PrePersist
		public void createDate() {
			this.createDate = LocalDateTime.now();
		}
		
}

이렇게 만드니 DB에서는 예전것도 그대로 살아 있는것을 확인할수 있었는데..?

application.yml에서 create로 다시 데이터를 꺠끗이 만들고 DB에서 새로운 테이블을 확인한뒤 update로 바꾸면된다.

그러면 잘만들어졌으니 여기에대한 Repository를 만들어야한다 .

package com.cos.photogramstart.domain.subscribe;

import org.springframework.data.jpa.repository.JpaRepository;

public interface SusbcribeRepository extends JpaRepository<Subscribe, Integer> {

}

그리고 하나가 더필요한데 1번유저가 2번 유저를 팔로우 했으면 그다음에 데이터가 들어올떄 1번유저가 2번유저를 팔로우하는것을 또 인서트하면 두개가 중복이 되기 떄문에 하나만 유니크 하게 만들필요가 있기 떄문에 유니크 제약조건을 걸려고한다. 

무슨 말이냐면 1번이 2번이 구독하는것이 또 들어오게되면 쓸대없는 데이터가 또 들어와서 충돌이 일어나기떄문이다

이미 1번이 2번을 구독하고 있는데 또 1번이 2번을 구독하면 안되게 떄문에 이 관계가 유니크해야한다 

그것을 어떻게 정의하냐면 

@Table(
uniqueConstraints = {
@UniqueConstraint(
name="subscribe_uk",  유니크 제약조건 이름 
columnNames = {"fromUserId", "toUserId"} // 실제 데이터베이스 테이블 컬럼명을 작성해야한다.
)

}
)