JPA Table에 Unique Index 달기
기존 코드에서 개선사항 발생
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 칼럼 제약조건은 잘 걸려있지만 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
이제 원하는 대로 이름이 잘 설정되었습니다
출처
ISSUEs - JPA로 생성한 entity column에서 unique 제약조건 삭제하기
🌱 좌충우돌 개발 issue - 제약조건과 index
velog.io
[JPA] 두개 이상 컬럼 UNIQUE 조건 설정
=> @Table 속성 uniqueConstraints 사용
velog.io
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