프로젝트/게시판 프로젝트

JPA Table에 Unique Index 달기

Junuuu 2022. 6. 3. 21:54
반응형

기존 코드에서 개선사항 발생

 

JPA의 회원 Entity를 생성할 때 다음과 같이 Unique Column을 지정했습니다.

import lombok.*;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.*;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(name = "member")
@Entity
@DynamicUpdate
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //MySQL의 AUTO_INCREMENT를 사용
    @Column(name = "member_id")
    private Long id;

    @Column(name = "user_id", nullable = false, unique = true, length = 20)
    private String userId;

    @Column(name = "password", nullable = false, length = 255)
    private String password;

    @Column(name = "nickname", nullable = false, unique = true, length = 20)
    private String nickName;

    @Column(name = "name", nullable = false, length = 40)
    private String name;

    @Column(name = "phone_number", nullable = false, unique = true, length = 40)
    private String phoneNumber;

    @Embedded
    private Address address;

    @Builder
    public Member(Long id, String userId, String password, String nickName, String name, String phoneNumber, Address address) {
        this.id = id;
        this.userId = userId;
        this.password = password;
        this.nickName = nickName;
        this.name = name;
        this.phoneNumber = phoneNumber;
        this.address = address;
    }

    public void changeNickName(String nickName){
        this.nickName = nickName;
    }

}

 

바로 @Column 어노테이션에 unique=true를 주어서 작업했습니다.

 

이런 경우에는 어떤 문제가 있을까요??

UNIQUE 컬럼은 잘 들어가 있음

 

 

하지만 인덱스가 이상한 숫자로 들어가 있음

UNIQUE 칼럼 제약조건은 잘 걸려있지만 Indexes를 보면 무작위의 key값이 들어가 있습니다.

만약 DB에 에러가 발생했을 때 무작위의 key값이 들어가면 어디서 에러가 발생했는지 파악하기 힘들어지겠죠?

 

또한 두 개 이상 칼럼 UNIQUE 제약조건을 걸 수 없습니다.

 

해결방법

바로 테이블에 제약조건을 걸어주는 것입니다.

위에 발생했던 2가지 문제를 모두 해결할 수 있습니다.

 

저 같은 경우에는 딱히 테이블에 데이터가 들어있던 상황이 아니었기 때문에 application.properties 설정을 다음과 같이 했습니다.

spring.jpa.hibernate.ddl-auto=create

원래의 테이블을 삭제하고 다시 생성하기 때문에 제약조건이 잘 들어가게 됩니다.

 

만약 이를 update로 한다면 잘 반영되지 않을 수 있습니다.

 

다음 MySQL에서 명령어를 통해 인덱스를 제거해주어야 합니다.

drop index [인덱스 forign key] on [table 명];

 

 

Index에 이름을 설정하는 법

@Table(
        name = "member"
        , indexes = {
        @Index(name = "unique_idx_user_id", columnList = "user_id", unique = true),
        @Index(name = "unique_idx_nickname", columnList = "nickname", unique = true),
        @Index(name = "unique_idx_phone_number", columnList = "phone_number", unique = true)
}
)

 

 

두 개 이상 칼럼에 UNIQUE 제약조건 설정

@Entity
@Table(indexes = {
  @Index(name="idx_book_name", columnList = "name"),
  @Index(name="idx_book_name_published_date", columnList = "name, publishedDateOn"),
  @Index(name="unique_idx_book_name_author", columnList = "name, author", unique = true)
})

출처 : https://youngwonhan-family.tistory.com/entry/JPAHibernate-Table-Index-%EC%83%9D%EC%84%B1-Single-Multi-Unique-Index-%EC%98%88%EC%A0%9C

 

 

이제 원하는 대로 이름이 잘 설정되었습니다

인덱스의 이름이 정상적으로 들어감

 

 

 

 

 

출처

https://velog.io/@joshuara7235/ISSUEs-JPA%EB%A1%9C-%EC%83%9D%EC%84%B1%ED%95%9C-entity-column%EC%97%90%EC%84%9C-unique-%EC%A0%9C%EC%95%BD%EC%A1%B0%EA%B1%B4-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0

 

ISSUEs - JPA로 생성한 entity column에서 unique 제약조건 삭제하기

🌱 좌충우돌 개발 issue - 제약조건과 index

velog.io

 

https://velog.io/@hyeminn/JPA-%EB%91%90%EA%B0%9C-%EC%9D%B4%EC%83%81-%EC%BB%AC%EB%9F%BC-UNIQUE-%EC%A1%B0%EA%B1%B4-%EC%84%A4%EC%A0%95

 

[JPA] 두개 이상 컬럼 UNIQUE 조건 설정

=> @Table 속성 uniqueConstraints 사용

velog.io

 

https://youngwonhan-family.tistory.com/entry/JPAHibernate-Table-Index-%EC%83%9D%EC%84%B1-Single-Multi-Unique-Index-%EC%98%88%EC%A0%9C

 

JPA(Hibernate) - Table Index 생성 ( Single, Multi, Unique Index ) 예제

Table Index 생성 ( Single, Multi, Unique Index ) 예제 @Index 어노테이션을 사용하여 Index를 생성한다. 해당 어노테이션은 javax.persistence 패키지임을 유의한다. Book.java @Entity @Table(indexes = @I..

youngwonhan-family.tistory.com