-
JPA Table에 Unique Index 달기프로젝트/게시판 프로젝트 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 칼럼 제약조건은 잘 걸려있지만 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
이제 원하는 대로 이름이 잘 설정되었습니다
출처
'프로젝트 > 게시판 프로젝트' 카테고리의 다른 글
SpringBoot CI/CD 도입전 분석(젠킨스 vs 트레비스) (0) 2022.06.08 Spring REST Docs 적용하기(+ html 생성안됨 에러 해결, ./grdlew build 에러 해결, 각종에러해결) (0) 2022.06.07 API 문서화를 위한 Swagger와 Spring Rest Docs 비교 (0) 2022.05.31 테스트 코드 리팩토링하기 (0) 2022.05.31 뉴스 정보를 가져와 보자(크롤링, 네이버 뉴스 API 사용법) (0) 2022.05.25