๐Ÿช• JPA ๊ด€๋ จ ์šฉ์–ด ์ •๋ฆฌ

JDBC - Java Database Connectivity

  • java์—์„œ DB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์ธํ„ฐํŽ˜์ด์Šค์ธ java api์ด๋‹ค.
  • java์™€ ์—ฐ๋™๋˜๋Š” DBMS์— ๋”ฐ๋ผ ๊ทธ์— ๋งž๋Š” JDBC(ex. MySQL Connector)๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ์— ๋งž๋Š” ๋“œ๋ผ์ด๋ฒ„๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด, java์—์„œ DB์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰ JDBC๋Š” ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ, ๊ฐ DB์— ๋งž๋Š” ๊ตฌํ˜„์ฒด๋Š” JDBC๋“œ๋ผ์ด๋ฒ„์ด๋‹ค. - MySQL Connector

ํŠน์ง•

  • SQL๋ช…๋ น์„ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ฐ์น˜์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ์˜ ๊ดด๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

ODBC - Open Database Connectivity

  • DB๋ฅผ ์—‘์„ธ์Šค ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ๊ฐœ๋ฐฉํ˜• ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋œปํ•œ๋‹ค.
  • ODBC๋Š” JDBC์™€ ๋‹ฌ๋ฆฌ ๋ชจ๋“  ์–ด๋– ํ•œ DBMS์ธ์ง€์™€ ์ƒ๊ด€์—†์ด ์ ์šฉ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด JPA(Java Persistence API)๋Š” ๋ฌด์—‡์ผ๊นŒ?

  • jpa๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ๋…์„ ๋งคํ•‘ํ•ด์ฃผ๋Š” ORM(Object Relational Mapping)์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • DB์™€ java๊ฐ์ฒด๊ฐ„์˜ ๋งคํ•‘์„ ์ž๋™ํ™”ํ•˜์—ฌ, SQL๋Œ€์‹  java๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ๋‹ค.
    • RDB๋Š” ํ•˜๋‚˜์˜ row๋ฅผ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ปฌ๋Ÿผ์˜ ๊ฐ’์€ ํ•„๋“œ์˜ ๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ํ•„๋“œ์— ๋ฆฌ์ŠคํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ƒํ™ฉ์ด ์• ๋งคํ•ด์ง„๋‹ค.
    • ๋˜ํ•œ java๊ฐ์ฒด์˜ ํ•„๋“œ์— ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•œ๋Š” ๊ฒฝ์šฐ java๋Š” ์ฐธ์กฐ๋ฅผ ํ•˜์ง€๋งŒ, DB๋Š” Join์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅด๋‹ค.
    • ์ด๋Ÿฌํ•œ ๋น„์Šทํ•œ ๋‘ ๊ฐœ๋…์„ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š”๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด JDBC์™€ JPA๋Š” ์„œ๋กœ ๋‹ค๋ฅธ๊ฒƒ์ธ๊ฐ€?

JPA๋Š” DB์™€ ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๊ธฐ์ˆ ์ผ ๋ฟ, ๋‚ด๋ถ€์ ์œผ๋กœ DB์™€ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋Š” JDBC๋ฅผ ํ•„์š”๋กœ ํ•˜๊ฒŒ๋œ๋‹ค.

๋˜ํ•œ JPA๋„ JDBC์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ฒด๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๊ทธ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜๊ฐ€ Hibernate์ด๋‹ค.


Spring Data JPA

  • Spring Data JPA๋ž€ JPA๋ฅผ Repository ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ„ํŽธํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์ด๋‹ค.
  • Repository์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜๋Š” ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด @Query ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋Œ€๋žต์ ์ธ ๊ด€๊ณ„๋„

Pasted image 20250110144021.png


JPQL(Java Persistence Query Language)๋Š” ๋˜ ๋ฌด์—‡์ธ๊ฐ€?

  • JPQL์€ JPA์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด๋กœ, SQL๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์„ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ๋œ๋‹ค.
  • ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ์ฒด์ง€ํ–ฅ์ ์ด๋‹ค.

ํŠน์ง•

  • SQL ์œ ์‚ฌ์„ฑ : select, where, group by ๋“ฑ SQL ๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ• ์‚ฌ์šฉ
  • ์—”ํ‹ฐํ‹ฐ ์ค‘์‹ฌ : DBํ…Œ์ด๋ธ” ๋Œ€์‹  ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์™€ ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋™์  ์ฟผ๋ฆฌ ์ง€์› : ๋Ÿฐํƒ€์ž„์— JPQL ๋ฌธ์ž์—ด ์ƒ์„ฑ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ๋ณ„์น (alias) ์‚ฌ์šฉ ํ•„์ˆ˜

๋ฌธ์ œ์ 

    1. ๋ฌธ์ž์—ด(String)ํ˜•ํƒœ ์ด๊ธฐ์— ๊ฐœ๋ฐœ์ž ์˜์กด์  ํ˜•ํƒœ์ด๋‹ค
    1. ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํƒ€์ž…์ฒดํฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค
    1. ๋Ÿฐํƒ€์ž„๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค

Query DSL(Domain Specific Language)???

  • ์œ„์—์„œ ๊ธฐ์ˆ ํ•œ JPQL์˜ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ๊ฒƒ์ด query dsl์ด๋‹ค.
  • ์ •์  ํƒ€์ž…์„ ์ด์šฉํ•ด, SQL, JPQL์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค API

ํŠน์ง•

  • ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜ ํ™•์ธ ๊ฐ€๋Šฅ, ํ›„์† ์กฐ์น˜ ๊ฐ€๋Šฅ
  • JPQL์˜ ๋‹จ์ ๋“ค์„ ๊ฑฐ์˜ ๋ณด์™„

๋‹จ์ 

    1. ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง„๋‹ค...
    1. FROM์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์— ์ œ์•ฝ์ด ์žˆ๋‹ค.
    1. ์„ธ์„ธํ•œ ํŠœ๋‹์ด๋‚˜, DBMS์˜ ๊ณ ์œ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

JPA n+1 ๋ฌธ์ œ?

1. ๊ฐœ๋…

N+1 ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ๋น„ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ ์‹คํ–‰์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ง€์นญํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” ์ฃผ๋กœ ORM(Object-Relational Mapping) ๊ธฐ์ˆ (JPA, Hibernate ๋“ฑ)์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, ํ•œ ๋ฒˆ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์ธ N๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

2. ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•˜๋‚˜?

N+1 ๋ฌธ์ œ๋Š” ์ฃผ๋กœ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ง€์—ฐ ๋กœ๋”ฉ์€ ๊ด€๋ จ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋”ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ƒํ™ฉ
  1. ๋‘ ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ ๊ฐ„ ๊ด€๊ณ„:

    • Parent(๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ)์™€ Child(์ž์‹ ์—”ํ‹ฐํ‹ฐ) ๊ด€๊ณ„.
    • Parent 1๊ฐœ์—๋Š” ์—ฌ๋Ÿฌ Child๊ฐ€ ์—ฐ๊ฒฐ.
  2. ๋ฌธ์ œ ๋ฐœ์ƒ ๊ณผ์ •:

    • ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ 1๋ฒˆ ์‹คํ–‰.
    • ๊ฐ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์— ์—ฐ๊ฒฐ๋œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ N๋ฒˆ ์‹คํ–‰.
List<Parent> parents = entityManager.createQuery("SELECT p FROM Parent p", Parent.class).getResultList();

// ๊ฐ Parent ์—”ํ‹ฐํ‹ฐ์˜ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋กœ๋“œ (์ง€์—ฐ ๋กœ๋”ฉ)
for (Parent parent : parents) {
    System.out.println(parent.getChildren().size()); // ์ž์‹ ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ ์ฟผ๋ฆฌ ๋ฐœ์ƒ
}

์ฟผ๋ฆฌ ์‹คํ–‰
  1. SELECT * FROM Parent; โ†’ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ 1๋ฒˆ ์‹คํ–‰.
  2. SELECT * FROM Child WHERE parent_id = ?; โ†’ ๊ฐ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋งˆ๋‹ค ์ž์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ N๋ฒˆ ์‹คํ–‰.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ 1 + N๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๊ทน์‹ฌํ•ด์ง‘๋‹ˆ๋‹ค.

3. N+1 ๋ฌธ์ œ์˜ ์˜ํ–ฅ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€.
  • ์ฟผ๋ฆฌ ์‹คํ–‰ ํšŸ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ ์‘๋‹ต ์‹œ๊ฐ„์ด ๋А๋ ค์ง.
  • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜.

4. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

(1) ํŽ˜์น˜ ์กฐ์ธ(Fetch Join)
  • ํŽ˜์น˜ ์กฐ์ธ์€ SQL์˜ JOIN์„ ์‚ฌ์šฉํ•ด ๊ด€๋ จ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•œ ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
String jpql = "SELECT p FROM Parent p JOIN FETCH p.children";
List<Parent> parents = entityManager.createQuery(jpql, Parent.class).getResultList();
  • JOIN FETCH๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ์™€ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์žฅ์ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ์ตœ์†Œํ™”.
  • ๋‹จ์ : ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€.
(2) ์—”ํ‹ฐํ‹ฐ ๊ทธ๋ž˜ํ”„(Entity Graph)
  • JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ๋กœ๋”ฉ ์‹œ ์–ด๋–ค ๊ด€๊ณ„๋ฅผ ํ•จ๊ป˜ ๋กœ๋“œํ• ์ง€ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค
@Entity
@NamedEntityGraph(
    name = "Parent.withChildren",
    attributeNodes = @NamedAttributeNode("children")
)
public class Parent { ... }

// ์‚ฌ์šฉ ์‹œ
EntityGraph<?> entityGraph = em.getEntityGraph("Parent.withChildren");
List<Parent> parents = em.createQuery("SELECT p FROM Parent p", Parent.class)
    .setHint("javax.persistence.fetchgraph", entityGraph)
    .getResultList();

  • ์žฅ์ : ๋ช…์‹œ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ด€๊ณ„๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ.
  • ๋‹จ์ : ์ถ”๊ฐ€์ ์ธ ์„ค์ • ํ•„์š”.
(4) DTO๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ
  • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ง์ ‘ SQL ๋˜๋Š” JPQL๋กœ ์กฐํšŒํ•˜์—ฌ ๋ฐ˜ํ™˜.
String jpql = "SELECT new com.example.dto.ParentChildDTO(p.name, c.name) " +
              "FROM Parent p JOIN p.children c";
List<ParentChildDTO> dtos = entityManager.createQuery(jpql, ParentChildDTO.class).getResultList();

  • ์žฅ์ : ๋ถˆํ•„์š”ํ•œ ์—”ํ‹ฐํ‹ฐ ๋กœ๋“œ ๋ฐฉ์ง€.
  • ๋‹จ์ : ๊ฐ์ฒด ๋งคํ•‘ ์ž‘์—… ์ถ”๊ฐ€.

ํŠธ๋ Œ์ ์…˜ / DB์Šค๋ƒ…์ƒท / ์•คํ‹ฐํ‹ฐ๋งค๋‹ˆ์ € / ์˜์†์„ฑ์ปจํ…์ŠคํŠธ / JPA

๊ฐ๊ฐ์˜ ์ •์˜

ํŠธ๋ Œ์ ์…˜

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„

ํŠธ๋ Œ์ ์…˜๋งค๋‹ˆ์ €

  • Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠธ๋ Œ์ ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ๊ณผ JPA๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰.

@Transactional

  • ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์— ์‚ฝ์ž…ํ•˜๋ฉด, AOP๋ ˆ๋ฒจ(ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ)์—์„œ ํŠธ๋ Œ์ ์…˜๋งค๋‹ˆ์ €๋ฅผ ์ด์šฉํ•œ ๋™์ž‘์„ ๊ณตํ†ต์œผ๋กœ ์ ์šฉ.

์•คํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • ์—”ํ‹ฐํ‹ฐ์˜ ์ €์žฅ/์ˆ˜์ •/์‚ญ์ œ/์กฐํšŒ ์ž‘์—…์„ ์ˆ˜ํ–‰
  • ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•œํŠธ๋ ˆ์ ์…˜ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ
  • ์•คํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €ํŽ™ํ† ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ์„ธ์ดํ”„ํ•˜๋ฏ€๋กœ ๊ณต์œ  ๊ฐ€๋Šฅ

์˜์†์„ฑ์ปจํ…์ŠคํŠธ

  • JPA์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” 1์ฐจ ์บ์‹œ ์—ญํ• ์„ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„
  • ์—”ํ‹ฐํ‹ฐ์™€ DB๋ฐ์ดํ„ฐ๊ฐ„์˜ ์ƒํƒœ ๋™๊ธฐํ™”๋ฅผ ์ฑ…์ž„
  • 1์ฐจ์บ์‹ฑ / ๋ณ€๊ฒฝ ๊ฐ์ง€ / ์ง€์—ฐ ๋กœ๋”ฉ ์˜ ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค
  • ์ง€์—ฐ๋กœ๋”ฉ : ๊ด€๊ณ„๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ๋กœ ํ•„์š”ํ• ๋•Œ๋งŒ ๊ฐ€์ ธ์˜ค๋ฉฐ, ๋ณ€๊ฒฝ์ ์„ ํ•œ๋ฒˆ๋งŒ commitํ•œ๋‹ค

์ง€์—ฐ๋กœ๋”ฉ

  • Lazy Loading(์ง€์—ฐ ๋กœ๋”ฉ)์€ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฆ‰์‹œ ๋กœ๋”ฉํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๊นŒ์ง€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Lazy Loading ๋™์ž‘ ๋ฐฉ์‹

  • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฆ‰์‹œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Œ.
  • ํ•„์š”ํ•  ๋•Œ(getter ํ˜ธ์ถœ ์‹œ) ์ถ”๊ฐ€์ ์ธ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด.(์ปค๋„ฅ์…˜ ์žฌํ• ๋‹น)
  • JPA๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Lazy Loading์„ ๊ตฌํ˜„ํ•จ.

์Šค๋ƒ…์ƒท

  • DB์Šค๋ƒ…์ƒท :
    • ํŠธ๋ Œ์ ์…˜์ด ์‹œ์ž‘๋ ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.
    • ๋…๋ฆฝ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์‚ฌ๋ณธ์œผ๋กœ, ์›๋ณธ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ๊ณผ ๋ฌด๊ด€ํ•˜๋‹ค.
    • ๊ณ ๊ธ‰ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(REPEATABLE READ, SERIALIZABLE)์—์„œ MVCC(Multi-Version Concurrency Control)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋ฌผ๋ฆฌ์ ์ธ ๋ณต์‚ฌ๋ณธ์ด ์•„๋‹Œ, ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋งค ์ฟผ๋ฆฌ๋งˆ๋‹ค ๋™์ ์œผ๋กœ ๊ฐ€๊ณต์ด ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์•คํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €_์Šค๋ƒ…์ƒท :
    • ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋กœ๋“œ๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.
    • ์—”ํ‹ฐํ‹ฐ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์—ฌ ๋ณ€๊ฒฝ ๊ฐ์ง€์— ์‚ฌ์šฉ๋œ๋‹ค.