Home > Spring > ๐Ÿƒ[Spring] JPA๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค๋Š” ์˜๋ฏธ.

๐Ÿƒ[Spring] JPA๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค๋Š” ์˜๋ฏธ.
Spring Framework

๐Ÿƒ[Spring] JPA๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค๋Š” ์˜๋ฏธ.

  • JPA(Java Persistence API)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š”, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ์™€ ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • JPA๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ์ฒด ๋ชจ๋ธ ๊ฐ„์˜ ๊ฐ„๊ทน์„ ์ค„์—ฌ ๋” ์ง๊ด€์ ์ด๊ณ  ์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ํ•˜๋ฉด์„œ๋„ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ์›์น™์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ์ฃผ์š” ๊ฐœ๋…๊ณผ ํŠน์ง•.

1๏ธโƒฃ ์—”ํ‹ฐํ‹ฐ์™€ ๊ด€๊ณ„ ์ค‘์‹ฌ ์„ค๊ณ„.

  • JPA๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์„ ์ž๋ฐ” ๊ฐ์ฒด(์—”ํ‹ฐํ‹ฐ)๋กœ ๋งคํ•‘ํ•˜๋ฉฐ, ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, @OneToMany, @ManyToOne, @OneToOne ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์™ธ๋ž˜ ํ‚ค, ์กฐ์ธ ๋“ฑ์„ ํ†ตํ•ด ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๊ฐ์ฒด์ง€ํ–ฅ์  CRUD ์ž‘์—….

  • JPA๋Š” EntityManager๋‚˜ CrudRepository์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ CRUD ์ž‘์—…(Create, Read, Update, Delete)์„ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ด๋Š” ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ถ”์ƒํ™”๋œ ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ณ„์ธต.

  • JPA๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ํŠน์ • DBMS์— ์ข…์†๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ์ด์‹์„ฑ์ด ๋†’์•„์ง€๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒฝ์šฐ์—๋„ ์ตœ์†Œํ•œ์˜ ์ˆ˜์ •์œผ๋กœ ๋Œ€์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(Persistence Context)

  • JPA๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ 1์ฐจ ์บ์‹œ๋ฅผ ํ™œ์šฉํ•œ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๊ฐ์ฒด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” ๋™์•ˆ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜๊ณ  ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด(JPQL)

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

6๏ธโƒฃ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)

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

2๏ธโƒฃ JPA์˜ ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋ฐœ ์žฅ์ .

1๏ธโƒฃ ๋†’์€ ๊ฐ€๋…์„ฑ.

  • ์ฝ”๋“œ๊ฐ€ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ ธ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘.

  • SQL ์ž‘์„ฑ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งคํ•‘ ์ฝ”๋“œ ์ž‘์„ฑ์— ์‹œ๊ฐ„์„ ๋œ ๋“ค์ด๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ์žฌ์‚ฌ์šฉ์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ฆ๊ฐ€.

  • ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

4๏ธโƒฃ ์˜ˆ์‹œ

  • JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ” ์ค‘์‹ฌ์ด ์•„๋‹Œ ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ

-- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ์ •์˜
CREATE TABLE employee (
    employee_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    department_id BIGINT,
    FOREIGN KEY (department_id) REFERENCES department(department_id)
)

JPA ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋ฐœ

@Enity
public class Employee {
    @Id
    @GeneratedValue(stratege = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
    
    // getters and setters
}
  • ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘์‹ฌ์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์–ด, ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋ถˆํ•„์š”ํ•œ ๋งคํ•‘ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ , ์ฝ”๋“œ๊ฐ€ ๋” ์ง๊ด€์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.