๋ ์ง:2025-10-23
ํ์ต ๋ชฉํ
- ์์์ฑ ์ปจํ
์คํธ์ ๊ฐ๋
์ดํด
- ์ํฐํฐ์ ์๋ช
์ฃผ๊ธฐ ํ์
- @Transactional์ ์ญํ ๊ณผ ๊ธฐ๋ณธ ๊ฐ๋
- JpaRepository์ CRUD ๋ฉ์๋ ์ดํด
- ๋ํฐ์ฒดํน(Dirty Checking) ๊ฐ๋
-์ปค์คํ
์ฟผ๋ฆฌ ๋ฉ์๋ ์ดํด
โ
์์์ฑ ์ปจํ
์คํธ (Persistence Context)
์ ์
-
์์์ฑ ์ปจํ
์คํธ๋ ์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ์ผ๋ก,
-
์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์์ ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ์์ ์ ์ฅ์์
๋๋ค.
-
์ฝ๊ฒ ๋งํด,
โJPA๊ฐ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์์ ์ ์ฅ์โ
๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์์์ฑ ์ปจํ
์คํธ์ ์ฃผ์ ์ญํ
| ์ญํ | ์ค๋ช
|
|---|
| ์ํฐํฐ ๋ณด๊ด | ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์จ ์ํฐํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ |
| ๋ณ๊ฒฝ ๊ฐ์ง (๋ํฐ์ฒดํน) | ์ํฐํฐ์ ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ๊ฐ์งํ์ฌ ์๋์ผ๋ก UPDATE ์ฟผ๋ฆฌ ์คํ |
| ๋๊ธฐํ (Flush) | ํธ๋์ญ์
์ด ๋๋ ๋ DB์ ์ํ๋ฅผ ์ผ์น์ํด |
- ์ฆ, JPA๋ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๊ณ ,
๊ฐ๋ฐ์๊ฐ ๋ฐ๋ก UPDATE ๋ฌธ์ ์ฐ์ง ์์๋ ์๋์ผ๋ก ๋ฐ์ํฉ๋๋ค.
โ
์ํฐํฐ์ ์๋ช
์ฃผ๊ธฐ

์ ์
- ์ํฐํฐ๋ ์์ฑ๋ถํฐ ์ญ์ ๊น์ง ์ฌ๋ฌ ๋จ๊ณ์ ์ํ ๋ณํ๋ฅผ ๊ฒช์ต๋๋ค.
- ์
๋ฌธ ๋จ๊ณ์์๋ ๋น์์ โ ์์ ๋ ๊ฐ์ง ์ํ๋ง ์ดํดํ๋ฉด ์ถฉ๋ถํฉ๋๋ค.
๋น์์ (Transient)
- ์์์ฑ ์ปจํ
์คํธ์ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋ ์ํ
- DB์ ์ ์ฅ๋์ง ์์ ๊ฐ์ฒด
์:
- new ํค์๋๋ก ์ํฐํฐ๋ฅผ ๋ง๋ค์์ง๋ง ์์ง save()ํ์ง ์์ ์ํ
์์ (Persistent)
- ์์์ฑ ์ปจํ
์คํธ์ ์ํด ๊ด๋ฆฌ๋๋ ์ํ
- JPA๊ฐ ํด๋น ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ , DB์ ๋๊ธฐํํจ
์์
- save()๋ฅผ ํตํด DB์ ๋ฐ์๋์๊ฑฐ๋, findById()๋ก ์กฐํ๋ ์ํ
โ
@Transactional ๊ธฐ๋ณธ ๊ฐ๋
ํธ๋์ญ์
์ด๋?
- ์ฌ๋ฌ ๋ฐ์ดํฐ ์์
์ ํ๋๋ก ๋ฌถ์ด ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋ ๋ชจ๋ ์คํจํ๊ฒ ๋ง๋๋ ๋จ์์
๋๋ค.
- ์ด ์ฑ์ง์ ์์์ฑ(Atomicity) ์ด๋ผ๊ณ ํฉ๋๋ค.
์์์ฑ ์ปจํ
์คํธ์ ํธ๋์ญ์
์ ๊ด๊ณ
-
์์์ฑ ์ปจํ
์คํธ๋ ํธ๋์ญ์
๊ฒฝ๊ณ ์์์๋ง ๋์ํฉ๋๋ค.
-
์ฆ, ํธ๋์ญ์
์ด ์์ด์ผ JPA๊ฐ ์ํฐํฐ๋ฅผ ์ถ์ ํ๊ณ ๋ณ๊ฒฝ์ ๋ฐ์ํ ์ ์์ต๋๋ค.
-
โํธ๋์ญ์
๋ด์์ DB๋ฅผ ํ ๋ฒ์ด๋ผ๋ ๊ฐ๋ค ์จ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋คโ
= ์์์ฑ ์ปจํ
์คํธ์ ํต์ฌ ์ ์
@Transactional ์ด๋
ธํ
์ด์
**
Spring์์๋ @Transactional์ ์ฌ์ฉํด
๋น์ฆ๋์ค ๋ก์ง์ ํ๋์ ํธ๋์ญ์
๋จ์๋ก ๋ฌถ์ต๋๋ค.
์ฃผ์ ์์ฑ ์์ฝ
| ์์ฑ | ์ค๋ช
|
|---|
| readOnly | ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์
(CUD ๋ถ๊ฐ, ์ฑ๋ฅ ์ต์ ํ) |
| propagation | ํธ๋์ญ์
์ ํ ๊ท์น ์ค์ |
| isolation | ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค ์ค์ |
| rollbackFor | ํน์ ์์ธ ๋ฐ์ ์ ๊ฐ์ ๋กค๋ฐฑ ์ง์ |
- ์
๋ฌธ ๋จ๊ณ์์๋ readOnly = true๋ง ์์๋๋ฉด ์ถฉ๋ถํฉ๋๋ค.
- ์กฐํ ์ ์ฉ ํธ๋์ญ์
์์ ๋ถํ์ํ ์ฐ๊ธฐ ์์
์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
โ
JpaRepository์ ์ฟผ๋ฆฌ ๋ฉ์๋
- Spring Data JPA์ ํต์ฌ ์ธํฐํ์ด์ค์ธ JpaRepository๋ SQL์ ์ง์ ์์ฑํ์ง ์์๋ CRUD ์์
์ ์ํํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ธฐ๋ณธ CRUD ๋ฉ์๋
| ๋์ | ๋ฉ์๋ | ์ค๋ช
|
|---|
| Create | save(entity) | ์ํฐํฐ ์ ์ฅ |
| Read | findById(id), findAll() | ๋ฐ์ดํฐ ์กฐํ |
| Update | (ํธ๋์ญ์
๋ด์์ ์ํฐํฐ ๋ณ๊ฒฝ) | ์๋์ผ๋ก UPDATE (๋ํฐ์ฒดํน) |
| Delete | delete(entity), deleteById(id) | ๋ฐ์ดํฐ ์ญ์ |
- ์ด๋ฌํ ๊ธฐ๋ณธ ์ ๊ณต ๋ฉ์๋๋ฅผ ์ฟผ๋ฆฌ ๋ฉ์๋(Query Method) ๋ผ๊ณ ํฉ๋๋ค.
โ
๋ํฐ์ฒดํน (Dirty Checking)
์ ์
- ๋ํฐ์ฒดํน์ด๋, ์์์ฑ ์ปจํ
์คํธ๊ฐ ๊ด๋ฆฌ ์ค์ธ ์ํฐํฐ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ๊ณ ํธ๋์ญ์
์ด ๋๋ ๋ ์๋์ผ๋ก UPDATE ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๊ธฐ๋ฅ์
๋๋ค.
๋์ ์๋ฆฌ
1.ํธ๋์ญ์
์ด ์์๋๋ฉด JPA๊ฐ ์ํฐํฐ์ ์ด๊ธฐ ์ํ๋ฅผ ์ค๋
์ท์ผ๋ก ์ ์ฅ
2.์ํฐํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ค๋
์ท๊ณผ ๋น๊ต
3.๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด ํธ๋์ญ์
์ข
๋ฃ ์์ ์ ์๋์ผ๋ก UPDATE ์คํ
- ์ฆ, save()๋ update()๋ฅผ ๋ค์ ํธ์ถํ์ง ์์๋
ํธ๋์ญ์
๋ด์์ ํ๋๊ฐ์ด ๋ฐ๋๋ฉด ์๋์ผ๋ก DB์ ๋ฐ์๋ฉ๋๋ค.
โ
์ปค์คํ
์ฟผ๋ฆฌ ๋ฉ์๋
- ๊ธฐ๋ณธ CRUD ์ธ์๋, ๋ฉ์๋ ์ด๋ฆ๋ง์ผ๋ก ์กฐ๊ฑด ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค.
์์
| ๊ธฐ๋ฅ | ๋ฉ์๋ ์์ |
|---|
| ์ด๋ฆ์ผ๋ก ์ฐพ๊ธฐ | findByName(String name) |
| ์ด๋ฉ์ผ๊ณผ ๋์ด๋ก ์ฐพ๊ธฐ | findByEmailAndAge(String email, int age) |
| ํน์ ์กฐ๊ฑด ์กด์ฌ ์ฌ๋ถ ํ์ธ | existsByEmail(String email) |
| ๋ฐ์ดํฐ ๊ฐ์ ์ธ๊ธฐ | countByAgeGreaterThan(int age) |
- ๋ฉ์๋ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก Spring Data JPA๊ฐ ์๋์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ํ์ํ๋ค๋ฉด @Query ์ด๋
ธํ
์ด์
์ผ๋ก ์ง์ ์์ฑํ ์๋ ์์ต๋๋ค.
์ ๋ฆฌ
| ๊ฐ๋
| ํต์ฌ ํฌ์ธํธ |
|---|
| ์์์ฑ ์ปจํ
์คํธ | JPA๊ฐ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์์ ์ ์ฅ์ |
| ์ํฐํฐ ์๋ช
์ฃผ๊ธฐ | ๋น์์(๊ด๋ฆฌ X) โ ์์(๊ด๋ฆฌ O) |
| ํธ๋์ญ์
| ์ฌ๋ฌ ์์
์ ํ๋๋ก ๋ฌถ์ด ๋ชจ๋ ์ฑ๊ณต/์คํจ์ํค๋ ๋จ์ |
| @Transactional | ๋ฉ์๋ ๋จ์ ํธ๋์ญ์
๊ด๋ฆฌ (readOnly ์ต์
์ผ๋ก ์ต์ ํ ๊ฐ๋ฅ) |
| JpaRepository | SQL ์์ด CRUD ์ํ ๊ฐ๋ฅ |
| ๋ํฐ์ฒดํน | ์ํฐํฐ ๋ณ๊ฒฝ ์ ์๋ UPDATE |
| ์ปค์คํ
์ฟผ๋ฆฌ ๋ฉ์๋ | ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์กฐ๊ฑด ๊ฒ์ ์๋ ์ฟผ๋ฆฌ ์์ฑ |