[JPA] ์ฐ๊ด๊ด๊ณ
๐ 1. JPA ์ฐ๊ด๊ด๊ณ ๊ฐ์
- JPA๋? ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ๋งคํํ๋ API
- ์ํฐํฐ(Entity): ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋์๋๋ ๊ฐ์ฒด๋ก ํน์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํํ
- ์ฐ๊ด๊ด๊ณ์ ์๋ฏธ: JPA ์ํฐํฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ฉฐ, ํ ์ํฐํฐ๊ฐ ๋ค๋ฅธ ์ํฐํฐ์ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง๋ฅผ ์ค๋ช ํจ
- ์ดํดํด์ผ ํ๋ ์ด์ : ์ ํ๋ฆฌ์ผ์ด์ ๋ด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์ฑ๋ฅ ํฅ์, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ, ์ ์ง ๋ณด์์ฑ์ ํ๋ณดํ๊ธฐ ์ํจ
๐ 2. One-to-Many (์ผ๋๋ค ์ฐ๊ด๊ด๊ณ)
๋ถ๋ชจ ์ธก(์: ๊ฐ์กฑ)๊ณผ ์์ ์ธก(์: ๊ตฌ์ฑ์)์ ๊ด๊ณ๋ค
๐น ์๋ฐฉํฅ One-to-Many
- ์ ์ด(Cascade) ๋ฐฉํฅ: ํญ์ ๋ถ๋ชจ ์ธก์์ ์์ ์ธก์ผ๋ก๋ง ์ ์ด๋ฅผ ์ฌ์ฉํด์ผ ํจ
- ์์ ์ธก(@ManyToOne)์๋ ์ ์ด ํ์ ์ ๋ถ์ด๋ฉด ์๋๋ค
๐น ๋จ๋ฐฉํฅ One-to-Many
- ์์ ์ธก์์ ๋ถ๋ชจ๋ฅผ ์ฐธ์กฐํ์ง ์๊ธฐ ๋๋ฌธ์, ์ธ๋ํค๋ฅผ ์ ์ฅํ ์ ์์ด โ๋ณ๋์ ์ฐ๊ฒฐ ํ ์ด๋ธ(Link Table)โ์ด ์๋ ์์ฑ๋๋ค
- ๋ฌธ์ ์ 1 (๋นํจ์จ์ฑ): ์ฐ๊ฒฐ ํ ์ด๋ธ ์์ฒด์ ์ค๋ฒํค๋, 2๊ฐ์ ์ธ๋ํค ์ธ๋ฑ์ฑ์ผ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ฆ๊ฐ, 3๊ฐ ํ ์ด๋ธ ์กฐ์ธ์ผ๋ก ์ธํ ์ฟผ๋ฆฌ ๋ณต์ก์ฑ ๋ฐ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค
- ๋ฌธ์ ์ 2 (INSERT/DELETE ๋นํจ์จ): ์๋ก์ด ์์(๊ตฌ์ฑ์)์ ํ๋ ์ถ๊ฐํ ๋, ์ฐ๊ฒฐ ํ ์ด๋ธ์ ์๋ โ๊ธฐ์กด ๊ด๊ณ๋ฅผ ๋ชจ๋ ์ญ์ (DELETE)ํ ํ, ์๋ก์ด ์์์ ํฌํจํ์ฌ ์ ์ฒด๋ฅผ ๋ค์ ์ฝ์ (INSERT)โํ๋ ๋นํจ์จ์ ์ธ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ๋ถ๋ชจ๊ฐ ์์์ ์ํ๋ฅผ ์ ํํ ํ์ ํ๊ธฐ ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค
- ๐ก ํด๊ฒฐ ๋ฐฉ๋ฒ (@JoinColumn): ๋ถ๋ชจ ์ํฐํฐ์ @JoinColumn์ ์ถ๊ฐํ๋ฉด ์ฐ๊ฒฐ ํ ์ด๋ธ ์์ด ์์ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ์ง์ ์ ์ดํ ์ ์์ต๋๋ค. ๋จ, ์ฌ์ ํ ์ธ๋ํค ์ค์ ์ ์ํ ์ถ๊ฐ UPDATE ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ฌ ์ด๋ ์ ๋์ ์ฑ๋ฅ ์ ํ๋ ๋ฐ์ํ๋ค
๐ 3. Many-to-Many (๋ค๋๋ค ์ฐ๊ด๊ด๊ณ)
์์ธก ๋ชจ๋ ๋ถ๋ชจ๊ฐ ๋ ์ ์์ผ๋ฉฐ, ๋ณ๋์ ์ฐ๊ฒฐ ํ ์ด๋ธ์ ํตํด ๋ ๊ฐ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌ
๐น ์ฃผ์ ์ต์ ํ ์์น
- List ๋์ Set ์ฌ์ฉํ๊ธฐ:
- CascadeType.ALL ๋ฐ REMOVE ์ฌ์ฉ ๊ธ์ง:
- ์์ธก ๋ชจ๋ ์ง์ฐ ๋ก๋ฉ(Lazy Loading) ์ฌ์ฉํ๊ธฐ:
๐ 4. One-to-One (์ผ๋์ผ ์ฐ๊ด๊ด๊ณ)
๐น ๋จ๋ฐฉํฅ One-to-One
- ์์ ์ธก์ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ผ๋ฉฐ, ๋ถ๋ชจ๋ ์์์ ์๋ณ์๋ฅผ ์์ง ๋ชปํ๋ค
- ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์กฐ๊ฑด ํ์์ ํด์ผ ํ๋ฏ๋ก, ๋ถ๋ชจ๊ฐ ์์์ ํ์๋ก ํ ๋๋ง๋ค ๋งค๋ฒ ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค
๐น ์๋ฐฉํฅ One-to-One
- ๋ถ๋ชจ ์ธก์ @MappedBy๋ฅผ ์ถ๊ฐํ์ฌ ์ค์ ํฉ๋๋ค.
- ๋ฌธ์ ์ : ์ง์ฐ ๋ก๋ฉ(LAZY)์ ์ค์ ํ๋๋ผ๋ ๋ถ๋ชจ๋ฅผ ์กฐํํ ๋ ์์๊น์ง ๋ฌด์กฐ๊ฑด SELECT ๋๋ ๋ฌธ์ ๊ฐ ์๋ค
๐ก ํด๊ฒฐ ๋ฐฉ๋ฒ: @MapsId ์ฌ์ฉ
- ์์ ์ธก์ @MapsId๋ฅผ ์ถ๊ฐํ์ฌ ์์ ํ ์ด๋ธ์ด ๋ถ๋ชจ ํ ์ด๋ธ๊ณผ ๊ธฐ๋ณธํค(PK)๋ฅผ ๊ณต์ ํ๋๋ก ์ค์ ํฉ๋๋ค. (์์ ์๋ณ์ ์์ฑ ์ ๋ต(Strategy)์ ์ ๊ฑฐ)
- ๋ถ๋ชจ ์ํฐํฐ์์๋ ๊ตณ์ด ์๋ฐฉํฅ ๋งคํ์ ํ ํ์๊ฐ ์์ด ๊ตฌ์กฐ๊ฐ ๋จ์ํ
- ์ฅ์ 1: ๋ถ๋ชจ ์กฐํ ์ ์์์ ๋ถํ์ํ๊ฒ ๊ฐ์ ธ์ค๋ ๋ถ๊ฐ ์ฟผ๋ฆฌ ๋ฌธ์ ๊ฐ ํด๊ฒฐ
- ์ฅ์ 2: ๊ธฐ๋ณธํค์ ์ธ๋ํค๋ฅผ ๋ชจ๋ ์ธ๋ฑ์ฑํ ํ์๊ฐ ์์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ฐ์
This post is licensed under CC BY 4.0 by the author.