πŸžν”„λ‘œκ·Έλž˜λ°

[정보] spring bootμ—μ„œ entity id 생성 μ „λž΅

TwoIceFish 2023. 3. 16. 08:03

Spring Bootμ—μ„œ JPA와 ν•¨κ»˜ μ‚¬μš©λ˜λŠ” Entity ID μƒμ„± μ „λž΅μ€ μ£Όλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ κΈ°λ³Έ ν‚€(primary key)λ₯Ό μžλ™ μƒμ„±ν•˜λŠ” λ°©μ‹μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λ₯Ό μœ„ν•΄ λ‹€μ–‘ν•œ μ „λž΅μ΄ μ‚¬μš©λ˜λ©°, μ£Όμš” μ „λž΅μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


GenerationType.AUTO (κΈ°λ³Έ μ „λž΅)
이 μ „λž΅μ€ JPAκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ— λ”°λΌ μžλ™μœΌλ‘œ μ„ νƒν•˜λŠ” ID μƒμ„± μ „λž΅μž…λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€μ— λ”°λΌ GenerationType.SEQUENCE, GenerationType.IDENTITY, GenerationType.TABLE μ€‘ ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}

 

GenerationType.IDENTITY
이 μ „λž΅μ€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μžλ™ μ¦κ°€(auto-increment) κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ IDλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. MySQL, PostgreSQL, SQL Server λ“±μ—μ„œ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

 

GenerationType.SEQUENCE
이 μ „λž΅μ€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ‹œν€€μŠ€(sequence) κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ IDλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μ‹œν€€μŠ€λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ³ μœ ν•œ κ°’을 μˆœμ°¨μ μœΌλ‘œ μƒμ„±ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. μ£Όλ‘œ Oracle, PostgreSQL λ“±μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. μ‹œν€€μŠ€λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ @SequenceGenerator μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_entity_seq")
    @SequenceGenerator(name = "my_entity_seq", sequenceName = "my_entity_seq", allocationSize = 1)
    private Long id;
}

 

GenerationType.TABLE
이 μ „λž΅μ€ λ³„λ„μ˜ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”을 μ‚¬μš©ν•˜μ—¬ IDλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μ΄ ν…Œμ΄λΈ”은 λͺ¨λ“  μ—”티티에 λŒ€ν•œ IDλ₯Ό κ΄€λ¦¬ν•˜λ©°, μ—¬λŸ¬ μ—”ν‹°ν‹°μ—μ„œ κ³΅μœ ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. @TableGenerator μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "my_entity_gen")
    @TableGenerator(name = "my_entity_gen", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize = 1)
    private Long id;
}

μœ„μ˜ μ „λž΅ μ€‘ ν•˜λ‚˜λ₯Ό μ„ νƒν•˜μ—¬ Spring Boot ν”„λ‘œμ νŠΈμ—μ„œ Entity ID μƒμ„± μ „λž΅μ„ κ΅¬ν˜„ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ’…λ₯˜μ™€ μ„±λŠ₯, ν™•μž₯μ„± λ“±μ˜ μš”ꡬ사항을 κ³ λ €ν•˜μ—¬ μ μ ˆν•œ μ „λž΅μ„ μ„ νƒν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€.