JPA

JPA PK ์ƒ์„ฑ์ „๋žต @GeneratedValue(strategy = GenerationType.โ“)

devJK93 2024. 12. 9.

 

๐Ÿ“ JPA GenerationType ๋น„๊ต

1. GenerationType.IDENTITY

  • ํŠน์ง•: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์กดํ•˜์—ฌ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์ž‘ ๋ฐฉ์‹:
    • PK๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ AUTO_INCREMENT ๋˜๋Š” IDENTITY ์ปฌ๋Ÿผ์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • em.persist() ํ˜ธ์ถœ ์‹œ ์ฆ‰์‹œ INSERT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ƒ์„ฑํ•œ ํ‚ค ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์žฅ์ : ์„ค์ •์ด ๊ฐ„๋‹จํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ID ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ.
  • ๋‹จ์ :
    • PK๊ฐ€ INSERT ์ดํ›„์— ๊ฒฐ์ •๋˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋น„ํšจ์œจ์ .
    • INSERT ์ง€์—ฐ์ด ๋ถˆ๊ฐ€๋Šฅ.
  • ์ถ”์ฒœ ์ƒํ™ฉ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ID ์ƒ์„ฑ ์œ„์ž„์ด ํ•„์š”ํ•  ๋•Œ.

2. GenerationType.SEQUENCE

  • ํŠน์ง•: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‹œํ€€์Šค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PK๋ฅผ ์ƒ์„ฑ.
  • ๋™์ž‘ ๋ฐฉ์‹:
    • JPA๊ฐ€ ์‹œํ€€์Šค ๊ฐ์ฒด์—์„œ ID๋ฅผ ๋จผ์ € ๊ฐ€์ ธ์˜ค๊ณ , ํ•ด๋‹น ID๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ ๋’ค em.persist()๋ฅผ ์ˆ˜ํ–‰.
    • INSERT ์ฟผ๋ฆฌ๋Š” tx.commit() ์‹œ์ ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ :
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€์—์„œ ๊ณ ์œ  ID ์ƒ์„ฑ ๊ฐ€๋Šฅ.
    • em.persist() ์‹œ์ ์— INSERT๋ฅผ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ.
  • ๋‹จ์ : ์‹œํ€€์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ.
  • ์ถ”์ฒœ ์ƒํ™ฉ: ์‹œํ€€์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Oracle, PostgreSQL ๋“ฑ)์—์„œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ.

3. GenerationType.TABLE

  • ํŠน์ง•: ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ID๋ฅผ ์ƒ์„ฑ.
  • ๋™์ž‘ ๋ฐฉ์‹:
    • JPA๋Š” ์ง€์ •๋œ ํ…Œ์ด๋ธ”(์˜ˆ: sequence_table)์—์„œ ID๋ฅผ ๊ด€๋ฆฌ.
    • ํ…Œ์ด๋ธ”์— ํ˜„์žฌ ์‹œํ€€์Šค ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ƒˆ๋กœ์šด ID๋ฅผ ์ƒ์„ฑ.
  • ์žฅ์ : ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ID๋ฅผ ๊ด€๋ฆฌ.
  • ๋‹จ์ :
    • ๋ณ„๋„์˜ ํ…Œ์ด๋ธ” ์กฐํšŒ/๊ฐฑ์‹  ์ž‘์—…์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ.
    • ํŠธ๋žœ์žญ์…˜ ๊ฒฝํ•ฉ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ.
  • ์ถ”์ฒœ ์ƒํ™ฉ: ์‹œํ€€์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ.

4. ๋น„๊ต ํ‘œ

์ „๋žต ID ์ƒ์„ฑ ์ฃผ์ฒด INSERT ์ง€์—ฐ ํ˜ธํ™˜์„ฑ ์„ฑ๋Šฅ ์ถ”์ฒœ ์ƒํ™ฉ
IDENTITY ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถˆ๊ฐ€๋Šฅ MySQL, SQL Server ๋“ฑ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ID ์ƒ์„ฑ ์œ„์ž„ ํ•„์š”ํ•  ๋•Œ
SEQUENCE ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค ๊ฐ€๋Šฅ Oracle, PostgreSQL ๋“ฑ ์šฐ์ˆ˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์‹œํ€€์Šค ์ง€์› DB ์‚ฌ์šฉ ์‹œ
TABLE ๋ณ„๋„ ํ…Œ์ด๋ธ” ๊ฐ€๋Šฅ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ฎ์Œ ์‹œํ€€์Šค ๋ฏธ์ง€์› DB, DB ๋…๋ฆฝ์  ๊ด€๋ฆฌ ํ•„์š” ์‹œ

5. ์ฝ”๋“œ ์˜ˆ์ œ

1. IDENTITY

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

2. SEQUENCE

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

3. TABLE

@Entity
@TableGenerator(
    name = "member_table_gen",
    table = "sequence_table",
    pkColumnName = "seq_name",
    valueColumnName = "seq_value",
    pkColumnValue = "member_seq",
    allocationSize = 1
)
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "member_table_gen")
    private Long id;
}

 


๐Ÿ“ JPA ์˜์†์„ฑ ์ปจํ…Œ์ด๋„ˆ์™€ PK

์˜์†์„ฑ ์ปจํ…Œ์ด๋„ˆ(JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ)๊ฐ€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์— ์‹๋ณ„์ž(PK)๊ฐ€ ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” JPA์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

@Id์™€ @GeneratedValue(strategy = GenerationType.IDENTITY)์— ๋Œ€ํ•œ ๋™์ž‘ ๋ฐฉ์‹

@GeneratedValue(strategy = GenerationType.IDENTITY)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ธฐ๋ณธ ํ‚ค(PK)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์˜ ๋™์ž‘ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1. em.persist() ํ˜ธ์ถœ ์‹œ์ 

  • JPA๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • GenerationType.IDENTITY ์ „๋žต์—์„œ๋Š” ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, em.persist()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ฆ‰์‹œ INSERT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

2. tx.commit() ํ˜ธ์ถœ ์‹œ์ 

  • em.persist() ์‹œ์ ์— ์ด๋ฏธ INSERT ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์œผ๋ฏ€๋กœ, ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์—๋Š” ์ถ”๊ฐ€์ ์ธ INSERT ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‹จ, em.persist() ์ดํ›„์— ์ˆ˜ํ–‰๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์˜ˆ: UPDATE, DELETE ๋“ฑ)์€ tx.commit() ์‹œ์ ์— ํ”Œ๋Ÿฌ์‹œ(Flush)๋˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

์ด์œ : GenerationType.IDENTITY์™€ PK ์ƒ์„ฑ ํƒ€์ด๋ฐ

GenerationType.IDENTITY๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ PK๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, JPA๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด PK๋ฅผ ๋จผ์ € ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ em.persist() ์‹œ์ ์— INSERT ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋‹ค๋ฅธ ID ์ƒ์„ฑ ์ „๋žต(TABLE, SEQUENCE, AUTO)๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ํฐ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค:

  • TABLE, SEQUENCE, AUTO:
    • JPA๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ์ „์— ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‹๋ณ„์ž(PK)๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ, em.persist() ์‹œ์ ์— INSERT๋ฅผ ์ง€์—ฐ(Delay)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • INSERT๋Š” ๋ณดํ†ต tx.commit() ์‹œ์ ์— ํ”Œ๋Ÿฌ์‹œ๋ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด PK ๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • @GeneratedValue(strategy = GenerationType.IDENTITY)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜ํ•ด PK๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, em.persist() ์‹œ์ ์— INSERT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ PK๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ID ์ƒ์„ฑ ์ „๋žต๊ณผ ๋‹ฌ๋ฆฌ, GenerationType.IDENTITY๋Š” INSERT ์ง€์—ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ฆ‰์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋” ์œ ์—ฐํ•œ JPA ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ˜Š

๋Œ“๊ธ€