본문 바로가기
JAVA/SpringBoot

JPA의 @NaturalId : 자연 키로 엔티티 식별하기

by GangDev 2024. 3. 24.

 

@NaturalId 는 JPA에서 사용하는 어노테이션으로, 엔티티의 자연 키(natural key)를 나타낸다.
(자연 키: 비즈니스적으로 의미가 있고, 엔티티를 고유하게 식별할 수 있는 필드. ex: 사용자 이메일, 주민등록번호, 상품 코드 등)

 

특징 >>

 

@NaturalId 로 지정된 필드는 엔티티 내에서 유일해야 한다. 설정되면 변경되지 않는 것이 좋다.

 

@NaturalId는 Hibernate의 2차 캐시와 함께 사용될 때, 자연 키 기반의 캐싱을 지원한다.(성능 향상 가능)

 

자연 키를 이용하여 엔티티를 검색할 때, @NaturalId는 해당 검색을 효율적으로 할 수 있도록 해준다.

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NaturalId
    @Column(nullable = false, unique = true)
    private String email;

}

 

위 코드에서는 email이 User 엔티티를 식별하는 데 사용되는 자연 키다.
@Column(nullable = false, unique = true) : 이 필드(email)가 null이 될 수 없고, 유일해야 한다.


@Id 와의 차이점 >>

 

@Id는 JPA에서 엔티티의 Primary Key를 지정하는 데 사용된다.
보통, 숫자 형태의 자동 생성 값(Auto Increment)이나 UUID와 같이, 엔티티 생성 시 자동으로 할당되며, 비즈니스적 의미는 적거나 전혀 없는 경우가 많다.
(데이터베이스 상의 기술적인 식별자 역할)
@Id 값은 일반적으로 불변이다.

 

@NaturalId 는 비즈니스적으로 의미가 있는 자연 키(Natural Key)를 나타내는 데 사용된다.
데이터베이스에 저장된 데이터를 비즈니스 로직에 따라 더 자연스럽게 식별할 수 있도록 해준다.
@Id와 달리 비즈니스적 의미를 지닌다.
(비즈니스 로직상 의미 있는 식별자 역할)
@NaturalId 는 경우에 따라 변경될 수 있다.(가능한 한 불변성을 유지)


정리 후기 >>

수업 시간에 배운 annotation 등도 틈틈이 정리해놔야겠다.

 

---

24년 1월 11일 작성된 글입니