๐Ÿ“Œ JPA ์™„์ „์ •๋ณต โ€” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํ•ต์‹ฌ ์ •๋ฆฌ

๐Ÿงฉ 1. JPA๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

JPA(Java Persistence API)๋Š”
๐Ÿ‘‰ ์ž๋ฐ”์—์„œ ๊ฐ์ฒด๋ฅผ DB์— ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๋„๋ก ๋งŒ๋“  ORM(Object Relational Mapping) ํ‘œ์ค€์ด๋‹ค.

๐Ÿ’ฌ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด
์ž๋ฐ” ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ธฐ์ˆ .


๐Ÿ› 2. JPA = ORM ํ‘œ์ค€, Hibernate = ๊ตฌํ˜„์ฒด

  • JPA = ๊ทœ์น™(์ธํ„ฐํŽ˜์ด์Šค)
  • Hibernate = ๊ทœ์น™์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ์‹คํ–‰ ์—”์ง„(๊ตฌํ˜„์ฒด)

๐Ÿ“Œ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋Œ€๋ถ€๋ถ„ Hibernate.


๐Ÿชข 3. JPA๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

1) SQL ์ค‘์‹ฌ ๊ฐœ๋ฐœ์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

JPA ์—†์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค:

  • CRUDํ•  ๋•Œ๋งˆ๋‹ค ๊ณ„์† SQL ์ž‘์„ฑ
  • ์ฟผ๋ฆฌ ์ˆ˜์ • ์‹œ ์ฝ”๋“œ ์—ฌ๋Ÿฌ ๊ณณ ์ˆ˜์ •
  • ๊ฐ์ฒด์™€ DB์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ž์ฃผ ๋ถˆ์ผ์น˜
  • ์œ ์ง€๋ณด์ˆ˜ ํž˜๋“ฆ

JPA ์žˆ์œผ๋ฉด?

  • SQL ์ž‘์„ฑ ๋Œ€์‹  ๊ฐ์ฒด ์ค‘์‹ฌ ๊ฐœ๋ฐœ
  • CRUD ์ž๋™ํ™”
  • ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking)
  • DB ๋ฐฉ์–ธ ์ฒ˜๋ฆฌ(Oracle, MySQL, Postgres ๋“ฑ ์ž๋™ ์ง€์›)

๐Ÿงฑ 4. JPA ํ•ต์‹ฌ ๊ฐœ๋…

โœ” (1) ์—”ํ‹ฐํ‹ฐ(Entity)

  • DB ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ์ž๋ฐ” ํด๋ž˜์Šค
  • @Entity ๋ถ™์ด๋ฉด JPA๊ฐ€ ๊ด€๋ฆฌ
@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;

    private String name;
}

โœ” (2) ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €(EntityManager)

Hibernate๊ฐ€ DB์™€ ์†Œํ†ตํ•˜๋Š” ํ•ต์‹ฌ ๊ฐ์ฒด
(์Šคํ”„๋ง์—์„œ๋Š” EntityManager๋ฅผ ์ง์ ‘ ์“ฐ์ง€ ์•Š๊ณ  Repository๊ฐ€ ๋Œ€์‹  ์‚ฌ์šฉ)


โœ” (3) ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(Persistence Context) โ€” JPA ํ•ต์‹ฌ

์—”ํ‹ฐํ‹ฐ๋ฅผ 1์ฐจ ์บ์‹œ์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„.

์ด๊ฒŒ ์™œ ์ค‘์š”?

  • ๋™์ผํŠธ๋žœ์žญ์…˜๋‚ด ๋™์ผ ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ ์‹œ DB ์•ˆ ๊ฐ€๊ณ  ์บ์‹œ์—์„œ ๊บผ๋‚ด์˜ด
  • ๋ณ€๊ฒฝ๊ฐ์ง€(Dirty checking)
  • ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๊ฐ€๋Šฅ
  • ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌ

๐Ÿ“Œ JPA๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋•๋ถ„์— '๊ฐ์ฒด ์ค‘์‹ฌ ๊ฐœ๋ฐœ'์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


โœ” (4) ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking)

ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์—”ํ‹ฐํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณ„๋„ update ์ฝ”๋“œ ์—†์–ด๋„ DB์— ์ž๋™ ๋ฐ˜์˜.

member.setName("ํ™๊ธธ๋™"); 
// commit ์‹œ ์ž๋™ UPDATE

โœ” (5) ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)

์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•„์š”ํ•  ๋•Œ(DB์—์„œ) ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ.

  • @OneToMany, @ManyToOne ๊ธฐ๋ณธ์ด Lazy
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์•„์ฃผ ์ค‘์š”
Team team = member.getTeam(); // ์•„์ง DB์—์„œ ์กฐํšŒ ์•ˆ ํ•จ
team.getName();               // ์ด๋•Œ SQL ์‹คํ–‰๋จ

โœ” (6) ์ฆ‰์‹œ ๋กœ๋”ฉ(Eager Loading)

์—”ํ‹ฐํ‹ฐ ์กฐํšŒ ์‹œ ์ฆ‰์‹œ ๊ด€๋ จ ์—”ํ‹ฐํ‹ฐ๊นŒ์ง€ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ด โ†’ N+1 ๋ฌธ์ œ ์œ ๋ฐœ

๐Ÿ“Œ ๋ฉด์ ‘ ๋‹จ๊ณจ ์งˆ๋ฌธ:

์™œ ์ฆ‰์‹œ ๋กœ๋”ฉ(EAGER)์ด ๋ฌธ์ œ์ธ๊ฐ€?
๋‹ต: "์›ํ•˜์ง€ ์•Š๋Š” ์‹œ์ ์— SQL์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ, N+1 ๋ฌธ์ œ ์œ ๋ฐœ"


โœ” (7) ์˜์†์„ฑ ์ƒ๋ช…์ฃผ๊ธฐ

์—”ํ‹ฐํ‹ฐ๋Š” 4๋‹จ๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค:

  1. ๋น„์˜์†(new) : JPA ๊ด€๋ฆฌ X
  2. ์˜์†(managed) : em.persist() ๋˜๋Š” ์ €์žฅ
  3. ์ค€์˜์†(detached) : em.detach(), clear()
  4. ์‚ญ์ œ(removed) : em.remove()

๐Ÿ›  5. CRUD๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ?

โœ” ์ €์žฅ

Member m = new Member("ํ™๊ธธ๋™");
em.persist(m); // INSERT SQL์€ ํŠธ๋žœ์žญ์…˜ commit ์‹œ ๋‚˜๊ฐ

โœ” ์กฐํšŒ

Member m = em.find(Member.class, id);

โœ” ์ˆ˜์ •

m.setName("ํ™๊ธธ๋™2"); // dirty checking ์‚ฌ์šฉ โ†’ ์ž๋™ UPDATE

โœ” ์‚ญ์ œ

em.remove(m);

๐Ÿงฉ 6. Spring Data JPA๋Š” ๋ฌด์—‡์ธ๊ฐ€?

JPA ์œ„์— ๋งŒ๋“  ๋˜ ํ•˜๋‚˜์˜ ์ถ”์ƒํ™” ๊ณ„์ธต.

์žฅ์ :

  • CRUD ์ž๋™๊ตฌํ˜„
  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ
  • ํŽ˜์ด์ง• ์ž๋™
  • JPQL ๋Œ€์‹  QueryDSL ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์˜ˆ:

public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findByName(String name);
}

๐Ÿ”ฅ 7. JPA์˜ ๋‹จ์  (์†”์งํ•˜๊ฒŒ)

  • ์™„์ „ํžˆ ์ดํ•ดํ•˜๋ ค๋ฉด ๊ฐœ๋…์ด ์–ด๋ ค์›€ (ํŠนํžˆ ์—ฐ๊ด€๊ด€๊ณ„ยท์ง€์—ฐ๋กœ๋”ฉ)
  • JPA ๋ฐฉ์‹๊ณผ DB ๋ฐฉ์‹์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•™์Šต ๋น„์šฉ ํผ
  • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋Š” ๊ฒฐ๊ตญ JPQL/NativeSQL ํ•„์š”

๐Ÿ’ฌ ํ•˜์ง€๋งŒ ์ž˜ ์“ฐ๋ฉด ์ƒ์‚ฐ์„ฑ & ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ์••๋„์ ์œผ๋กœ ์ข‹์•„์ง„๋‹ค.


๐Ÿ“š 8. JPA ์—ฐ๊ด€๊ด€๊ณ„ ํ•ต์‹ฌ

  • ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์„ ๊ธฐ๋ณธ์œผ๋กœ ์„ค๊ณ„
  • ์–‘๋ฐฉํ–ฅ์€ mappedBy ํ•„์š”
  • ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์€ FK๋ฅผ ๊ฐ€์ง„ ์—”ํ‹ฐํ‹ฐ
  • ์ฆ‰์‹œ ๋กœ๋”ฉ ๊ธˆ์ง€(EAGER โ†’ LAZY๋กœ ๋ณ€๊ฒฝ)

profile
์ฝ”๋”ฉ๊ฐœ๋ชปํ•จ

0๊ฐœ์˜ ๋Œ“๊ธ€