[JPA] 4.์—”ํ‹ฐํ‹ฐ ๋งตํ•‘

 

1. ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ๋งตํ•‘

์—”ํ‹ฐํ‹ฐ ๋งตํ•‘ ์†Œ๊ฐœ

- ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ๋งตํ•‘ : @Entity, @Table

- ํ•„๋“œ์™€ ์ปฌ๋Ÿผ ๋งตํ•‘ : @Column

- ๊ธฐ๋ณธ ํ‚ค ๋งตํ•‘ : @Id

- ์—ฐ๊ด€๊ด€๊ณ„ ๋งตํ•‘ : @ManyToOne, @JoinColumn

 

1) ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ๋งตํ•‘

@Entity

- @Entitiy๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๊ฐ€ JPA๊ฐ€ ๊ด€๋ฆฌ

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

- ์ฃผ์˜)

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

 

@Entity ์†์„ฑ ์ •๋ฆฌ

- ์†์„ฑ : name (@Entity="Person") // ๊ฑฐ์˜ ์•ˆ์”€

> JPA์—์„œ ์‚ฌ์šฉํ•  ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •

> ๊ธฐ๋ณธ๊ฐ’ : ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ (ex: Member)

> ๊ฐ™์€ ํด๋ž˜์Šค ์ด๋ฆ„์ด ์—†์œผ๋ฉด ๊ฐ€๊ธ‰์  ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉ

 

@Table // ex.INSERT ๋„ฃ์„๋•Œ ํ…Œ์ด๋ธ”๋ช…

- (@Table(name="MBR"))


2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ

DB ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ

- DDL์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์—  ์ž๋™ ์ƒ์„ฑ
- ํ…Œ์ด๋ธ” ์ค‘์‹ฌ -> ๊ฐ์ฒด ์ค‘์‹ฌ

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ์„ ํ™œ์šฉํ•ด์„œ DB์— ๋งž๋Š” ์ ์ ˆํ•œ DDL ์ƒ์„ฑ

- ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ DDL์€ ๊ฐœ๋ฐœ ์žฅ๋น„์—์„œ๋งŒ ์‚ฌ์šฉ

- ์ƒ์„ฑ๋œ DDL์€ ์šด์˜์„œ๋ฒ„์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์ ์ ˆํžˆ ๋‹ค๋“ฌ์€ ํ›„ ์‚ฌ์šฉ

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ - ์†์„ฑ

hibernate.hbm2ddl.auto

์ฃผ์˜)

- ์šด์˜์žฅ๋น„์—๋Š” ์ ˆ๋Œ€ create / create-drop / update ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ!
- ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„ - create / update (๋กœ์ปฌ, ๊ฐœ๋ฐœ์„œ๋ฒ„)

- ํ…Œ์ŠคํŠธ ์„œ๋ฒ„ - validate

- ์Šคํ…Œ์ด์ง•๊ณผ ์šด์˜ ์„œ๋ฒ„ - validate / none


3. ํ•„๋“œ์™€ ์ปฌ๋Ÿผ ๋งตํ•‘

์š”๊ตฌ์‚ฌํ•ญ ์ถ”๊ฐ€

- ํšŒ์›์€ ์ผ๋ฐ˜ ํšŒ์›๊ณผ ๊ด€๋ฆฌ์ž๋กœ ๊ตฌ๋ถ„

- ํšŒ์› ๊ฐ€์ž…์ผ๊ณผ ์ˆ˜์ •์ผ์ด ์žˆ์–ด์•ผํ•จ

- ํšŒ์›์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์–ด์•ผํ•จ / ์ด ํ•„๋“œ๋Š” ๊ธธ์ด ์ œํ•œ์ด ์—†์Œ

@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;
}

 

๋งตํ•‘ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ

 

@Column

- unique ์ž˜ ์•ˆ์”€! (์ด๋ฆ„ ๋ฐ˜์˜์ด ์–ด๋ ค์›€)

-> @Table์—์„œ ๊ฑธ์–ด์คŒ

 

@Enumerated

- ์ž๋ฐ” enum ํƒ€์ž… ๋งตํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ

- ์ฃผ์˜! ORDINAL ์‚ฌ์šฉ X

- value 

EnumType.ORDINAL: enum ์ˆœ์„œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ (X)

EnumType.STRING: enum ์ด๋ฆ„์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ (O)

- ๊ธฐ๋ณธ๊ฐ’ : EnumType.ORDINAL

 

@Temporal

- ๋‚ ์งœ ํƒ€์ž… (java.util.Date, java.util.Calendar)์„ ๋งตํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ

- ์ฐธ๊ณ ) LocalDate, LocalDateTime์„ ์‚ฌ์šฉํ•  ๋• ์ƒ๋žต ๊ฐ€๋Šฅ (์ตœ์‹  hibernate ์ง€์›)

@Lob

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค BLOB, CLOB ๋งตํ•‘

- @Lob์—๋Š” ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ด ์—†๋‹ค

- ๋งตํ•‘ํ•˜๋Š” ํ•„๋“œ ํƒ€์ž…์ด ๋ฌธ์ž๋ฉด CLOB ๋งตํ•‘ ๋‚˜๋จธ์ง€๋Š” BLOB ๋งตํ•‘


@Transient : ๋งตํ•‘ํ•˜๊ธฐ ์‹ซ์œผ๋ฉด


4. ๊ธฐ๋ณธ ํ‚ค ๋งตํ•‘

๊ธฐ๋ณธ ํ‚ค ๋งตํ•‘ ์–ด๋…ธํ…Œ์ด์…˜

 

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

์ž๋™์ƒ์„ฑ : @Id + @GeneratedValue

- IDENTITY : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ„์ž„, MYSQL

- SEQUENCE : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์šฉ, ORACLE / @SequenceGenerator ํ•„์š”
- TABLE : ํ‚ค ์ƒ์„ฑ์šฉ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ, ๋ชจ๋“  DB์—์„œ ์‚ฌ์šฉ / @TableGenrator ํ•„์š”

- AUTO : ๋ฐฉ์–ธ์— ๋”ฐ๋ผ ์ž๋™ ์ง€์ •, ๊ธฐ๋ณธ๊ฐ’

 

@Entity
public class Member {
  @Id
  @GeneratedValue(strategy = GenrationType.AUTO)
  private String username;
  
  @Column(name="name", nullable=false)
  private String username;
  
  public Member() {
  }
  
  public String getId() { return id; }
  public void setId(String id) { this.id = id; }
  public String getUsername() { return username; }
  public void setUsername(String username) { this.username = username; }
}

[IDENTITY ์ „๋žต - ํŠน์ง•]

- ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ์„ DB์— ์œ„์ž„

- ์ฃผ๋กœ MySQL(AUTO_INCREMENT), PostgreSQL, SQL Server, DB2

- JPA๋Š” ๋ณดํ†ต ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์— INSERT SQL ์‹คํ–‰

- AUTO_INCREMENT๋Š” DB์— INSERT SQL์„ ์‹คํ–‰ํ•œ ์ดํ›„์— ID ๊ฐ’ ์•Œ ์ˆ˜ ์žˆ์Œ

- IDENTITY์ „๋žต์€ em.persist() ์‹œ์ ์— ์ฆ‰์‹œ INSERT SQL ์‹คํ–‰ํ•˜๊ณ  DB์—์„œ ์‹๋ณ„์ž๋ฅผ ์กฐํšŒ

 

[SEQUENCE ์ „๋žต - ํŠน์ง•]

- DB ์‹œํ€€์Šค๋Š” ์œ ์ผํ•œ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑํ•˜๋Š” ํŠน๋ณ„ํ•œ DB ์˜ค๋ธŒ์ ํŠธ (ex.์˜ค๋ผํด ์‹œํ€€์Šค)

- ์˜ค๋ผํด, PostgreSQL, DB2, H2

- @SequenceGenerator ํ•„์š”

@Entity
@SequenceGenerator(
  name = “MEMBER_SEQ_GENERATOR",
  sequenceName = “MEMBER_SEQ", //๋งคํ•‘ํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค ์ด๋ฆ„
  initialValue = 1, allocationSize = 1)
public class Member {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE,
  private Long id;

 

@SequenceGenerator

*์ฃผ์˜) allocationSize ๊ธฐ๋ณธ๊ฐ’ = 50

 

[TABLE ์ „๋žต]

- ํ‚ค ์ƒ์„ฑ ์ „์šฉ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ DB ์‹œํ€€์Šค๋ฅผ ํ‰๋‚ด๋‚ด๋Š” ์ „๋žต

์žฅ์ ) ๋ชจ๋“  DB ์ ์šฉ๊ฐ€๋Šฅ

๋‹จ์ ) ์„ฑ๋Šฅ

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",
  pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class Member {
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE,
    generator = "MEMBER_SEQ_GENERATOR")
  private Long id;

 

@TableGenrator - ์†์„ฑ

 

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

- ๊ธฐ๋ณธ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด : NOT NULL / ์œ ์ผ / ๋ณ€ํ•˜๋ฉด ์•ˆ๋จ

- ๋จผ๋ฏธ๋ž˜๊นŒ์ง€ ๋ณ€ํ•˜๋ฉด ์•ˆ๋จ / ๋ฌธ์ œ: ์ด๊ฑธ ๋งŒ์กฑํ•˜๋Š” ์ž์—ฐํ‚ค(์ฃผ๋ฏผ๋ฒˆํ˜ธ) ์ฐพ๊ธฐ ํž˜๋“ฆ / ๋Œ€๋ฆฌํ‚ค(๋Œ€์ฒดํ‚ค)๋ฅผ ์‚ฌ์šฉ -> generate value

- ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋„ ํ‚ค๋กœ ์ ์ ˆํ•˜์ง€ ์•Š์Œ

- ๊ถŒ์žฅ : Longํ˜• + ๋Œ€์ฒดํ‚ค + ํ‚ค ์ƒ์„ฑ์ „๋žต ์‚ฌ์šฉ

 

*์˜ˆ์™ธ์ ์œผ๋กœ IDENTITY์ „๋žต์˜ ๊ฒฝ์šฐ em.persist(member) ํ˜ธ์ถœ์‹œ์ ์— DB INSERT ์ฟผ๋ฆฌ ๋‚ ๋ฆผ (db์— ๋„ฃ์–ด์•ผ pk ์•Œ ์ˆ˜ ์žˆ์–ด์„œ)

 

* allocationsize ๋Š” 50์„ ๋ฏธ๋ฆฌ db์—์„œ ๋•ก๊ฒจ์„œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ (์ˆซ์ž๋ฅผ ๋ฏธ๋ฆฌ ํ™•๋ณด, ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ฐ€๋Šฅ)

 


5. ์‹ค์ „ ์˜ˆ์ œ - 1. ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„๊ณผ ๊ธฐ๋ณธ ๋งตํ•‘

์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„

- ํšŒ์›์€ ์ƒํ’ˆ ์ฃผ๋ฌธ ๊ฐ€๋Šฅ

- ์ฃผ๋ฌธ ์‹œ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ƒํ’ˆ ์„ ํƒ ๊ฐ€๋Šฅ

 

๊ธฐ๋Šฅ ๋ชฉ๋ก

 

๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ถ„์„

- ํšŒ์›๊ณผ ์ฃผ๋ฌธ์˜ ๊ด€๊ณ„ : ํšŒ์›์€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฃผ๋ฌธ (์ผ๋Œ€๋‹ค)

- ์ฃผ๋ฌธ ์ƒํ’ˆ(๋‹ค๋Œ€๋‹ค)

 

ํ…Œ์ด๋ธ” ์„ค๊ณ„

 

์—”ํ‹ฐํ‹ฐ ์„ค๊ณ„์™€ ๋งตํ•‘

 

@Table์— index

@Column์— length 

๊ฐ™์€ ์กฐ๊ฑด๋“ค ๋„ฃ์–ด์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค

 

 

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์„ค๊ณ„์˜ ๋ฌธ์ œ์ 

- ํ˜„์žฌ ๋ฐฉ์‹ -> ๊ฐ์ฒด ์„ค๊ณ„๋ฅผ ํ…Œ์ด๋ธ” ์„ค๊ณ„์— ๋งž์ถ˜ ๋ฐฉ์‹

- ํ…Œ์ด๋ธ” ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ฐ์ฒด์— ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ด

- ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ถˆ๊ฐ€๋Šฅ

- ์ฐธ์กฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ UML๋„ ์ž˜๋ชป๋จ

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ