[JPA] @Column(unique=true) & UniqueConstraints

DevHwan·2022년 12월 2일
0

DB에서 데이터를 구별하는 방법은 무엇일까?

바로 PK를 유일한 식별자로 구분하여 PK가 같으면 같은 데이터라고 판단한다. 테이블에서는 한 가지의 PK를 갖는 데, 보통 Index를 PK로 주어서 저장하는 편이다.

근데 만약 회원의 중복 가입을 막으려고 한다면 어떤 방법이 좋을까? 회원가입을 하는 방식은 핸드폰 인증, 소셜 인증, 이메일 인증 등이 있을 것이다.

@Entity
@Table
public class Person implements Serializable {
    @Id
    @GeneratedValue
    private Long id;  
    private String name;
    private String password;
    private String email;
    private Long phoneNumber;
    private Boolean isActive;
    private String securityNumber;
    private String departmentCode;
    @JoinColumn(name = "addressId", referencedColumnName = "id")
    private Address address;
   //getters and setters
 }

다음과 같은 테이블에서는 어떤 방식으로 중복회원가입을 막을 수 있을까? 바로 핸드폰 번호에 유니크 조건을 주어서 해결할 수 있다.

열 제약 조건 정의

@Column(unique=true)
private Long phoneNumber;

해당 방법은 phoneNumber에 대한 단일 열에 대한 유니크 조건이다. 추가적으로 여러 열을 섞어서 유니크 조건을 추가할 수 도 있다.

테이블 Unique 조건 정의

@Entity
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "phoneNumber", "isActive" }) })
public class Person implements Serializable {
		```
}

여기서 주의 할 점은 이름을 지정하지 않으면 공급자가 생성한 값이 들어갈 수 있다. 따라서 JPA2.0 부터는 Unique 조건의 이름을 제공할 수 있다. → name = ~~

@Table(uniqueConstraints = { @UniqueConstraint(name = "UniqueNumberAndStatus", columnNames = { "phoneNumber", "isActive" }) })

단일 엔티티의 여러 Unique 조건

@Table(uniqueConstraints = {
   @UniqueConstraint(name = "UniqueNumberAndStatus", columnNames = {"phoneNumber", "isActive"}),
   @UniqueConstraint(name = "UniqueSecurityAndDepartment", columnNames = {"securityNumber", "departmentCode"})})

다음과 같은 방식으로 어노테이션을 추가하여 여러가지 Unique제약 조건을 추가할 수 있다.


레퍼런스

Defining Unique Constraints in JPA | Baeldung

profile
달리기 시작한 치타

0개의 댓글