์ ํฌ์คํ ์์ Cascade์ ๋ํด ์ค๋ช ํ๋ค.
์ฌ์ค Cascade๋ฅผ ๋ ์ ์ดํดํ๊ธฐ ์ํด์
์ํฐํฐ๋งค๋์ ๊ฐ ๋ฌด์์ธ์ง ์๊ณ ์์ผ๋ฉด ์ข๋ค.
๊ทธ๋์ ์ด๋ฒ์ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ๋ค.
1. ์ํฐํฐ ๋งค๋์ (Entity Manager)
- ์๋ฐ ์ฝ๋ฉ์ ํ ๋ ๋ค๋ฃจ๋ ๊ฑด ๊ฐ์ฒด(Object) ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณณ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB) ํ ์ด๋ธ์ด๋ค.
- ๋์ ์ ํ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ํ๊ฐ ์ ์ํตํ๋ค.
- ๊ทธ๋์ ์ค๊ฐ์์ ์๋ฐ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๊ณ , ์์์ DB์ ๋ง๋ SQL๋ก ๋ฐ๊ฟ์ ์ ์ฅํ๊ณ ๊ฐ์ ธ์ค๋ ์ผ์ ํด์ค ์ ๊ฐ ํ์ํ๋ค.
- ๊ทธ ์ผ์ ํด๋ด๋ ์ ๊ฐ ๋ฐ๋ก ์ํฐํฐ ๋งค๋์ ์ด๋ค.
- ์ํฐํฐ ๋งค๋์ ๋ ๋ด๋ถ์ ์์์ฑ ์ปจํ
์คํธ๋ผ๋ ์ผ์ข
์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋๊ณ ๋ฌผ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ค. → ์ฝ๊ฒ ์ค๋ช
ํ๋ฉด, ๋งค๋์ ๋ ๋น๋ฐ ๋ฌผ๋ฅ์ฐฝ๊ณ (์์์ฑ ์ปจํ
์คํธ)๊ฐ ์๋ค. ๊ทธ๋์ ๋งค๋์ ๋ DB๋ผ๋ ์ง์ง ์ผํฐ๋ก ๋ฐ์ด๊ฐ๊ธฐ ์ ์ ๋น๋ฐ ๋ฌผ๋ฅ ์ฐฝ๊ณ ์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๋ฃ๊ณ ๊ด๋ฆฌ๋ฅผ ํ๋ค.
- 1์ฐจ ์บ์ : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ๊ธฐ ์ ์ ์์์ฑ ์ปจํ ์คํธ ๋ด์ ์บ์๋ฅผ ๋จผ์ ํ์ธํ๋ค. ์ด๋ฏธ ์กฐํํ๋ ๋ฐ์ดํฐ๋ผ๋ฉด DB์ ์ ๊ทผํ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ๋ก ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ด์ ์ด ์๋ค. → ์ด๋ค ์ ์ ๊ฐ ํ๊ธธ๋ ํ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ๋ฌ๋ผ๊ณ ์์ฒญํ๋ค. ๊ทธ๋ฌ๋ฉด ๋งค๋์ ๋ DB๋ก ๋ฌ๋ ค๊ฐ๊ธฐ ์ ์ ๋น๋ฐ ๋ฌผ๋ฅ ์ฐฝ๊ณ ๋ถํฐ ํ์ธํ๋ค. ๋ง์ฝ ์กฐ๊ธ ์ ์ ํ๊ธธ๋ ์ ๋ณด๋ฅผ ๊บผ๋ด๋ ๊ฒ ์ฐฝ๊ณ ์ ๋จ์ ์๋ค๋ฉด DB๊น์ง ์๊ฐ๊ณ ๋ฐ๋ก ๊บผ๋ด์ ๋ณด์ฌ์ค๋ค.
- ๋ณ๊ฒฝ๊ฐ์ง(Dirty Checking) : ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ ๋ณ๋์ update( ) ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์๋ ๋๋ค. ์ํฐํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด, ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ ์์ ์ ์ํฐํฐ ๋งค๋์ ๊ฐ ์ด๋ฅผ ๊ฐ์งํ์ฌ ์๋์ผ๋ก UPDATE SQL์ ์คํํ๋ค. → ํ์ ์ด๋ฆ์ ํ๊ธธ๋์์ ๊น์ฒ ์๋ก ๋ฐ๊พผ๋ค๊ณ ๊ฐ์ ํ์. ์๋ฐ ์ฝ๋์์ ๊ทธ๋ฅ ๊ฐ์ฒด์ ์ด๋ฆ๋ง setName("๊น์ฒ ์")๋ก ๋ฐ๊พผ๋ค. ๋ฐ๋ก update( ) ๊ฐ์ ๋ช ๋ น์ ๋ด๋ฆฌ์ง ์๋๋ค. ๋งค๋์ ๋ ์ฒ์ ์ฐฝ๊ณ ์ ๋ค์ด์์ ๋ ํ๊ธธ๋ ๋ชจ์ต๊ณผ ๊น์ฒ ์์ ๋ชจ์ต์ ๋น๊ต(์ค๋ ์ท ๋น๊ต)ํ๋ค. ์ด๋ฆ์ด ๋ฐ๋๊ฑธ ์์์ฐจ๋ฆฐ ๋งค๋์ ๋ ์ผ์ด ๋๋ ๋ ์๋์ผ๋ก DB์ ์ด๋ฆ์ ์์ ํ๋ผ๊ณ ๋ณด๋ธ๋ค.
- ์ฐ๊ธฐ์ง์ฐ(Transactional Write-Behind) : ์ํฐํฐ๋ฅผ ์ ์ฅ(persist)ํ ๋ ์ฆ์ DB์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ์ง ์๊ณ , ๋ด๋ถ ์ฟผ๋ฆฌ ์ ์ฅ์์ ๋ชจ์๋์๋ค๊ฐ ํธ๋์ญ์
์ด ์ปค๋ฐ๋๋ ์๊ฐ ํ๊บผ๋ฒ์ DB๋ก ๋ณด๋ธ๋ค. → ํ์ 3๋ช
์ ํ ๋ฒ์ ๊ฐ์
์ํค๋ ค๊ณ ํ ๋, ๋งค๋์ ๋ ๋งค๋ฒ DB๋ก ๋ฐ์ด๊ฐ์ ํ ๋ช
์ฉ ์ ์ฅํ์ง ์๋๋ค. ์ฃผ๋ฌธ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ฐฝ๊ณ ์ ์ ์์๋์๋ค๊ฐ, ์ด๋ ์์ ์ ํ๊บผ๋ฒ์ DB๋ก ๊ฐ์ ธ๊ฐ์ ์ฒ๋ฆฌ(ํธ๋์ญ์
์ปค๋ฐ)ํ๋ค. ์์ง์ด๋ ํ์๋ฅผ ์ค์ฌ์ ํจ์จ์ ๊ทน๋ํํ๋ค.
- ์ฃผ์) ์ํฐํฐ ๋งค๋์ ๋ ์ค๋ ๋ ๊ฐ์ ์ ๋ ๊ณต์ ํ๋ฉด ์๋๋ค. ์คํฐํฐ ๋งค๋์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
๊ณผ ๋ฐ์ ํ ๊ด๊ณ๊ฐ ์๊ณ , ๋ด๋ถ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ๋ฉด ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ํ๋์ ์์ฒญ(ํ๋์ ํธ๋์ญ์
)๋น ํ๋์ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ ๋ค ๋ฐ๋์ ๋ซ์์ผ ํ๋ค. → ์ด ๋งค๋์ ๋ ์๋ ํ ๋ช
๋น ๋งค๋์ ํ ๋ช
์ฉ์ผ๋ก ๋ฐฐ์ ํด์ผํ๋ค. ๋ง์ฝ ํ ๋ช
์ ๋งค๋์ ๊ฐ ์ฌ๋ฌ ์๋์ ์์ฒญ์ ๋์์ ๋ค์ด์ฃผ๋ฉด ์ฐฝ๊ณ ์์ด ๊ผฌ์ด๊ฒ ๋๋ค. ๊ทธ๋์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ๋งค๋์ ๋ฅผ ์๋ก ์์ฑํ๊ณ ์ผ์ด ๋๋๋ฉด ์ข
๋ฃ์์ผ์ผ ํ๋ค.
- ์คํ๋ง ๋ถํธ ํ๊ฒฝ์์ JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ save( ), findById( ) ๋ฑ์ ์ฌ์ฉํ๊ณ ์์๋ค๋ฉด, ์ด๋ฏธ ๊ทธ ๋ด๋ถ์์ ์ํฐํฐ ๋งค๋์ ๊ฐ ์ผ์ ํ๊ณ ์๋ ๊ฒ์ด๋ค.
- Spring Data JPA๊ฐ ์ด ๋ณต์กํ ์ํฐํฐ ๋งค๋์ ์ ์์ฑ, ํธ๋์ญ์ ๊ด๋ฆฌ, ๋ซ๊ธฐ ๊ณผ์ ์ ์์์ ์ถ์ํํด์ฃผ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ง์ ์ฝ๋๋ก ๋ค๋ฃจ์ง ์๊ณ ํธ๋ฆฌํ๊ฒ ๊ฐ๋ฐํ ์ ์๋ค.
2. ์์์ฑ ์ปจํ ์คํธ(Persistence Context)
- ์์์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ํ๋ก๊ทธ๋จ์ ์คํ์ด ์ข ๋ฃ๋๋๋ผ๋ ์ฌ๋ผ์ง์ง ์๋ ๋ฐ์ดํฐ์ ํน์ฑ์ ๋งํ๋ค.
- ์์์ฑ ์ปจํ
์คํธ๋ ๊ฐ์ฒด๋ฅผ ์ค๋ ๋ณด์กดํ๋ ๊ณต๊ฐ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- ๊ฐ์ฒด๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์ด๋ค ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋์ง์ ๋ฐ๋ผ 4๊ฐ์ง ์ํ๋ก ๋๋๋ค.
- ๋น์์ (Transient)
์์์ฑ ์ปจํ ์คํธ์ ์๋ฌด ๊ด๊ณ ์๋ ์ํ์ด๋ค. Java ์์ญ์๋ง ์กด์ฌํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋๋ ์ ์๋ ์์ํ ๊ฐ์ฒด๋ก ์ํฐํฐ ๋งค๋์ ๊ฐ ๊ด๋ฆฌํ์ง ์๋๋ค. ์ํฐํฐ ๋งค๋์ ๊ฐ persist ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ํ๋ก ๋ณ๊ฒฝํ ์ ์๋ค. - ์์ (Managed)
์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ ์ค์ธ ์ํ์ด๋ค. DB์ ์ ์ฅ๋๊ณ , ๋ฉ๋ชจ๋ฆฌ์์์๋ ๊ฐ์ ์ํ๋ก ์กด์ฌํ๋ ์ํ๋ก PK(๊ธฐ๋ณธํค) ๊ฐ์ ํตํด ํ์ํ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด ์ฌ์ฉํ ์ ์๋ค. ์ด๋๋ถํฐ JPA์ ๊ด๋ฆฌ๋ฅผ ๋ฐ๊ธฐ ์์ํ๋ค. - ์ค์์ (Detached)
์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์ด ์์์ผ๋ ๋ถ๋ฆฌ๋ ์ํ์ด๋ค. ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ(์บ์, ๋ณ๊ฒฝ ๊ฐ์ง ๋ฑ)์ ๋ ์ด์ ๋ฐ์ง ๋ชปํ๋ค. - ์ญ์ (Removed)
์์์ฑ ์ปจํ ์คํธ์์ ์์ ํ ์ญ์ ๋ ์ํ์ด๋ค. DB ์์์ ์ญ์ ๋๋ฉฐ ๊ฐ์ฒด๋ ๋์ด์ ์์ ์ปจํ ์คํธ์ ์กด์ฌํ์ง ์๋๋ค.