ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ’ก๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ๋งคํ•‘

๐Ÿ’ป @Entity

'@Entity' ์• ๋…ธํ…Œ์ด์…˜์€ ํด๋ž˜์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ๋งคํ•‘๋  ์—”ํ‹ฐํ‹ฐ์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ด ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด JPA๊ฐ€ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

 

JPA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•  ํด๋ž˜์Šค๋Š” @Entity๊ฐ€ ํ•„์ˆ˜์ด๋‹ค.

 

์ฃผ์˜์‚ฌํ•ญ

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์ˆ˜์ด๋‹ค. (public ๋˜๋Š” protected).
  • final ํด๋ž˜์Šค, enum, interface, inner ํด๋ž˜์Šค์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • final ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์†์„ฑ: name

  • JPA์—์„œ ์‚ฌ์šฉํ•  ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. 
  • ๊ธฐ๋ณธ๊ฐ’์€ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ๋™์ผํ•œ ์ด๋ฆ„์˜ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๊ฐ€ ์žˆ์„ ๋•Œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ๊ฐ™์€ ํด๋ž˜์Šค ์ด๋ฆ„์ด ์—†์œผ๋ฉด ๊ฐ€๊ธ‰์  ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.
@Entity(name = "myMember")
public class Member { ... }

 

๐Ÿ’ป @Table

'@Table' ์• ๋…ธํ…Œ์ด์…˜์€ ์—”ํ‹ฐํ‹ฐ์™€ ๋งคํ•‘ํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•œ๋‹ค. 

์ƒ๋žตํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ํ…Œ์ด๋ธ” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

์†์„ฑ

  • name: ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.
  • catalog: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ catalog๋ฅผ ๋งคํ•‘ํ•œ๋‹ค.
  • schema: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ schema ๋งคํ•‘ํ•œ๋‹ค.
  • uniqueConstraints: ํ…Œ์ด๋ธ”์˜ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์ง€์ •ํ•œ๋‹ค. ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ ์‹œ์—๋งŒ ์ ์šฉ๋œ๋‹ค.
@Entity
@Table(name = "t_member", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"})})
public class Member { ... }

 

 

๐Ÿ’ป ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ

  1. ํ…Œ์ด๋ธ” ์ค‘์‹ฌ์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ์˜ ์ „ํ™˜:
    • ์ „ํ†ต์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ…Œ์ด๋ธ” ์ค‘์‹ฌ์ด์—ˆ์œผ๋‚˜, ORM์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ์‚ฌ์ด์˜ ๊ฐ„๊ทน์„ ์ค„์—ฌ ์ค€๋‹ค.
  2. DDL ์ž๋™ ์ƒ์„ฑ:
    • ORM ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์™€ ๊ทธ ๊ด€๊ณ„๋“ค์„ ๋ถ„์„ํ•˜์—ฌ ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”, ์นผ๋Ÿผ, ์ œ์•ฝ์กฐ๊ฑด(์˜ˆ: ์™ธ๋ž˜ ํ‚ค, ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด) ๋“ฑ์˜ DDL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ์„ ๊ณ ๋ คํ•˜์—ฌ, Oracle, MySQL, PostgreSQL ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ๋งž๋Š” ์ฟผ๋ฆฌ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
  3. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ์‚ฌ์šฉ:
    • ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ ๊ธฐ๋Šฅ์€ ์ฃผ๋กœ ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋‚˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์œ ์šฉํ•˜๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ์ด ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋˜๋Š” DDL์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๋™์„ ์‹ ์†ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ์šด์˜ ํ™˜๊ฒฝ์—์„œ์˜ ์‚ฌ์šฉ ์ œํ•œ:
    • ์šด์˜ ์„œ๋ฒ„์—์„œ๋Š” ์ž๋™ ์ƒ์„ฑ๋œ DDL์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค. ๋Œ€์‹ , ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ƒ์„ฑ๋œ DDL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐ ๊ธฐํƒ€ ํ•„์š”ํ•œ ์ˆ˜์ •์„ ๊ฑฐ์นœ ํ›„ ์šด์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

์†์„ฑ

์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ์€ persistence.xml ๋˜๋Š” application.yml๊ณผ ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ • ํŒŒ์ผ์—์„œ ๊ด€๋ จ ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

<property name="hibernate.hbm2ddl.auto" value="create"/>
  • create
    ๊ธฐ์กด ํ…Œ์ด๋ธ”์„ ์‚ญ์ œ ํ›„ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ๋‹ค. (DROP + CREATE)
  • create-drop
    create์™€ ๊ฐ™์œผ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒ์‹œ์ ์— ์ƒ์„ฑํ•œ ํ…Œ์ด๋ธ”์„ DROPํ•œ๋‹ค. (DROP + CREATE + DROP)
  • update
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘์ •๋ณด๋ฅผ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ์ˆ˜์ •ํ•œ๋‹ค.
    (column ์‚ญ์ œ๋Š” ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.)  (์šด์˜ DB์—๋Š” ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.)
  • validate
    ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”์ด ์ •์ƒ ๋งคํ•‘๋˜์—ˆ๋Š”์ง€๋งŒ ํ™•์ธํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘์ •๋ณด๋ฅผ ๋น„๊ตํ•ด์„œ ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • none
    ์ž๋™ ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. (์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ฒƒ๊ณผ ๋™์ผ)

์ฃผ์˜์‚ฌํ•ญ

  • ์šด์˜ ์žฅ๋น„์—๋Š” ์ ˆ๋Œ€ create, create-drop, update ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  • ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋Š” create ๋˜๋Š” update
  • ํ…Œ์ŠคํŠธ ์„œ๋ฒ„๋Š” update ๋˜๋Š” validate
  • ์Šคํ…Œ์ด์ง•๊ณผ ์šด์˜ ์„œ๋ฒ„๋Š” validate ๋˜๋Š” none

 

๐Ÿ’ป DDL ์ƒ์„ฑ ๊ธฐ๋Šฅ

์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€

  • ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ์— ๋‹ค์–‘ํ•œ ์ œ์•ฝ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํšŒ์›์˜ ์ด๋ฆ„์ด ํ•„์ˆ˜์ด๋ฉฐ ์ตœ๋Œ€ 10์ž๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
@Column(nullable = false, length = 10)
private String name;

 

์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€

  • ํ…Œ์ด๋ธ” ์ˆ˜์ค€์—์„œ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ์กฐํ•ฉํ•œ ๋ณตํ•ฉ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
@Table(uniqueConstraints = {@UniqueConstraint(name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"})})

 

JPA ์‹คํ–‰ ๋กœ์ง์— ์˜ํ–ฅ ์—†์Œ

  • DDL ์ƒ์„ฑ ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, JPA์˜ ์‹คํ–‰ ๋กœ์ง์—๋Š” ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๋Ÿฐํƒ€์ž„์—๋Š” ์—”ํ‹ฐํ‹ฐ ๊ด€๋ฆฌ์™€ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์ด ์ค‘์‹ฌ์ด ๋˜๋ฉฐ, DDL ์ƒ์„ฑ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๋‚˜ ์ดˆ๊ธฐ ์„ค์ • ๋‹จ๊ณ„์—์„œ๋งŒ ๊ด€๋ จ์ด ์žˆ๋‹ค.

๐Ÿ’กํ•„๋“œ์™€ ์ปฌ๋Ÿผ ๋งคํ•‘

@Entity
public class Member {

    @Id
    private Long id;

    @Column(name = "name")
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob
    private String description;

    public Member() {
    }
}

 

๐Ÿ’ป ๋งคํ•‘ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ

 

๐Ÿ’ป @Column

  1. name:
    • ์—ญํ• : ํ•„๋“œ์™€ ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’: ๊ฐ์ฒด์˜ ํ•„๋“œ ์ด๋ฆ„์ด ์‚ฌ์šฉ๋œ๋‹ค.
  2. insertable, updatable:
    • ์—ญํ• : ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ํ•ด๋‹น ์ปฌ๋Ÿผ์ด ํฌํ•จ๋ ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. (๋“ฑ๋ก, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€)
    • ๊ธฐ๋ณธ๊ฐ’: 'true' (๋“ฑ๋ก๊ณผ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค).
  3. nullable (DDL):
    • ์—ญํ• : ์ปฌ๋Ÿผ์ด null ๊ฐ’์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’: 'true' (null ํ—ˆ์šฉ).
    • 'false'๋กœ ์„ค์ •ํ•˜๋ฉด, DDL ์ƒ์„ฑ ์‹œ 'NOT NULL' ์ œ์•ฝ์กฐ๊ฑด์ด ์ ์šฉ๋œ๋‹ค.
  4. unique (DDL):
    • ์—ญํ• : ๋‹จ์ผ ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์„ค์ •ํ•œ๋‹ค.
    • ์ฃผ์˜: ๋ณต์žกํ•œ ์œ ๋‹ˆํฌ ์กฐ๊ฑด์€ '@Table'์˜ 'uniqueConstraints'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • ์ด ์˜ต์…˜์€ ์ปฌ๋Ÿผ์ด ์œ ์ผํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  5. columnDefinition (DDL):
    • ์—ญํ• : ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ SQL ์ •์˜๋ฅผ ์ง์ ‘ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •, ์ปฌ๋Ÿผ ํƒ€์ž… ์ง€์ • ๋“ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์˜ˆ์‹œ: 'columnDefinition = "varchar(100) default 'EMPTY'" ๋Š” ๊ธฐ๋ณธ๊ฐ’์„ 'EMPTY'๋กœ ํ•˜๋Š” varchar ์ปฌ๋Ÿผ์„ ์ƒ์„ฑํ•œ๋‹ค.
@Column(name = "name", columnDefinition = "varchar(100) default 'EMPTY'")
    private String name;

 

 

   6. length (DDL):

  • ์ ์šฉ ๋Œ€์ƒ: 'String' ํƒ€์ž…์˜ ํ•„๋“œ์— ์‚ฌ์šฉ๋œ๋‹ค.
  • ์—ญํ• : ๋ฌธ์ž์—ด ๊ธธ์ด ์ œ์•ฝ์กฐ๊ฑด์„ ์„ค์ •ํ•œ๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’: 255

   7. precision, scale (DDL):

  • ์ ์šฉ ๋Œ€์ƒ: ์ฃผ๋กœ 'BigDecimal' (๋˜๋Š” 'BigInteger') ํƒ€์ž…์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
  • precision: ์†Œ์ˆ˜์ ์„ ํฌํ•จํ•œ ์ „์ฒด ์ˆซ์ž์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.
  • scale: ์†Œ์ˆ˜์  ์ดํ•˜์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.
  • ์˜ˆ์‹œ: precision = 19, scale = 2๋Š” ์ตœ๋Œ€ 19์ž๋ฆฌ ์ˆซ์ž ์ค‘ ์†Œ์ˆ˜์  ์•„๋ž˜ 2์ž๋ฆฌ๊นŒ์ง€๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์ˆซ์žํ˜• ํ•„๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด ์„ค์ •์€ ์•„์ฃผ ํฐ ์ˆ˜๋‚˜ ์ •๋ฐ€ํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

๐Ÿ’ป @Enumerated

@Enumerated๋Š” ์ž๋ฐ” enum ํƒ€์ž…์„ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

  1. EnumType.ORDINAL:
    • enum ์ˆœ์„œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค. (0,1,2 ....)
    • enum ํ•ญ๋ชฉ์˜ ์œ„์น˜์— ๋”ฐ๋ผ ์ •์ˆ˜ ๊ฐ’์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ๋‹ค.
  2. EnumType.STRING: 
    • enum์˜ ์ด๋ฆ„์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค.
    • enum ํ•ญ๋ชฉ์˜ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ฉฐ, enum ์ •์˜์˜ ๋ณ€๊ฒฝ์— ๋” ์œ ์—ฐํ•˜๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด EnumType.STRING์— ๋น„ํ•ด EnumType.ORDINAL์ด ๊ฐ€์ง€๋Š” ๋‹จ์ ์€ ๋ฌด์—‡์ผ๊นŒ?

EnumType.ORDINAL ์„ค์ •์€ ์—ด๊ฑฐํ˜•์˜ ๊ฐ ์ƒ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ •์ˆ˜๋กœ ์ €์žฅ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

public enum Status {
    OPEN, REVIEW, CLOSED
}
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;

@Entity
public class Task {
    @Id
    private Long id;

    @Enumerated(EnumType.ORDINAL)
    private Status status;
}

 

์ด๋ ‡๊ฒŒ Enum ํƒ€์ž…๊ณผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ •์˜ํ–ˆ๋‹ค๋ฉด, 'OPEN'์€ 0, 'REVIEW'๋Š” 1, 'CLOSED'๋Š” 2๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ๋‹ค.

 

๋‹จ์  1. ์ˆœ์„œ ์˜์กด์„ฑ

์œ„์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€,

๋งŒ์•ฝ Enum ์ƒ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ OPEN, CLOSED, REVIEW ์ˆœ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, OPEN๊ณผ REVIEW ์‚ฌ์ด์— ์ƒˆ๋กœ์šด ์ƒ์ˆ˜ 'RESERVE'๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ๊ธฐ์กด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

 

๋‹จ์  2. ๊ฐ€๋…์„ฑ ์ €ํ•˜

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ’์„ ์กฐํšŒํ•  ๋•Œ ์ •์ˆ˜ ๊ฐ’๋งŒ ๋ณด๊ณ ๋Š” ์–ด๋–ค ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

 

 

๐Ÿ’ป @Temporal

@Temporal ์• ๋…ธํ…Œ์ด์…˜์€ ์ž๋ฐ”์˜ java.util.Date์™€ java.util.Calendar ํƒ€์ž…์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ํƒ€์ž…๊ณผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” LocalDate์™€ LocalDateTime์„ ์ž๋™์œผ๋กœ ์ง€์›ํ•˜๋ฏ€๋กœ, ์ด ๊ฒฝ์šฐ @Temporal ์• ๋…ธํ…Œ์ด์…˜์€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

 

  1. TemporalType.DATE:
    • ์˜ค์ง ๋‚ ์งœ๋งŒ์„ ์ €์žฅํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ date ํƒ€์ž…๊ณผ ๋งคํ•‘๋˜๋ฉฐ, ์‹œ๊ฐ„ ์ •๋ณด๋Š” ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. (์˜ˆ: 2013-10-11).
  2. TemporalType.TIME:
    • ์˜ค์ง ์‹œ๊ฐ„๋งŒ์„ ์ €์žฅํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ time ํƒ€์ž…๊ณผ ๋งคํ•‘๋˜๋ฉฐ, ๋‚ ์งœ ์ •๋ณด๋Š” ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. (์˜ˆ: 11:11:11).
  3. TemporalType.TIMESTAMP:
    • ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋ชจ๋‘ ์ €์žฅํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ timestamp ํƒ€์ž…๊ณผ ๋งคํ•‘๋˜๋ฉฐ, ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ์ €์žฅ๋œ๋‹ค. (์˜ˆ: 2013-10-11 11:11:11).

 

๐Ÿ’ป @Lob

@Lob ์• ๋…ธํ…Œ์ด์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ BLOB (Binary Large OBject) ๋˜๋Š” CLOB (Character Large OBject) ํƒ€์ž…๊ณผ ๋งคํ•‘๋  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ์• ๋…ธํ…Œ์ด์…˜์€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜๋ฉฐ, ๋งคํ•‘ํ•  ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ CLOB ๋˜๋Š” BLOB์œผ๋กœ ๋งคํ•‘๋œ๋‹ค.

 

  • ์†์„ฑ: @Lob์—๋Š” ์„ค์ •ํ•  ์†์„ฑ์ด ์—†๋‹ค.
  • CLOB ๋งคํ•‘: ๋ฌธ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. String, char[], java.sql.CLOB ํƒ€์ž…์˜ ํ•„๋“œ์— ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ CLOB ํƒ€์ž…๊ณผ ๋งคํ•‘๋œ๋‹ค.
  • BLOB ๋งคํ•‘: ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. byte[], java.sql.BLOB ํƒ€์ž…์˜ ํ•„๋“œ์— ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ BLOB ํƒ€์ž…๊ณผ ๋งคํ•‘๋œ๋‹ค.

 

๐Ÿ’ป @Transient

@Transient ์• ๋…ธํ…Œ์ด์…˜์€ ํŠน์ • ํ•„๋“œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์ด ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ ํ•„๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์กฐํšŒ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์˜ค์ง ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ๋งŒ ๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค.

์ด๋Š” ์ฃผ๋กœ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด๋‚˜ ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์—”ํ‹ฐํ‹ฐ์˜ ์ผ๋ถ€๋กœ ์˜์†ํ™”ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ •๋ณด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

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

    private String name; // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋  ํ•„๋“œ

    @Transient
    private Integer temp; // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์ง€ ์•Š์„ ์ž„์‹œ ํ•„๋“œ

    // ์ƒ์„ฑ์ž, ๊ฒŒํ„ฐ, ์„ธํ„ฐ ๋“ฑ ๊ธฐํƒ€ ๋ฉ”์†Œ๋“œ
}
  • ํ•„๋“œ ๋งคํ•‘ ์ œ์™ธ: @Transient ์• ๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•œ temp ํ•„๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ์–ด๋–ค ์ปฌ๋Ÿผ๊ณผ๋„ ๋งคํ•‘๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์กฐํšŒ ์ œ์™ธ: ์ด ํ•„๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์กฐํšŒ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์˜ค์ง Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์šฉ๋„: ์ด ํ•„๋“œ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ค‘ ์ž„์‹œ๋กœ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด๋‚˜ ์ƒํƒœ ์ •๋ณด ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—”ํ‹ฐํ‹ฐ์˜ ์˜์†ํ™” ๊ณผ์ •์—์„œ ์ œ์™ธ๋œ๋‹ค.

๐Ÿ’ก๊ธฐ๋ณธ ํ‚ค ๋งคํ•‘

๊ธฐ๋ณธ ํ‚ค ๋งคํ•‘์€ ์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋ณธ ํ‚ค(primary key)์™€ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค. JPA์—์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ์• ๋…ธํ…Œ์ด์…˜์€ @Id์™€ @GeneratedValue์ด๋‹ค.

 

๐Ÿ’ป  ์ง์ ‘ ํ• ๋‹น: @Id ๋งŒ ์‚ฌ์šฉ

@Id๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ฅผ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋กœ ์ง€์ •ํ•œ๋‹ค. ์ด ํ•„๋“œ์˜ ๊ฐ’์€ ์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ฐ ์—”ํ‹ฐํ‹ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์œ ์ผํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•œ๋‹ค.

๐Ÿ’ป  ์ž๋™ ์ƒ์„ฑ: @GeneratedValue ์• ๋…ธํ…Œ์ด์…˜

@GeneratedValue ์• ๋…ธํ…Œ์ด์…˜์€ ๊ธฐ๋ณธ ํ‚ค์˜ ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์„ ์ง€์ •ํ•œ๋‹ค. ์ด ์• ๋…ธํ…Œ์ด์…˜์€ strategy ์†์„ฑ์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํ‚ค ์ƒ์„ฑ ์ „๋žต์„ ์ง€์›ํ•œ๋‹ค.

  1. IDENTITY: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ํ‚ค ๊ฐ’์„ ์ƒ์„ฑํ•˜๋„๋ก ์œ„์ž„ํ•œ๋‹ค. ์ด ์ „๋žต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ง€์›ํ•˜๋Š” auto-increment ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  2. SEQUENCE: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค ๊ฐ’์„ ์ƒ์„ฑํ•œ๋‹ค. ์ด ์ „๋žต์€ ์‹œํ€€์Šค ์ƒ์„ฑ๊ธฐ๋ฅผ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฉฐ, ์‹œํ€€์Šค์˜ ์ด๋ฆ„, ์ดˆ๊ธฐ๊ฐ’, ์ฆ๊ฐ€ ํฌ๊ธฐ ๋“ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. TABLE: ํ‚ค ์ƒ์„ฑ ์ „์šฉ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ํŠน์ • ํ…Œ์ด๋ธ”์—์„œ ํ•„์š”ํ•œ ํ‚ค ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  4. AUTO: ํ”Œ๋žซํผ(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ)์— ๋”ฐ๋ผ ์ตœ์ ์˜ ์ „๋žต(IDENTITY, SEQUENCE, TABLE)์„ ์ž๋™์œผ๋กœ ์„ ํƒํ•œ๋‹ค.

 

๐Ÿ’ป  IDENTITY

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}
  • ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ„์ž„ํ•œ๋‹ค.
  • ์ฃผ๋กœ MySQL, PostgreSQL, SQL Server, DB2์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. (์˜ˆ: MySQL์˜ AUTO_INCREMENT)
  • JPA๋Š” ๋ณดํ†ต ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์— INSERT SQL์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ, AUTO_INCREMENT๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— INSERT SQL์„ ์‹คํ–‰ํ•œ ์ดํ›„์— ID๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ IDENTITY ์ „๋žต์€ em.persis() ์‹œ์ ์— ์ฆ‰์‹œ INSERT SQL์„ ์‹คํ–‰ํ•˜๊ณ  DB์—์„œ ์‹๋ณ„์ž๋ฅผ ์กฐํšŒํ•œ๋‹ค.

๐Ÿ’ป  SEQUENCE

@Entity
@SequenceGenerator(
    name = "MEMBER_SEQ_GENERATOR",
    sequenceName = "MEMBER_SEQ",
    initialValue = 1,
    allocationSize = 1
)
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
    private Long id;
}
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค๋Š” ์œ ์ผํ•œ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. 
  • Oracle, PostgreSQL, DB2 ๋“ฑ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
  • 'allocationSize'๋ฅผ 1๋กœ ์„ค์ •ํ•˜๋ฉด, ์‹œํ€€์Šค ๊ฐ’์ด ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.

@SequenceGenerator ์†์„ฑ

@SequenceGenerator๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

  • name: ์‹๋ณ„์ž ์ƒ์„ฑ๊ธฐ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. ์ด ์ด๋ฆ„์€ @GeneratedValue์—์„œ generator ์†์„ฑ์œผ๋กœ ์ฐธ์กฐ๋œ๋‹ค.
  • sequenceName: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ์‹ค์ œ ์‹œํ€€์Šค์˜ ์ด๋ฆ„์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ hibernate_sequence์ด๋‹ค.
  • initialValue: ์‹œํ€€์Šค DDL์„ ์ƒ์„ฑํ•  ๋•Œ ์‹œํ€€์Šค์˜ ์‹œ์ž‘ ์ˆซ์ž๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
  • allocationSize: ์‹œํ€€์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์‚ฌ์šฉ๋œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 50์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค ๊ฐ’์ด ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€ํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด 1๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • catalog, schema: ์‹œํ€€์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์นดํƒˆ๋กœ๊ทธ ๋˜๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ป  TABLE

create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
@Entity
@TableGenerator(
    name = "MEMBER_SEQ_GENERATOR",
    table = "MY_SEQUENCES",
    pkColumnName = "sequence_name",
    valueColumnName = "next_val",
    pkColumnValue = "MEMBER_SEQ",
    allocationSize = 1
)
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
    private Long id;
}
  • ํ‚ค ์ƒ์„ฑ ์ „์šฉ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค๋ฅผ ํ‰๋‚ด๋‚ด๋Š” ์ „๋žต์ด๋‹ค.
  • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋‹ค์†Œ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

@TableGenerator ์†์„ฑ 

@TableGenerator๋Š” ํ‚ค ์ƒ์„ฑ ์ „์šฉ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • name: ์‹๋ณ„์ž ์ƒ์„ฑ๊ธฐ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. ์ด ์ด๋ฆ„์€ @GeneratedValue์—์„œ generator ์†์„ฑ์œผ๋กœ ์ฐธ์กฐ๋œ๋‹ค.
  • table: ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ hibernate_sequences์ด๋‹ค.
  • pkColumnName: ํ…Œ์ด๋ธ”์—์„œ ์‹๋ณ„์ž ์ด๋ฆ„์„ ์ €์žฅํ•˜๋Š” ์ปฌ๋Ÿผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ sequence_name์ด๋‹ค.
  • valueColumnName: ์‹๋ณ„์ž ๊ฐ’์ด ์ €์žฅ๋  ์ปฌ๋Ÿผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ next_val์ด๋‹ค.
  • pkColumnValue: ํŠน์ • ์—”ํ‹ฐํ‹ฐ์˜ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’์˜ ์ด๋ฆ„์ด๋‹ค. ์ฃผ๋กœ ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • initialValue: ์‹๋ณ„์ž์˜ ์ดˆ๊ธฐ ๊ฐ’์œผ๋กœ, ๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ’์ด ๊ธฐ์ค€์ด ๋œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ด๋‹ค.
  • allocationSize: ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ์— ์ฆ๊ฐ€ํ•˜๋Š” ์‹๋ณ„์ž์˜ ์ˆ˜์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 50์ด๋‹ค.
  • catalog, schema: ํ‚ค ์ƒ์„ฑ ํ…Œ์ด๋ธ”์ด ์œ„์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์นดํƒˆ๋กœ๊ทธ ๋˜๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • uniqueConstraints: ์œ ๋‹ˆํฌ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ป  ๊ถŒ์žฅํ•˜๋Š” ์‹๋ณ„์ž ์ „๋žต

๊ธฐ๋ณธ ํ‚ค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

  • ํ‚ค๋Š” null์ด ์•„๋‹ˆ์–ด์•ผ ํ•˜๋ฉฐ, ์œ ์ผํ•ด์•ผ ํ•˜๊ณ , ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์ด ์กฐ๊ฑด๋“ค์„ ๋งŒ์กฑํ•˜๋Š” ์ž์—ฐํ‚ค๋ฅผ ์ฐพ๊ธฐ๋Š” ์ข…์ข… ์–ด๋ ต๋‹ค. ์ž์—ฐํ‚ค๋ž€ ์—”ํ‹ฐํ‹ฐ์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‹๋ณ„์ž ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์—ฐํ‚ค์— ํ•ด๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์ œ๋‚˜ ํ‚ค ๊ฐ’์˜ ๋ณ€๋™ ๊ฐ€๋Šฅ์„ฑ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ !!!! ๋Œ€๋ฆฌํ‚ค(๋Œ€์ฒดํ‚ค)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋Œ€์ฒดํ‚ค ์‚ฌ์šฉ์˜ ์žฅ์ :

  1. ๋ณ€ํ•˜์ง€ ์•Š์Œ: ๋Œ€๋ฆฌํ‚ค๋Š” ์ƒ์„ฑ๋œ ํ›„์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž๋กœ์„œ์˜ ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.
  2. ์œ ์ผ์„ฑ ๋ณด์žฅ: ์‹œ์Šคํ…œ์ด ๊ด€๋ฆฌํ•˜๋Š” ํ‚ค์ด๋ฏ€๋กœ ์ค‘๋ณต์˜ ์šฐ๋ ค๊ฐ€ ์—†๋‹ค.
  3. ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ: ๋น„์ฆˆ๋‹ˆ์Šค์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์—์„œ ์ž์œ ๋กญ๋‹ค.

ํ‚ค ์ƒ์„ฑ ์ „๋žต:

  • Longํ˜• ID ์‚ฌ์šฉ: ์ผ๋ฐ˜์ ์œผ๋กœ Long ํƒ€์ž…์˜ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋ฆฌํ‚ค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ถฉ๋ถ„ํžˆ ํฐ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ™•์žฅ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๋™ ํ‚ค ์ƒ์„ฑ: @GeneratedValue ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ IDENTITY, SEQUENCE ๋˜๋Š” TABLE ์ „๋žต ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ์ „๋žต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ์„ ํƒ๋œ๋‹ค.