๐Ÿงถ Spring | Spring Boot/Spring Data JPA

JPA Persistence(์˜์†์„ฑ, ์ „๋ฐ˜์ ์ธ ๊ธฐ๋ณธ ๊ฐœ๋… ์„ค๋ช…)

  • -
๐Ÿ“ข JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํฌ๊ฒŒ ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•˜๋Š” ์„ค๊ณ„ ๋ถ€๋ถ„๊ณผ ๋งคํ•‘ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ฆฌ ๊ธ€์€ Hibernate๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋งคํ•‘ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ EntitiyManager๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋†“์•˜์Šต๋‹ˆ๋‹ค.

 

JPA ๊ตฌ์กฐ

  • ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค EntityManagerFactory๋ฅผ ํ†ตํ•ด EntityManager๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • EntityManager๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ DB ์ปค๋„ฅ์…˜์„ ํ†ตํ•ด DB๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

Entity Manager Factory

  • EntityManager๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ ๋น„์šฉ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์„ค์ • ์ •๋ณด๋ฅผ ์ฝ์–ด JPA๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ปค๋„ฅ์…˜ ํ’€ ์ƒ์„ฑ ๋“ฑ์œผ๋กœ ์ธํ•ด ์ƒ์„ฑ ๋น„์šฉ์ด ํฝ๋‹ˆ๋‹ค.
      • J2SE ํ™˜๊ฒฝ์—์„œ๋Š” ์ปค๋„ฅ์…˜ ํ’€์„ ์ƒ์„ฑํ•˜๊ณ , J2EE ํ™˜๊ฒฝ์—์„œ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•ด๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

 

Entity Manager

  • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅ, ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒํ•˜๋Š” ๋“ฑ ์—”ํ‹ฐํ‹ฐ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • EntityManagerFactory๋ฅผ ํ†ตํ•ด์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ ๋น„์šฉ์ด ๊ฑฐ์˜ ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ ๊ฐ„์— ์ ˆ๋Œ€ ๊ณต์œ ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ๊ผญ ํ•„์š”ํ•œ ์‹œ์ ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ์–ป์Šต๋‹ˆ๋‹ค.
    • ๋ณดํ†ต ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•ฉ๋‹ˆ๋‹ค.
// EntityManagerFactory ์ƒ์„ฑ
// ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ persistence.xml ํŒŒ์ผ์˜ persistence-unit name ์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
EntityManagerFactory emf = Persistence.createEntityMangerFactory("persistence-unit name");

// EntityManager ์ƒ์„ฑ
EntityManager em = emf.createEntityManager();

 

Persistence Context

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ผ๋Š” ์˜๋ฏธ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ๋…ผ๋ฆฌ์ ์ธ ํ™˜๊ฒฝ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  • EntityManager๋ฅผ ํ†ตํ•ด Persistence Context์— ์ ‘๊ทผํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • EntityManager๋กœ Entity๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ฉด EntityManager๋Š” Persistence Context์— Entity๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • EntityManager๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
    • ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ์•ˆ์— ๋…ผ๋ฆฌ์ ์ธ ์ €์žฅ์†Œ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ์—ฌ๋Ÿฌ EntityManager๊ฐ€ ๊ฐ™์€ Persistence Context์— ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

Persistence Context ํŠน์ง•

  • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹๋ณ„์ž ๊ฐ’์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜์† ์ƒํƒœ๋Š” ๋ฐ˜๋“œ์‹œ ์‹๋ณ„์ž ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•  ๋•Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ƒˆ๋กœ ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

 

Persistence Context ์ด์ 

1์ฐจ ์บ์‹œ

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๋‚ด๋ถ€์— ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ชจ๋‘ ์ด๊ณณ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • 1์ฐจ ์บ์‹œ์˜ ํ‚ค๋Š” ์‹๋ณ„์ž ๊ฐ’์ด๊ณ  ์‹๋ณ„์ž ๊ฐ’์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ณธ ํ‚ค์™€ ๋งคํ•‘๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
    • ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ ์‹œ, ๋จผ์ € 1์ฐจ ์บ์‹œ์—์„œ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  1์ฐจ ์บ์‹œ์— ์ €์žฅํ•œ ํ›„ ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ์ƒ ์ด์ ์€ ํฌ๊ฒŒ ์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
    • EntityManager๋ฅผ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋งŒ๋“ค๊ณ  ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜๋ฉด ์‚ญ์ œ๋˜๋Š”๋ฐ, 1์ฐจ ์บ์‹œ๋„ EntityManager์™€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ™์ด ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋”๋ผ๋„ ์š”์ฒญ๋“ค์€ ๊ฐ์ž์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ€์ง€๋ฉด์„œ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1์ฐจ ์บ์‹œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํŠธ๋žœ์žญ์…˜ ๋ณ„๋กœ ์ฐฐ๋‚˜์˜ ์ˆœ๊ฐ„์ด๋ผ ํฌ๊ฒŒ ์„ฑ๋Šฅ์ƒ ์ด์ ์€ ์—†๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// ๋จผ์ € 1์ฐจ ์บ์‹œ์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
// ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  1์ฐจ์บ์‹œ์— ์ €์žฅํ•œ ํ›„ ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
Member member = em.find(Member.class,"member1");

 

 

๋™์ผ์„ฑ ๋ณด์žฅ

  • ๋™์ผํ•œ ์‹๋ณ„์ž๋กœ ์กฐํšŒํ•˜๋ฉด 1์ฐจ ์บ์‹œ์— ์žˆ๋Š” ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ๋™์ผ์„ฑ : ์ฐธ์กฐ ๊ฐ’ ๋น„๊ต, ์‹ค์ œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋™์ผ
    • ๋™๋“ฑ์„ฑ : ๊ฐ’ ๋น„๊ต, ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋Š” ๋‹ค๋ฅผ ์ˆ˜๋„
Member a = em.find(Member.class,"member1");
Member b = em.find(Memeber.class,"member1");

System.out.println(a == b) // true

 

 

ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ

  • ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ง์ „๊นŒ์ง€ ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— SQL์„ ๋ชจ์•„๋‘์—ˆ๋‹ค๊ฐ€ ์ปค๋ฐ‹ํ•  ๋•Œ ๋ชจ์•„๋‘” ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์šฐ์„  ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ flush ํ•ฉ๋‹ˆ๋‹ค.
      • flush ๋ž€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋™๊ธฐํ™”ํ•˜๋Š” ์ž‘์—…์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ ํ›„, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
// ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
EntityTransaction transaction = em.getTransaction();

// ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
transaction.begin();

// 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋งŒ ํ•ด๋‘๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ณด๋‚ผ SQL์€ ๋”ฐ๋กœ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
em.persist(memberA);
em.persist(memberB);

// ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ SQL์ด ์ „์†ก๋˜๋ฉฐ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
transaction.commint();

๐ŸŽˆ  hibernate ์„ค์ •์—  insert/update ์ฟผ๋ฆฌ๋ฅผ ์›ํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒํผ ๋ชจ์•„์„œ DB์— ๋‚ ๋ฆด ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
// ์Šคํ”„๋ง ๋ถ€ํŠธ application.properties
spring.jpa.properties.hibernate.jdbc.batch_size = 100

 

 

๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking)

  • ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • ์‹œ,์ž๋ฐ” ์ปฌ๋ ‰์…˜ ๋‹ค๋ฃจ๋“ฏ ๋‹จ์ˆœํžˆ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์„œ ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
    • JPA๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€ํ•  ๋•Œ, ์ตœ์ดˆ ์ƒํƒœ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ €์žฅํ•ด๋‘๋Š”๋ฐ ์ด๋ฅผ ์Šค๋ƒ…์ƒท์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.
    • flush ์‹œ์ ์— ์Šค๋ƒ…์ƒท๊ณผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐพ๊ณ  ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์ˆ˜์ • ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์„œ ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜์ • ์‹œ, ์—”ํ‹ฐํ‹ฐ์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•˜๋‚˜์˜ ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
      • ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœํ•œ ์ฟผ๋ฆฌ๋ฌธ์ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.
    • ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ˆ˜์ • ์ฟผ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ๊ฐ™๊ธฐ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์— ์ˆ˜์ • ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์œผ๋ฉด ์ด์ „์— ํ•œ๋ฒˆ ํŒŒ์‹ฑ๋œ ์ฟผ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•„๋“œ๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ์ €์žฅ๋˜๋Š” ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ํฌ๋ฉด ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•ด์„œ ๋™์ ์œผ๋กœ UPDATE SQL์„ ์ƒ์„ฑํ•˜๋Š” ์ „๋žต์„ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
      • @DynamicUpdate : ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ, ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ sql์„ ๋™์  ์ƒ์„ฑ
        • ์ปฌ๋Ÿผ์ด 30๊ฐœ ์ด์ƒ์ผ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ •์  ์ˆ˜์ • ์ฟผ๋ฆฌ๋ณด๋‹ค ๋” ๋น ๋ฆ„
      • @DynamicInsert : ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ, null์ด ์•„๋‹Œ ํ•„๋“œ๋งŒ์œผ๋กœ sql์„ ๋™์  ์ƒ์„ฑ
Member member = em.find(Member.class,"member1");

// ๋ณ€๊ฒฝ ๊ฐ์ง€๋กœ ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ •
member.setName("dokuny");

@Entity
 // ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•ด์„œ ๋™์ ์œผ๋กœ SQL์„ ์ƒ์„ฑํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
@org.hibernate.annotation.**DynamicUpdate**
public class Member{}

 

 

์ง€์—ฐ ๋กœ๋”ฉ (lazy - loading)

  • ์ž๋ฐ” ๊ฐ์ฒด ๋‚ด์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ์ง€์—ฐ ๋กœ๋”ฉ์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹ค์ œ ๊ฐ์ฒด ๋Œ€์‹  ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋กœ๋”ฉํ•ด๋‘๊ณ  ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ์ฟผ๋ฆฌ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ์ฆ‰์‹œ๋กœ๋”ฉ์€ join์„ ํ†ตํ•ด์„œ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ๋‹ค๊ฐ™์ด ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • ์‹ค๋ฌด์—์„œ๋Š” ์ผ๋‹จ ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•ด๋‘” ๋’ค ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ์ฆ‰์‹œ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
      • ์ •ํ™•ํžˆ๋Š” fetch join์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋Š” ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

Flush

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • flush()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ๋™์ž‘ํ•œ ํ›„, ๋ชจ์•„๋‘” ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.(๋“ฑ๋ก, ์ˆ˜์ • , ์‚ญ์ œ ์ฟผ๋ฆฌ)
  • flushํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.
    • ์ง์ ‘ ํ˜ธ์ถœ
    • ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹์‹œ ์ž๋™ ํ˜ธ์ถœ
    • JPQL ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ ์ž๋™ ํ˜ธ์ถœ
  • FlushModeType์œผ๋กœ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// FlushModeType.AUTO : ์ปค๋ฐ‹,์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ ํ”Œ๋Ÿฌ์‹œ (๊ธฐ๋ณธ๊ฐ’)
// FlushModeType.COMMIT : ์ปค๋ฐ‹ ์‹œ์—๋งŒ ํ”Œ๋Ÿฌ์‹œ
em.setFlushMode(FlushModeType.COMMIT);
  • flush๋ฅผ ํ•˜๋”๋ผ๋„ 1์ฐจ ์บ์‹œ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

 

Entity LifeCycle

Entity๋Š” 4๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

 

๋น„์˜์† (new / transient)

  • Persistence Context์™€ ์ „ํ˜€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ƒํƒœ
// ๊ฐ์ฒด๋ฅผ ๋ง‰ ์ƒ์„ฑํ•œ ์ƒํƒœ
Member member = new Member();

 

์˜์† (managed)

  • Persistence Context์— ์ €์žฅ๋œ ์ƒํƒœ
  • persist()๋ฅผ ํ†ตํ•ด์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ Persistence Context๊ฐ€ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
// Persistence Context๊ฐ€ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌ
em.persist(member);

 

 

์ค€์˜์† (detached)

  • Persistence Context์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ
  • Persistence Context๊ฐ€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์–ด๋– ํ•œ ๊ธฐ๋Šฅ๋„ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ด๋ฏธ ํ•œ๋ฒˆ ์˜์†์ƒํƒœ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์‹๋ณ„์ž ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง€์—ฐ๋กœ๋”ฉ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • detach() , clear() , close() ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ค€์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • merge() ๋ฅผ ํ†ตํ•ด ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‹ค์‹œ ์˜์† ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ
em.detach(member);

// ์ค€์˜์† ์ƒํƒœ -> ์˜์† ์ƒํƒœ
em.merge(member);

// ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜
em.clear();

// ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‹ซ์œผ๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์ค€์˜์† ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
em.close();

 

 

์‚ญ์ œ (removed)

  • ์‚ญ์ œ๋œ ์ƒํƒœ
// ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ญ์ œ
em.remove(member);

 

๐Ÿ”” ์ง€๊ธˆ ๊ณต๋ถ€ํ•œ ๊ฐœ๋…๋“ค์„ ์ž˜ ๊ธฐ์–ตํ•ด๋‘์–ด์•ผ ํ›„์— ์ง์ ‘ ์‚ฌ์šฉํ•  ๋•Œ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜์† ์ƒํƒœ์ผ ๋•Œ 1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— DB์— ์กฐํšŒ์ฟผ๋ฆฌ๊ฐ€ ์•ˆ๋‚˜๊ฐ„๋‹ค๋˜๊ฐ€, ์ง€์—ฐ๋กœ๋”ฉ ๋ฐ ๋ณ€๊ฒฝ๊ฐ์ง€ ๋ถ€๋ถ„์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค๋ณด๋‹ˆ ์ž˜ ์•Œ์•„๋‘๊ณ  ๋„˜์–ด๊ฐ€์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ๋Š” EntityManager๋ฅผ ๋ถˆ๋Ÿฌ๋‹ค๊ฐ€ ์“ธ ์ผ์ด ๊ฐ€๋” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•  ๋•Œ ๋นผ๊ณ ๋Š” ์—†๊ณ  ๋Œ€๋ถ€๋ถ„ Spring Data JPA๋ฅผ ์ด์šฉํ•ด  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ธฐ๋ณธ์ ์ธ ์ž‘๋™ ๋ฐฉ์‹์€ ์œ„์˜ ๋‚ด์šฉ๋“ค์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋‹ˆ ๊ผญ ์ž˜ ๊ธฐ์–ตํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค.

 

์ฐธ๊ณ ์ž๋ฃŒ
  • ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ

'๐Ÿงถ Spring | Spring Boot > Spring Data JPA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JPA๋ž€?  (0) 2022.10.24
Spring JDBC Template ์‚ฌ์šฉ๋ฒ•  (0) 2022.10.21
Java๋กœ JDBC ์‚ฌ์šฉํ•˜๊ธฐ  (0) 2022.10.21
JDBC / SQL Mapper / ORM  (0) 2022.10.21
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.