본문 바로가기

👩‍💻 BackEnd/🍃 스프링부트 [SpringBoot]

[SpringBoot] 중복 유니크 키 제약조건 생성

중복 유니크 키 선언하는 방법을 알아보자. 

 

중복 유니크 키는 왜 선언했는가? 

 

게시물 좋아요 기능을 만들기 위해서 좋아요 엔티티를 선언하는 과정에서 

한 사람이 하나의 이미지에 대해서 좋아요를 눌러 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();
    }
}