JPA์ ์๊ฐ
๐ JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์ด๋ป๊ฒ ๋ฐ์ ํด์๊ณ ์ ์ฌ์ฉํ๋์ง๋ฅผ ์๊ณ ์จ์ผ ํ๊ธฐ์ ์ ๋ฆฌํด๋ด ๋๋ค.
์ง๊ธ์ ๊ฐ์ฒด๋ฅผ ๊ด๊ณํ DB์ ๋ฃ์ด์ ๊ด๋ฆฌ๋ฅผ ํ๋ค.
ํ์ง๋ง ์ค์์ ํ ์ด๋ธ ๋ง๋ค SQL๋ฌธ๋ฒ์ ์ ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋งตํ์ ํ๋ ๊ฒ์ ์๋น๋ ์๊ฐ์ ํ๋นํ๊ฒ ๋์๋ค.
public class Memeber {
privaet String memberId;
privaet String name;
}
INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES
SELECT MEMBER_ID, NAME FROM MEMBER M
UPDATE MEMBER SET ...
์์ ๊ฐ์ ์ฟผ๋ฆฌ ์์ ์ํํด์ผ ํ๊ฒ ๋๋ค. ํ์ง๋ง ๊ธฐํ์๊ฐ ์ฐ๋ฝ์ฒ๋ฅผ ์ถ๊ฐํ๊ฒ
๋ถํ์ ํ๊ฒ ๋๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ค ์์ ํ๊ณ ๊ฐ์ฒด๋ฅผ ์์ ํด์ผ ํ๋
๋น ํจ์จ์ ์ธ ๋ถ๋ถ์ด ์๊ธฐ๊ฒ ๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ์์ ํ๋ ๊ณผ์ ์์ ํ ๋ถ๋ถ์
์์ ํ์ง ์๊ฒ ๋๋ฉด ์ฝ๋์์ ์๋ฌ๊ฐ ๋ ์ ๋ฐ์ ์๊ฒ ๋๋ค.
๐ ๊ด๊ณํDB vs ๊ฐ์ฒด
๊ด๊ณํ DB
- ๊ด๊ณํ DBPK, FK๋ก ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค.
- ์์์ด ์๋ค.
๊ฐ์ฒด
- ๊ฐ์ฒด์๋ก ์ฐธ์กฐ๋ฅผ ํ ์ ์๋ค.
- ์์์ด ์๋ค.
๐ ๊ด๊ณํDB์ ๊ฐ์ฒด ์กฐํ์ ์ฐจ์ด์
๐ง๊ฐ์ฒด์ ๊ฒฝ์ฐ INSERT์ ALBUM๊ฐ์ฒด๋ฅผ INSERTํ ITEM์๋ INSERTํด์ผ ํ๊ฒ ๋๋ค. ALBUM์ ์กฐํ ํ ์์๋ ITEM๊ณผ ALBUM์ JOINํ ํ ์กฐํ ํ๋ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ ํ๊ฒ ๋๋ค.
์์ ๊ฐ์ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ ํ์ง ์๊ณ ์ปฌ๋ ์ ์ ๊ด์ ์์ ๋ณธ๋ค๋ฉด? ์๋์ ์ฝ๋์ฒ๋ผ ์์ฃผ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์กฐํ๋ฅผ ํ ์ ์๋ ๊ฑธ ๋ณผ ์ ์๋ค.
๐ ๊ด๊ณํDB์ ๊ฐ์ฒด์ ์ฐ๊ด๊ด๊ณ
- ๊ฐ์ฒด์ ๊ฒฝ์ฐ ์ฐธ์กฐ๋ก ์ด์ฉํด ์ฐพ์ ๊ฐ ์ ์์ง๋ง ํ ์ด๋ธ์ ๊ฒฝ์ฐ pk, fk์ ๊ฐ์ผ๋ก join์ ํ์ฌ ์ฐธ์กฐ ํ ์ ์๋ค.
- ๊ฐ์ฒด์ ๊ฒฝ์ฐ Team์์ Member์ ๊ฐ์ ์ฐธ์กฐํ๋ ๋ถ๋ถ์ด ์๊ธฐ์ Team.getMemeber()๊ฐ์ด ์ฐธ์กฐ๋ฅผ ํ ์ ์๋ค.
- ํ ์ด๋ธ์ ๊ฒฝ์ฐ TEAM์์ TEAM_ID๊ฐ ์๊ธฐ์ MEMBER๋ก ๊ฐ ์ ์์ผ๋ฉฐ MEMBER์TEAM_ID(FK)๋ฅผ ์ญ ์ฐธ์กฐ๋ฅผ ํ ์ ์๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ์๋์ฒ๋ผ ํ ์ด๋ธํ ์ฐ๊ด๊ด๊ณ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒดdml ์ฐ๊ด๊ด๊ณ๋ก ํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ค๊ณ๋ฅผ ํ ๊ฒฝ์ฐ ์กฐํ์์ ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
๐ถ๐ซ๏ธ์กฐํ์ ์์ฑ๋๋ ๋ฌธ์ ๋ง์ง๋ง member.setTeam(team)์ผ๋ก ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฐ๊ด๊ด๊ณ๋ฅผ ์ ํ ํ๊ฒ ๋๋ค.
๐ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ปฌ๋ ์ ์ ๊ฐ์ ์ ์ฅํ๋ค๊ณ ์๊ฐํ๊ฒ ํ๋ค๋ฉด ์ฝ๊ฒ ๋ณํ๋ค. ์๋์ฒ๋ผ ๊ฐ์ฒด๋ง์ ๋ณผ ๋์๋ ๋ฐ์ฒ๋ผ ์ฝ๊ฒ ๋์ง๋ง DB์ ๋ฃ๊ฒ ๋๋ ์๊ฐ ์์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ํํด์ผ ํ๋ ๊ฒ์ด๋ค.
๐ ๊ฐ์ฒด๊ฐ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๋๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค ์๋์ ๊ฐ์ ๊ทธ๋ฆผ์์ ๋ณธ๋ค๋ฉด Member์์ Delivery๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ ํ ์ ์์ด์ผ ํ์ง๋ง ์ค์์ ๋ค๋ฅด๋ค.
์ฒ์ ์์ํ๋ SQL์์ ์ด๋ฏธ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ์ฒ์์ MEMBER์ TEAM์ ํฉํ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๊ทธ ๋ค์ getOrder์ ํ์ ์์ ๊ฐ์ด ๋ชจ๋ ์ฑ์์ ธ์๋ค๋ฉด ๊ฐ์ด ๊ฐ์ ธ์์ง์ง๋ง ๊ทธ๋ ์ง ์๋ค๋ฉด null๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค. ์ด๋ด ๊ฒฝ์ฐ ์ํฐํฐ์ ์ ๋ขฐ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
memberDAO์ ๊ฐ์ด ์ด๋ป๊ฒ ์ง์ฌ์ก๋์ง ํ์ธ์ ์ค์ ๋ก ํ๊ธฐ ์ ์๋ ์ฌ์ฉํ ์ ์๋ค. ์๋ํ๋ฉด ๋ ์ด์ด๋ ์ํคํ ์ณ ๊ตฌ๊ฐ์์ ์ ๋ขฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.(๊ทธ ๋ค์ ๊ณ์ธต์์ ์ ๋ขฐ๋ฅผ ํ ์ ์์ด์ผ ์ฌ์ฉ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์)
์๋์ ๊ฐ์ด SQL์ ๋ฌธ๋ฒ์์ ๋ณธ๋ค๋ฉด member1, member2๋ ๊ฐ๊ฐ new Member๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ์ด ๋ฌ๋ผ์ง๋ค.
๊ทธ๋ ์ง๋ง ์ปฌ๋ ์ ์ ๊ด์ ์์ ๋ณธ๋ค๋ฉด ์๋์ ๊ฐ์ ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์ปฌ๋ ์ ์ ์ ์ฅํ๋ฏ์ด DB์ ์ ์ฅํ๋ ๋ฒ์ ๊ณ ๋ฏผํ๊ฒ ๋๋ค.
๐ ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋์จ ๊ฒ์ด ๋ฐ๋ก ์ ์ด ๋ด๋ฆฐ ์ ๋ฌผ JPA์ด๋ค.
๐ JPA๋ JAVA ORM์ ํ์ค์ด๋ค. ๊ทธ ๋ง์ด๋ ์ฆ ์์ ํฌ์คํ ์์ ๋งํ๋ ๊ฐ์ฒด์ ์ผ๋ก ๋ง๋ ๋ฐ์ดํฐ๋ฅผ DB์ ๋ฐ์ด๋ฃ์๋ ORM ํ๋ ์์ํฌ์ธ JPA๋ก ๋งตํ์ ํด์ฃผ๊ฒ ๋จ ์๋ฆฌ์ด๋ค. ๊ทธ๋ ๊ธฐ์ JPA์ ๋ํด์ ์์๋ณด์
JPA์ ๋์ ์๋ฆฌ
์๋ฅผ ๋ค์ด JPA์๊ฒ MemberDAO์ ๊ฐ์ ๋ฃ๊ณ ์ member๊ฐ์ฒด๋ฅผ ๋๊ธฐ๊ฒ ๋๋ค๋ฉด JPA๊ฐ ์๋์ ์ผ๋ก insert์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ DB์ ๋ณด๋ด๊ณ ๊ฐ์ ๋ฐ๊ฒ ๋๋ค. JPA๋ ์ฆ ์ํ๋ ๋์์ ๋ง๋ ์ฟผ๋ฆฌ๋ฅผ ์๋์ ์ผ๋ก ์์ฑํด์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด JPA๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ ๋ญ๊น?
์์ฐ์ฑ : ์ด๋ฏธ ์ฝ๋๊ฐ ๋ค ๋ง๋ค์ด์ ธ์๊ธฐ ๋๋ฌธ์ ์๋์ฒ๋ผ ๋ถ๋ฌ์ฐ๋ฉด ๋๋ค
- ํนํ ์์ ๋ถ๋ถ์์ set๋ง์ ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก ์์ ์ด ๋๋ค. ์ปฌ๋ ์ ์์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ํธํ๋ฐ JAVA ์ปฌ๋ ์ ์์ ๊ฐ์ ์ฐพ์ ํ ์์ ์์ ๋ค์ ๊ฐ์ ๋ฃ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๋ถ๋ถ์์ ํธํ๋ค๊ณ ํ ์ ์๋ค.
์ ์ง ๋ณด์ : ์ฟผ๋ฆฌ ๋จ์ ์๊ฐํ ํ์๊ฐ ์๋ค!
- ๊ธฐ๋ณธ ์ ์ผ๋ก ์ฐ๋ฝ์ฒ๋ฅผ ์ถ๊ฐ ์์ ์๋์ ์ฟผ๋ฆฌ๋ฌธ์ ์์ ํด์ผ ํ๋ค๋ฉด JPA๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด JPA์์ ์์ฒด์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ๋ง๋ค์ด ์ํํ๊ธฐ ๋๋ฌธ์ SQL์ ์ฟผ๋ฆฌ๋ฌธ์ ์์ ํ ํ์๊ฐ ์๊ฒ ๋๋ค.!
ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ!
- ๊ธฐ๋ณธ ์ ์ผ๋ก ์๋์ ๋ฐ์ดํฐ ๊ด๊ณ๋ฅผ ๊ตฌ์ํ๊ณ ์ง์ ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ผ ํ๋ค๋ฉด ์ด์ ๋ JPA๋ฅผ ์ฌ์ฉํ๊ฒ ํธ๋ฆฌํ๊ฒ ๋๋ค.
- JPA๋ฅผ ์ด์ฉํด์ ์๋์ member ๊ฐ์ฒด๋ฅผ ๋ค๊ณ ์จ๋ค๋ฉด JPA์ ์ง์ฐ ๋ก๋ฉ(๊ตฌ๋ฌธ์ด ์คํ๋๋ ์๊ฐ ์๋ํ๋ ๊ตฌ๋ฌธ ์๋ฅผ ๋ค์ด member.getTeam์ด ์์๋๋ ์์ ์ member๊ฐ์ฒด์ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฑ์์ค๋ค.)์ ์ด์ฉํ์ฌ ์๋์ ๊ตฌ๋ฌธ์ ์ ๋ขฐ ํ ์ ์๋ค.
์ฑ๋ฅ ์ต์ ํ
- ๋์ผ Transactional์์์๋ ๋์ผ์ฑ์ ๋ณด์ฅํ๋ค.
- JPA๋ ์ฟผ๋ฆฌ๋ค์ ๋ฐ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์๋ ํ commit์์ ์ ๊ฐ์ ์ฟผ๋ฆฌ๋ค์ ์ต์ ์ ํ๋ ํจ ๊ฒ๋ง์ผ๋ก ํ ๋ฒ์ ๋ณด๋ธ๋ค.
- ์ง์ฐ ๋ก๋ฉ : member๊ฐ์ฒด๋ฅผ ๊บผ๋ธ ํ getTeam์ผ๋ก ๋ค๊ณ ์จ team์ ๊ฑด๋ค๊ฒ ๋ ๋ ์ค์ DB์ ์ฟผ๋ฆฌ ๊ฐ์ ๋ณด๋ด team์ ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ์ค๊ฒ ๋๋ค. ์ฝ๊ฒ ๋งํ๋ฉด ์๋์ ๊ทธ๋ฆผ์์ Team team = member.getTeam();์์ ์ team์ ๊ฐ์ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ String teamName = team.getName();์์ ์ team์ ๊ฑด๋๋ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ฒ์ด๋ค.
- ์ฆ์ ๋ก๋ฉ : ์ค์ ๋ก ์ฌ์ฉ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ member๋ฅผ ์ฌ์ฉ์ team์ ๋ค๊ณ ์์ผ ํ๋ค๋ฉด JPA์ ์ต์ ์ ์ฌ์ฉํ์ฌ ์ฆ์ ๋ก๋ฉ์ ์ด์ฉํด member๋ฅผ ๋ค๊ณ ์ฌ ๋ team์ ๋ค๊ณ ์ค๊ฒ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ ์ ์ด๋ฏธ ๋ก๋ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ์จ๋ค.
์ถ์ฒ : https://inf.run/spjG
'JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ (section 6) (0) | 2022.08.23 |
---|---|
์ฐ๊ด๊ด๊ณ ๋งคํ ๊ธฐ์ด (section 5) (0) | 2022.08.16 |
์ํฐํฐ ๋งคํ(section 4) (0) | 2022.08.14 |
์์์ฑ ์ปจํ ์คํธ(section 3) (1) | 2022.08.09 |
Transactional(section 2) (0) | 2022.08.05 |