@GeneratedValue란?
@GeneratedValue 어노테이션은 JPA(Java Persistence API)에서 엔티티의 기본 키를 자동으로 생성하는 전략을 지정할 때 사용된다. 이를 통해 개발자는 데이터베이스의 키 생성 방식을 간편하게 제어할 수 있다. 디폴트 전략은 GenerationType.AUTO이며, 이는 JPA 구현체가 적절한 생성 전략을 선택하도록 위임한다.
Generation Type 옵션
@GeneratedValue는 아래 네 가지 GenerationType 옵션을 제공한다. 각각 데이터베이스의 특성과 요구사항에 따라 적합한 전략을 선택할 수 있다.
옵션 | 특징 |
GenerationType.AUTO | - JPA 구현체(Hibernate 등)가 데이터베이스 방언에 따라 기본 키 생성 전략을 자동으로 선택하도록 위임한다. - 예를 들어, 데이터베이스가 시퀀스를 지원하면 SEQUENCE 전략을 사용하고, 지원하지 않으면 IDENTITY 전략을 사용할 수 있다. |
GenerationType.SEQUENCE | - 데이터베이스의 시퀀스를 사용해 기본 키를 생성한다. - 주로 Oracle, PostgreSQL과 같이 시퀀스를 지원하는 데이터베이스에서 사용된다. - 성능 최적화를 위해 @SequenceGenerator를 활용할 수 있다. |
GenerationType.IDENTITY | - 기본 키 생성 작업을 데이터베이스에 위임하며, 주로 AUTO_INCREMENT와 유사하게 동작한다. - MySQL, SQL Server와 같은 데이터베이스에서 많이 사용된다. - 트랜잭션 커밋 시점이 아닌 em.persist() 시점에 바로 INSERT SQL을 실행한다. |
GenerationType.TABLE | - 별도의 테이블을 생성하여 기본 키 값을 관리한다. - 다른 생성 전략이 지원되지 않는 데이터베이스에서도 사용할 수 있다. - @TableGenerator 어노테이션을 통해 세부 설정이 가능하다. |
@GeneratedValue 사용 방법
아래는 @GeneratedValue의 기본적인 사용 예제이다.
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO) // 디폴트 값
private Long id;
// 기타 필드 및 메서드...
}
Generation Type 자세히 보기
IDENTITY : 데이터 베이스 위임 방식
- 기본 키 생성을 데이터베이스에 위임하며, 주로 AUTO_INCREMENT와 비슷한 방식으로 동작한다.
- em.persist() 시점에 바로 INSERT SQL을 실행하고, 생성된 키를 1차 캐시(영속성 컨텍스트)에 저장한다.
- MySQL, SQL Server, PostgreSQL 등에서 자주 사용된다.
SEQUENCE: 데이터베이스 시퀀스 사용
- 데이터베이스의 시퀀스 오브젝트를 사용하여 키를 생성한다.
- @SequenceGenerator를 사용해 시퀀스 이름과 allocationSize를 설정할 수 있다.
- allocationSize는 성능 최적화를 위해 한 번 호출로 미리 증가된 값을 메모리에 저장하여 네트워크 비용을 줄인다.
TABLE: 별도 테이블 사용
- 키 생성을 위해 별도의 테이블을 생성한다.
- 모든 데이터베이스에서 사용할 수 있으나, 성능 상의 이유로 잘 사용되지 않는다.
- @TableGenerator로 설정을 세부 조정할 수 있다.
AUTO: 데이터베이스 방언에 따른 자동 지정
- JPA 구현체(Hibernate 등)가 데이터베이스 방언에 맞는 적절한 전략을 자동으로 선택한다.
- 기본 설정값으로 자주 사용된다.
정리
IDENTITY: 간단하고 설정이 용이하나, 성능 최적화가 어렵습니다.
SEQUENCE: 성능 최적화가 가능하나, 시퀀스를 지원하는 데이터베이스에서만 사용 가능합니다.
TABLE: 모든 데이터베이스에서 사용할 수 있지만, 성능 상의 단점이 있습니다.
AUTO: 설정이 간편하지만, 특정 상황에서 JPA 구현체의 선택을 확인해야 할 수 있습니다.
'IT > Java' 카테고리의 다른 글
[Java / annotation] - @Schema (0) | 2024.12.12 |
---|---|
[Java / annotation] - @NoArgsConstructor (0) | 2024.12.12 |