중복 유니크 키 선언하는 방법을 알아보자.
중복 유니크 키는 왜 선언했는가?
게시물 좋아요 기능을 만들기 위해서 좋아요 엔티티를 선언하는 과정에서
한 사람이 하나의 이미지에 대해서 좋아요를 눌러 DB에 하나의 row 데이터가 생성되었다고 가정했을 때
동일한 사람이 동일한 이미지에 대해서 다시 좋아요를 누를 수 있는가?
아니다.
한 사람은 하나의 게시물에 좋아요를 눌렀을 경우, 다시 좋아요를 누르면 중복 데이터가 쌓이는 것이 아닌 좋아요가 취소가 되어야 한다.
즉, userId와 imageId 는 중복 유니크 키로 선언해야한다.
그 과정은 다음과 같다.
@Table 어노테이션에 uniqueConstraints 속성을 주고,
@UniqueConstraints 어노테이션에 name 속성을 likes_uk 로 주고,
columnNames 를 imageId, userId 로 선언한다.
이때 DB의 실제 컬럼명을 명시해줘야 한다.
이렇게 설정을 하면 imageId, userId 이 두개는 같은 값이 들어올 수 없다는 제약 조건이 생성된다.
예제 코드 Likes 엔티티
package com.cos.photogramstart.domain.likes;
import com.cos.photogramstart.domain.image.Image;
import com.cos.photogramstart.domain.user.User;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(
uniqueConstraints = {
@UniqueConstraint(
name = "likes_uk",
columnNames = {"imageId", "userId"} // 실제 db 컬럼명
)
}
)
public class Likes { // N , N
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@JoinColumn(name = "imageId")
@ManyToOne
private Image image; // 1
@JoinColumn(name = "userId")
@ManyToOne
private User user; // 1
private LocalDateTime createDate;
@PrePersist
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
'👩💻 BackEnd > 🍃 스프링부트 [SpringBoot]' 카테고리의 다른 글
[ SpringBoot / OAuth2] facebook 로그인 기능 구현하기 (0) | 2024.03.20 |
---|---|
[ SpringBoot ]@NotNull, @NotEmpty, @NotBlank 차이 (0) | 2024.03.19 |
[SpringBoot] 게시물 페이징 처리하기 (0) | 2024.03.17 |
[JPA] 양방향 매핑 (0) | 2024.03.13 |
[ Spring Boot / thymleaf ] spring mvc 2 검증 내용 정리 (0) | 2024.02.22 |