JPA의 @GeneratedValue 전략
- @GeneratedValue는 JPA에서 기본 키 값을 자동으로 생성하는 데 사용되며, 키 생성 전략을 결정하는 4가지 옵션을 제공합니다:
- GenerationType.IDENTITY
- AUTO_INCREMENT를 사용해 키를 생성합니다.
- 각 INSERT마다 새로운 키를 생성합니다.
- 트랜잭션과 독립적으로 동작하므로 배치 INSERT에 제약이 있을 수 있습니다.
- MariaDB에서는 주로 IDENTITY 사용
- GenerationType.SEQUENCE
- Sequence 객체를 사용해 키를 생성합니다.
- 더 유연하고 배치 처리에 유리합니다.
- GenerationType.TABLE
- 별도의 키 생성 테이블을 만들어 키를 관리합니다.
- Sequence를 지원하지 않는 데이터베이스에서도 사용 가능.
- 하지만 성능이 낮고, 잘 사용되지 않습니다.
- GenerationType.AUTO
- 데이터베이스의 기본 키 생성 전략을 JPA가 자동으로 선택합니다.
2. @GeneratedValue(strategy = GenerationType.IDENTITY)
MariaDB 기본 설정:
- AUTO_INCREMENT를 통해 키 값을 자동으로 생성합니다.
- 예제:
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Other fields and methods...
}
- MariaDB는 AUTO_INCREMENT 컬럼으로 동작:
CREATE TABLE member (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255)
);
3. @GeneratedValue(strategy = GenerationType.SEQUENCE)
MariaDB에서 Sequence 사용 설정:
- MariaDB 10.3 이상부터 Sequence 기능을 지원합니다.
- Sequence를 사용하려면 먼저 Sequence를 생성해야 합니다:
CREATE SEQUENCE member_seq
START WITH 1
INCREMENT BY 1;
- JPA 엔티티 예제:
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_gen")
@SequenceGenerator(name = "member_seq_gen", sequenceName = "member_seq", allocationSize = 1)
private Long id;
private String name;
// Other fields and methods...
}
설명:
- @SequenceGenerator:
- name: 사용할 Sequence Generator의 이름.
- sequenceName: 실제 데이터베이스 Sequence의 이름.
- allocationSize: 키 값을 미리 생성해 메모리에 로드하는 크기(성능 최적화에 도움).
- SQL 생성:
INSERT INTO member (id, name) VALUES (NEXT VALUE FOR member_seq, '홍길동');
Sequence와 IDENTITY의 차이
항목 | IDENTITY | SEQUENCE |
MariaDB 지원 여부 | 기본 지원 (AUTO_INCREMENT) | 10.3 이상에서 수동으로 Sequence 생성 필요 |
키 생성 방식 | 테이블마다 AUTO_INCREMENT | 데이터베이스의 Sequence 객체 |
배치 처리 | 비효율적 (INSERT 후 키 값 생성됨) | 효율적 (키를 미리 생성 가능) |
트랜잭션과의 통합 | 트랜잭션과 독립적 | 트랜잭션과 통합 가능 |
성능 최적화 | 기본적이지만 확장성 부족 | allocationSize로 키 생성 성능 최적화 가능 |
5. 실무에서의 선택 가이드
- MariaDB에서 기본적으로 IDENTITY 전략 사용:
- 설정 없이 간단히 사용하려면 @GeneratedValue(strategy = GenerationType.IDENTITY)를 선택하세요.
- 테이블에 AUTO_INCREMENT 컬럼이 자동 생성됩니다.
- 배치 성능을 높이고 싶다면 SEQUENCE 사용:
- 특히 대규모 데이터 삽입 작업(배치 처리)이 많은 경우 적합합니다.
- 운영 환경에서는 성능을 검토:
- SEQUENCE는 키 생성 전략에서 더 많은 유연성과 확장성을 제공합니다.
- IDENTITY는 설정이 간단하지만 배치 작업 성능이 떨어질 수 있습니다.
6. 관련 예제
Controller
package com.example.jpa.controller;
import com.example.jpa.domain.Member;
import com.example.jpa.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/members")
public class MemberController {
@Autowired
private MemberRepository memberRepository;
@PostMapping
public Member createMemeber(@RequestBody Member member) {
return memberRepository.save(member);
}
@GetMapping
public List<Member> getMembers() {
return memberRepository.findAll();
}
}
IDENTITY 전략 예제
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
- API 테스트
POST <http://localhost:8080/members>
Content-Type: application/json
{
"name": "홍길동"
}
SEQUENCE 전략 예제
MariaDB에서 Sequence 생성 후:
CREATE SEQUENCE member_seq
START WITH 1
INCREMENT BY 1;
JPA 설정:
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_gen")
@SequenceGenerator(name = "member_seq_gen", sequenceName = "member_seq", allocationSize = 1)
private Long id;
private String name;
}
- API 테스트
POST <http://localhost:8080/members>
Content-Type: application/json
{
"name": "홍길동"
}
'Spring' 카테고리의 다른 글
JPA - Entity 관련 애너테이션 (0) | 2025.01.14 |
---|---|
JPA - @Column 데이터베이스 컬럼 매핑 (0) | 2025.01.14 |
JPA/Hibernate 관련 설정 (application.properties) (0) | 2025.01.13 |
JPA(Java Persistence API) 개요 (0) | 2025.01.13 |
Persistence Layer(영속성 계층) (0) | 2025.01.11 |