ํฐ์คํ ๋ฆฌ ๋ทฐ
JPA(Java Persistence API)๋ฅผ ์ดํดํ๋ ๋ฐ ์์ด ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์ ์์์ฑ ์ปจํ ์คํธ(Persistence Context)์ ๋๋ค. ์์์ฑ ์ปจํ ์คํธ๋ ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ ์ต์ ํํ๋ ํต์ฌ์ ์ธ ์ญํ ์ ์ํํฉ๋๋ค.
์ด ๊ธ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํด JPA์ ๋ด๋ถ ๋์์ ์ดํดํ๊ธฐ ์ํด ์์ฑ๋์์ต๋๋ค.
1. ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ์ ์ํฐํฐ ๋งค๋์
JPA ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๊ณ ์ํฐํฐ๋ฅผ ์กฐ์ํ๊ธฐ ์ํด ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ์ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ฌ์ฉํฉ๋๋ค.

// ์ํฐํฐ ๋งค๋์ ์์ฑ (์์์ฑ ์ปจํ
์คํธ ์์ฑ)
EntityManager em = emf.createEntityManager();
// ํธ๋์ญ์
์์
EntityTransaction transaction = em.getTransaction();
transaction.begin();
// ...์ํฐํฐ ์กฐ์...
// ํธ๋์ญ์
์ปค๋ฐ
transaction.commit();
- EntityManagerFactory๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ๋จ ํ๋๋ง ์์ฑ๋๋ ๊ฐ์ฒด
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด, JPA ์ค์ ๋ฑ์ ๋ฐํ์ผ๋ก EntityManagerFactory์ ์ํด EntityManager๊ฐ ์์ฑ
- EntityManager๋ ์ค์ ์ํฐํฐ๋ฅผ ์ ์ฅ/์กฐํ/์์ /์ญ์ ํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์์์ฑ ์ปจํ
์คํธ์ ์ ๊ทผํ๋ ํต๋ก ์ญํ
(๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ)
2. ์์์ฑ ์ปจํ ์คํธ์ ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
์ํฐํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ๋ ํ๊ฒฝ์ด๋ผ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋ ์ผ๋ก, EntityManager๊ฐ ์์ฑ๋ ๋ ํจ๊ป ์์ฑ๋ฉ๋๋ค.
์์์ฑ ์ปจํ ์คํธ ๋ด์์ 4๊ฐ์ง ์ํ๋ฅผ ๊ฐ์ง๋ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.

2.1. ๋น์์ (New/Transient)
// ๊ฐ์ฒด๋ฅผ ์์ฑ
Member member = new Member();
- ์์์ฑ ์ปจํ ์คํธ์ ์ ํ ๊ด๊ณ๊ฐ ์๋ ์๋ก์ด ์ํ
- ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง๋ง ์์ง EntityManager์ ์ ์ฅ๋์ง ์์
2.2. ์์ (Managed)
// ๊ฐ์ฒด๋ฅผ ์์ํ
em.persist(member);
- ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋๋ ์ํ
- persist()๋ฅผ ํตํด ์์ ์ํ๋ก ์ ํ๋๊ฑฐ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํ๋์ด ์์์ฑ ์ปจํ ์คํธ์ ๋ก๋
- ์์ ์ํ์ ์ํฐํฐ๋ 1์ฐจ ์บ์์ ์ ์ฅ๋๋ฉฐ, Dirty Checking(๋ณ๊ฒฝ ๊ฐ์ง)์ ๋์
** Spring Data JPA์ save() ๋ฉ์๋๋ ์๋ก์ด ์ํฐํฐ๋ผ๋ฉด ๋ด๋ถ์ ์ผ๋ก em.persist()๋ฅผ ํธ์ถ
2.3. ์ค์์ (Detached)
// ์์์ฑ ์ปจํ
์คํธ์์ ๋ถ๋ฆฌ
em.detach(member);
- ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ
- detach()๋ฅผ ํธ์ถํ๊ฑฐ๋, ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋ฉด ๋ฐ์
2.4. ์ญ์ (Removed)
// ์ญ์ ์ํ๋ก ์ ํ
em.remove(member);
- ์์์ฑ ์ปจํ ์คํธ์์ ์ญ์ ๋ ์ํ
- remove()๋ฅผ ํธ์ถํ์ฌ ์ญ์ ์ํ๋ก ์ ํ
3. ์์์ฑ ์ปจํ ์คํธ์ ์ด์
3.1. 1์ฐจ ์บ์
์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์ ์กด์ฌํ๋ ์บ์ ๊ณต๊ฐ

// 1์ฐจ ์บ์์ ์ ์ฅ๋จ
em.persist(member);
// 1์ฐจ ์บ์์์ ์กฐํ
Member findMember = em.find(Member.class, "member1");
- persist()๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ ์กฐํํ๋ฉด DB๊ฐ ์๋ ์ปจํ ์คํธ์์ ์กฐํ
- ๋ง์ฝ, 1์ฐจ ์บ์์ ์๋ค๋ฉด DB์์ ์กฐํ ํ 1์ฐจ ์บ์์ ์ ์ฅ (์ด๋, ๋ฐ๋ก ์์ ์ํ๊ฐ ๋จ)
- ๋์ผํ ํธ๋์ญ์ ๋ด์์ ์ํฐํฐ์ ๋์ผ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ๋ฐ๋ณต์ ์ธ ์ฝ๊ธฐ ์์ ์ ์ฑ๋ฅ ํฅ์
3.2. Dirty Checking(๋ณ๊ฒฝ ๊ฐ์ง)

// ์์ ์ํฐํฐ ์กฐํ
Member memberA = em.find(Member.class, "memberA");
// ์์ ์ํฐํฐ ๋ฐ์ดํฐ ์์
memberA.setUsername("hi");
memberA.setAge(10);
// ์๋์ผ๋ก UPDATE ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
- 1์ฐจ ์บ์ ์์ ์์ ์ํ ์ํฐํฐ์ ์คํญ์ท์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ, JPA๊ฐ ์๋์ผ๋ก ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ๊ฐ์งํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์
- JPA๋ flush()๋ฅผ ํตํด transaction.commit() ํธ์ถ ์์ ์ ๋ณ๊ฒฝ ๊ฐ์ง, ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ๋ฑ๋ก, ์ ์ฅ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์กํ๊ฒ ๋๋๋ฐ, ์ด๋ฌํ ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ (Transcation Wirte-Behind)์ ํตํด ๋ชจ๋ ์ฟผ๋ฆฌ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ๋ฒ์ ์ ์กํ๋ ๋ฐฐ์น ์ฒ๋ฆฌ๋ก ์ฑ๋ฅ ํฅ์๊ณผ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์ ์ง
3.2.1. @Transactional(readOnly = true)์ Dirty Checking
@Transactional(readOnly = true)๋ ๋จ์ํ ์ฝ๊ธฐ ์ ์ฉ ์ค์ ์ด๋, Master/Slave ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๊ฒฝ์์ ์ฝ๊ธฐ ์ ์ฉ DB๋ก์ ์ฝ๊ธฐ ์์ ๋ถ์ฐ ์ฒ๋ฆฌ ์ธ์๋, JPA์ ์์์ฑ ์ปจํ ์คํธ ๋์์ ๊ด์ฌํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๋ ์ญํ ์ ํฉ๋๋ค.
@Transactional(readOnly = true)
public void updateMember(Member member) {
member.setName("Changed Name");
// ํธ๋์ญ์
์ปค๋ฐ ์์ ์๋ UPDATE ์ฟผ๋ฆฌ ๋ฐ์ X
}
- ํธ๋์ญ์ ์ readOnly๋ฅผ true๋ก ์ ์ฉํ๋ฉด, JPA๋ ํด๋น ํธ๋์ญ์ ์ด ์ฝ๊ธฐ ์ ์ฉ์์ ์ธ์งํ๊ณ Dirty Checking๋ฅผ ์ํํ์ง ์์
- ์ค๋ ์ท ์ ์ฅ ์๋ต๊ณผ ๋ณ๊ฒฝ ๊ฐ์ง ๋ก์ง ๊ฑด๋๋ฐ๊ธฐ๋ฅผ ํตํด ๋ถํ์ํ ์ค๋ ์ท ๋น๊ต ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์
[์ฐธ๊ณ ]
https://www.inflearn.com/course/ORM-JPA-Basic
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ ๊ฐ์ | ๊น์ํ - ์ธํ๋ฐ
๊น์ํ | JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ด JPA์ ๊ธฐ๋ณธ ์ด๋ก ์ ํํํ๊ฒ ํ์ตํด์ ์ด๋ณด์๋ ์ค๋ฌด์์ ์์ ์๊ฒ JPA๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค., ์ค๋ฌด์์๋
www.inflearn.com
- Total
- Today
- Yesterday
- fp
- ํ๋กํผํฐ
- Baekjoon
- ๋ฐฑ์ค
- ํฌํฌ์ธํฐ
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- ์๊ณ ๋ฆฌ์ฆ
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ๋์์ธ ํจํด
- ์๋ฐ์คํฌ๋ฆฝํธ
- ์๋ฐ
- ์ด๋ถํ์
- ์นด์นด์ค ์ธํด
- ์ฝ๋ฉํ ์คํธ
- ๋คํธ์ํฌ
- ์ด์์ฒด์
- git
- ํ๋กํ ์ฝ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ๋ฐฑ์ค javascript
- map
- ์ ์ญ ๋ณ์
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- ๋ ์์ปฌ ํ๊ฒฝ
- ๋ฐฑ์ค node.js
- ๋น๋๊ธฐ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- JavaScript
- TDD
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |