Entity Class

Entity Class ๋Š” database table ์— mapping ๋œ Java Class ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. Entity Class ๋Š” ORM ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ OOP ์™€ DB ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Entity Class ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•˜์—ฌ๋Š” ๋‹ค์Œ ์ตœ์†Œํ•œ์˜ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜๋‹ค.

  • @Entity annotated ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • public ๋˜๋Š” protected ์ธ default constructor (no-arguments) ๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

Java Annotation

๋‹ค์Œ์€ Java Annotation ์„ ์‚ฌ์šฉํ•˜์—ฌ Java class ์™€ Database ๋ฅผ mapping ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Step 1: Map class to database table

๋จผ์ € class ๋ฅผ database ์˜ table ๊ณผ mapping ์‹œ์ผœ์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

@Entity
@Table(name="student")
public class Student {
	...
}

์šฐ์„  @Entity annotation ์„ ์‚ฌ์šฉํ•˜์—ฌ Student class ๋ฅผ Entity Class ๋กœ ์‚ฌ์šฉํ•˜๊ณ , @Table annotation ์„ ์‚ฌ์šฉํ•˜์—ฌ explicit ํ•˜๊ฒŒ class ์™€ database ์˜ table ์„ mapping ํ•œ๋‹ค.

Step 2: Map fields to database columns

๊ทธ ๋‹ค์Œ์€ class ์˜ ๊ฐ๊ฐ์˜ field ๋ฅผ, database table ์˜ ๊ฐ๊ฐ์˜ column ์œผ๋กœ mapping ์‹œ์ผœ์ฃผ๋Š” ์ž‘์—…์ด๋‹ค.

@Entity
@Table(name="student")
public class Student {
	
	@Id
	@Column(name="id")
	private int id;
 
	@Column(name="first_name")
	private String firstName;
 
	...
}

@Column annotation ์„ ์‚ฌ์šฉํ•˜์—ฌ explicit ํ•˜๊ฒŒ field ์™€ column ์„ mapping ์‹œ์ผœ์ค€ ๋ชจ์Šต์ด๋‹ค.

Implicit or Explicit

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ @Table, @Column annotation ์„ ์‚ฌ์šฉํ•˜์—ฌ explicit ํ•˜๊ฒŒ mapping ํ•˜๋Š” ๊ฒƒ์€ ์ถ”์ฒœ๋˜์ง€ ์•Š๋Š”๋‹ค. ์šฐ์„ , implicit mapping ์„ ํ†ตํ•˜์—ฌ class name ์„ table name ์œผ๋กœ, field name ์„ column name ์œผ๋กœ ์ž๋™ mapping ํ•˜๋Š” ๊ทœ์น™์ด ์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ๋„ ํ›จ์”ฌ ๊น”๋”ํ•ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉฐ, Database ์˜ ์„ค๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ explicit ํ•˜๊ฒŒ ์„ค์ •๋œ mapping ์ •๋ณด๋Š” ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๋” ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด implicit mapping ์—์„œ๋Š” class ๋ฐ field ์˜ ์ด๋ฆ„๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.

Primary Key

Primary Key ๋Š” RDB ์—์„œ table ์˜ ๊ฐ row ๋ฅผ uniquely ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” key ์ด๋‹ค. Primary ๋Š” ๋‹ค์Œ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

  • ์œ ์ผ์„ฑ: key ๊ฐ’์€ table ๋‚ด์—์„œ ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค.
  • NULL ๊ฐ’ ๋ถˆํ—ˆ: key ๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, NULL ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
  • ๋‹จ์ผ์„ฑ: ํ•˜๋‚˜์˜ table ์—๋Š” ํ•˜๋‚˜์˜ primary key ๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
MySQL - Auto Increment
CREATE TABLE student (
	id int NOT NULL AUTO_INCREMENT,
	first_name varchar(45) DEFAULT NULL,
	last_name varchar(45) DEFAULT NULL,
	email varchar(45) DEFAULT NULL,
	PRIMARY KEY (id)
)

SQL ์ƒ์—์„œ AUTO_INCREMENT ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ id ๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ด์œผ๋กœ์จ uniqueness ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๋งˆ์ง€๋ง‰์— PRIMARY KEY (id) ๋กœ column name ์„ ์ง€์ •ํ•˜์—ฌ Primary Key ๋กœ ์„ค์ •ํ•œ๋‹ค.

JPA Identity - Primary Key
@Entity
@Table(name="student")
public class Student {
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id")
	private int id;
	
	...
}

JPA ์—์„œ๋Š” ํŠน์ • field ์— @Id annotation ์„ ์ถ”๊ฐ€ํ•ด์คŒ์œผ๋กœ์จ Primary Key ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๋˜ํ•œ @GeneratedValue() ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ง์ ‘ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, Database ๊ฐ€ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” Primary Key ์˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ID Generation Strategies ๋Š” ๋‹ค์Œ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

JPA ID Generation Strategies
  1. GenerationType.AUTO

    • JPA๊ฐ€ Database Dialect ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ID ์ƒ์„ฑ ์ „๋žต์„ ์ž๋™์œผ๋กœ ์„ ํƒ
  2. GenerationType.IDENTITY

    • Database ์˜ย AUTO_INCREMENTย ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ID๋ฅผ ์ƒ์„ฑ
  3. GenerationType.SEQUENCE

    • Database ์˜ Sequence(DB ์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ฐ์†Œํ•˜๋Š” ์ˆซ์ž ๊ฐ’์„ ์ž๋™์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” object) ๋ฅผ ์‚ฌ์šฉํ•ด ๊ณ ์œ ํ•œ ID ๋ฅผ ์ƒ์„ฑ
    • @SequenceGenerator ๋ฅผ ํ†ตํ•ด Sequence ์„ค์ • ๊ฐ€๋Šฅ
  4. GenerationType.TABLE

    • ๋ณ„๋„์˜ Table ์„ ๋งŒ๋“ค์–ด ID๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•, Sequence ๋ฅผ ํ‰๋‚ด๋‚ด๋Š” ๋ฐฉ์‹
    • ๋ชจ๋“  Database ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์ด ๋‚ฎ์•„ ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ
  5. GenerationType.UUID

    • ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๊ณ ์œ ํ•œ UUID๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ID๋กœ ์‚ฌ์šฉ, 128-bit ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ ์ „์ฒด์—์„œ๋„ ๊ณ ์œ ํ•จ
    • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์œ ์šฉํ•˜์ง€๋งŒ indexing ํšจ์œจ์ด ๋–จ์–ด์ง€๊ณ  ์ €์žฅ ๊ณต๊ฐ„์„ ๋งŽ์ด ์ฐจ์ง€ํ•จ

์ด๋“ค๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ์ง์ ‘ generation stategy ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. org.hibernate.id.IdentifierGenerator Interface ์˜ public Serializable generate() method ๋ฅผ overriding ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง์ ‘ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.