ํฐ์คํ ๋ฆฌ ๋ทฐ
Spring
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 1 (JPA ์๊ฐ)
chaewonni 2024. 4. 18. 18:53๐กSQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ ๋ฌธ์ ์
- ๋ฐ๋ณต์ ์ธ CRUD ์ฟผ๋ฆฌ ์์ฑ ๋ฐ ์์
- ์ง์์ ์ผ๋ก CRUD ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์์ ํ๋ ๋ฐ๋ณต์ ์ธ ์์ ์ด ํ์ํ๋ค.
- ์๋ฐ ๊ฐ์ฒด์ SQL ๊ฐ์ ๋ณํ
- ์๋ฐ ๊ฐ์ฒด๋ฅผ SQL ๋ฌธ์ผ๋ก ๋ณํํ๊ณ , SQL ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํ๋ ๊ณผ์ ์ด ๋ฐ๋ณต๋๋ค.
๐ป ํจ๋ฌ๋ค์์ ๋ถ์ผ์น
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐจ์ด
- ์์
- ์ฐ๊ด๊ด๊ณ
- ๋ฐ์ดํฐ ํ์
- ๋ฐ์ดํฐ ์๋ณ ๋ฐฉ๋ฒ
1. ์์
- ๊ฐ์ฒด: ๊ฐ์ฒด๋ ์์ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ๊ฒ ๊ฐ์ง๊ณ ์๋ค.
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค: ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ํผํ์ - ์๋ธํ์ ๊ด๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ์์๊ณผ ์ ์ฌํ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ธ๋ง ํ์ง๋ง, ์ง์ ํ ์์ ๊ด๊ณ๋ ์๋๋ค.
๋ฌธ์ ๋ฐ์
- Album ๊ฐ์ฒด ์ ์ฅ: Album ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ค๋ฉด, Album๊ณผ ์์ ํด๋์ค์ธ Item์ผ๋ก ๋ถํดํ์ฌ ๋ ๊ฐ์ INSERT ๋ฌธ์ ์์ฑํด์ผ ํ๋ค.
- Album ๊ฐ์ฒด ์กฐํ: Album ๊ฐ์ฒด๋ฅผ ์กฐํํ๋ ค๋ฉด, Item๊ณผ Album ํ ์ด๋ธ์ ์กฐ์ธํ๋ SQL์ ์์ฑํ๊ณ , ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค. ์ด๋ Movie์ Book ๊ฐ์ฒด์ ๋ํด์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
JPA๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ํด๊ฒฐ
- ์ ์ฅ: JPA๋ ํ์ ํ์ ์ ์ ์ฅํ ๋ ์์ ๋ฐ ํ์ ํ์ ์ ํด๋นํ๋ INSERT ๋ฌธ์ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ๋ถํ ์ ์ฅํ๋ค.
- ์กฐํ: ์กฐํ ์์๋ ํ์ํ ํ ์ด๋ธ์ ์กฐ์ธํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
2. ์ฐ๊ด๊ด๊ณ
- ๊ฐ์ฒด: ๊ฐ์ฒด๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ๋งบ๋๋ค.
- ํ ์ด๋ธ: ํ ์ด๋ธ์ ์ธ๋ ํค๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ ๊ด๊ณ๋ฅผ ๋งบ๋๋ค.
๋ฌธ์ ๋ฐ์
- ํ ์ด๋ธ ์ค์ฌ ๋ชจ๋ธ๋ง: ํ ์ด๋ธ์ ์ธ๋ ํค ์ปฌ๋ผ์ ์ฌ์ฉํ์ฌ ๊ด๊ณ๋ฅผ ๋งบ์ง๋ง, ์ด๋ก ์ธํด ๊ฐ์ฒด ๊ฐ ์ฐธ์กฐ๊ฐ ์์ด member.getTeam()์ ํตํ ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ด ๋ถ๊ฐ๋ฅํ๋ค.
class Member {
String id; //MEMBER_ID ์ปฌ๋ผ ์ฌ์ฉ
Long teamId; //TEAM_ID FK ์ปฌ๋ผ ์ฌ์ฉ //**
String username;//USERNAME ์ปฌ๋ผ ์ฌ์ฉ
}
class Team {
Long id; //TEAM_ID PK ์ฌ์ฉ
String name; //NAME ์ปฌ๋ผ ์ฌ์ฉ
}
- ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ๋ง: ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํตํ ๋ชจ๋ธ๋ง์ ํ์์ด ๊ฐ๋ฅํ๋, ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ SQL ๋ณํ ์์ ์ด ๋ณต์กํด์ง๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT ํ๊ธฐ ์ํด์ member.getTeam().getId()๋ฅผ ํด์ผํ๋ค.
class Member {
String id; //MEMBER_ID ์ปฌ๋ผ ์ฌ์ฉ
Team team; //์ฐธ์กฐ๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋๋ค. //**
String username;//USERNAME ์ปฌ๋ผ ์ฌ์ฉ
}
Team getTeam() { return team;
}
class Team {
Long id; //TEAM_ID PK ์ฌ์ฉ
String name; //NAME ์ปฌ๋ผ ์ฌ์ฉ
}
JPA๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ํด๊ฒฐ
- JPA๋ ๊ฐ์ฒด ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ธ๋ ํค๋ก ๋ณํํ์ฌ SQL ์์ฑ์ ์๋ํํ๊ณ , ์กฐํ ์ ์ธ๋ ํค๋ฅผ ๊ฐ์ฒด ์ฐธ์กฐ๋ก ์๋ ๋ณํํ์ฌ ์ฒ๋ฆฌํ๋ค.
3. ๊ฐ์ฒด ๊ทธ๋ํ ํ์
- ๊ฐ์ฒด๋ ์์ ๋กญ๊ฒ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ ์ ์์ด์ผ ํ๋ค.
- ๊ฐ์ฒด์์ ์์๋ ํ์ ์กฐํํ๋ ค๋ฉด ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด ์ฐ๊ด๋ ํ์ ์ฐพ๋๋ค.
๋ฌธ์ ๋ฐ์
- SQL์ ์ง์ ๋ค๋ฃฐ ๊ฒฝ์ฐ, ์ฒ์ ์คํํ SQL์ ๋ฐ๋ผ ํ์ํ ์ ์๋ ๊ฐ์ฒด ๊ทธ๋ํ์ ๋ฒ์๊ฐ ์ ํ๋๋ค. ์๋ฅผ ๋ค์ด, Member์ Team๋ง ์กฐ์ธํ SQL์์๋ member.getTeam()์ ๊ฐ๋ฅํ์ง๋ง, ๋ค๋ฅธ ๊ฐ์ฒด ํ์์ ๋ถ๊ฐ๋ฅํ๋ค.
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
member.getTeam(); //OK
member.getOrder(); //null
- ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ฉํ ์ ์์ผ๋ฏ๋ก, ์ํฉ์ ๋ฐ๋ผ ๋์ผํ ํ์ ์กฐํ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๋ฒ ์์ฑํด์ผ ํ๋ค. --> ์ผ์ด์ค๊ฐ ํ๋๊ฐ๊ฐ ์๋ --> ์ง์ ํ ์๋ฏธ์ ๊ณ์ธต ๋ถํ ์ด ์ด๋ ค์์ง
JPA๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ํด๊ฒฐ
- JPA๋ ์ค์ ๊ฐ์ฒด ์ฌ์ฉ ์์ ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ๋ฏธ๋ฃจ๋ ์ง์ฐ ๋ก๋ฉ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ํ์ํ ๋ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ ์กฐํ๊ฐ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
4. ๋น๊ต
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: ๊ฐ ๋ก์ฐ(row)๋ ๊ธฐ๋ณธ ํค ๊ฐ์ผ๋ก ๊ตฌ๋ถ๋๋ค.
- ๊ฐ์ฒด: ๊ฐ์ฒด๋ ์ฃผ์ ๊ฐ(๋์ผ์ฑ ==)๊ณผ ๋ด๋ถ ๊ฐ(๋๋ฑ์ฑ equals())์ผ๋ก ๋น๊ตํ ์ ์๋ค.
๋ฌธ์ ๋ฐ์
- ๊ฐ์ ํค์ Member ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฒ ์กฐํํ๋ฉด, ๊ฐ ์กฐํ๋ง๋ค ๋ค๋ฅธ ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ๋น๊ต ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 == member2; //๋ค๋ฅด๋ค.
JPA๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ํด๊ฒฐ
- JPA๋ ๊ฐ์ ํธ๋์ญ์ ๋ด์์ ๋์ผํ ์ํฐํฐ์ ๋ํ ์กฐํ ์ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๋ฐํํจ์ ๋ณด์ฅํ๋ค. ์ด๋ก์จ ๊ฐ์ฒด ๋น๊ต์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค.
๐กJPA์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ
1. 1์ฐจ ์บ์์ ๋์ผ์ฑ ๋ณด์ฅ
- ๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํํ๋ค. -> ์ฝ๊ฐ์ ์กฐํ ์ฑ๋ฅ ํฅ์
-
DB Isolation Level์ด Read Commit์ด์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ Repeatable Read ๋ณด์ฅ
๊ฐ์ ๋ฉค๋ฒ๋ฅผ ์กฐํํ๊ฒ ๋๋ฉด ์ฒ์์๋ SQL ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๊ฒ ๋๊ณ , ๊ทธ ๋ค์์ผ๋ก๋ JPA๊ฐ SQL์ ๋ ๋ฆฌ์ง ์๊ณ JPA๊ฐ ๋ค๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ค๊ณ ์์ ๋ฐํ์ ํด์ค๋ค. ์ฆ, SQL์ ํ ๋ฒ๋ง ์คํ์ด ๋๋ค.
2. ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
INSERT
- ํธ๋์ญ์ ์ ์ปค๋ฐํ ๋๊น์ง INSERT SQL์ ๋ชจ์๋ค.
- JDBC BATCH SQL ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ ๋ฒ์ SQL์ ์ ์กํ๋ค.
UPDATE
- UPDATE, DELETE๋ก ์ธํ ๋ก์ฐ(ROW)๋ฝ ์๊ฐ์ ์ต์ํํ๋ค.
- ํธ๋์ญ์ ์ปค๋ฐ ์ UPDATE, DELETE SQL์ ์คํํ๊ณ , ๋ฐ๋ก ์ปค๋ฐํ๋ค.
3. ์ง์ฐ ๋ก๋ฉ(Lazy Loading)
- ์ง์ฐ ๋ก๋ฉ: ๊ฐ์ฒด๊ฐ ์ค์ ์ฌ์ฉ๋ ๋ ๋ก๋ฉ๋๋ค. (ex. ๋ฉค๋ฒ๋ฅผ ์กฐํํ ๋ ํ์ ์ ์กฐํ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ ์ผ๋จ ๋ฉค๋ฒ๋ง ๋จผ์ ์กฐํํ๊ณ , ํ์ด ์ค์ ์ฌ์ฉ๋ ๋ ์กฐํ)
- ์ฆ์ ๋ก๋ฉ: JOIN SQL๋ก ํ๋ฒ์ ์ฐ๊ด๋ ๊ฐ์ฒด๊น์ง ๋ฏธ๋ฆฌ ์กฐํ (ex. ๋ฉค๋ฒ๋ ํ์ ๊ฑฐ์ ๋ฌด์กฐ๊ฑด ๊ฐ์ด ์ฐ๋ ๊ฒฝ์ฐ ๋ฉค๋ฒ๋ฅผ ์กฐํํ๋ ์๊ฐ ํ๋ ๊ฐ์ด ์กฐํ)
JPA ๊ฐ๋ฐํ ๋๋ ๋ณดํต ์ง์ฐ๋ก๋ฉ์ผ๋ก ์ซ ์ธํ ์ ํด๋๋ค๊ฐ, ๋์ค์ ์ฑ๋ฅ์ ๋ณด๊ณ ํ๋์ ์ฟผ๋ฆฌ๋ก ํ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋คํ๋ฉด ๊ฑฐ๊ธฐ๋ง ์ฆ์๋ก๋ฉ์ผ๋ก ์ค์ ํด์ค์ ์ต์ ํ๋ฅผ ํ๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 2 (JPA ์์ํ๊ธฐ) (1) | 2024.04.19 |
---|---|
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 1 (JPA ์๊ฐ) #2 (0) | 2024.04.19 |
์คํ๋ง ํค์๋ ๋ชจ์ #2 (0) | 2024.04.16 |
๊ฐ์ฒด ์์ฑ - ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์ ๋น๋ ํจํด (0) | 2024.04.15 |
์คํ๋ง(์๋ฐ) ํค์๋ ๋ชจ์ #1 (0) | 2024.04.09 |
๊ณต์ง์ฌํญ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ
- Total
- Today
- Yesterday
๋งํฌ
TAG
- SQLD
- ๋ก๊ทธ์์
- ํ๋ก ํธ์๋
- ํ์ํํด
- EnumType.ORDINAL
- ์คํ๋ง
- ํ์ด์ฌ
- ์๋ฐ
- ์นMVC
- ์์
- ์คํ๋ง ๋ถ๋งํฌ
- ๋ฐฑ์ค
- JPA
- ์คํ๋ง๋ถํธ
- ๋ถ๋งํฌ
- ์๋ฐ ์คํ๋ง
- ์คํ๋ง ์ปค๋ฎค๋ํฐ
- ๋ฐฑ์ค ํ์ด์ฌ
- elasticsearch
- ๋น์์
- ์ง์ฐ๋ก๋ฉ
- ์ปค๋ฎค๋ํฐ
- ์น MVC
- SQL
- DP
- SQL ๋ ๋ฒจ์
- ์ค์์
- ์ธํ ๋ฆฌ์ ์ด
- ๋ก๊น
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
๊ธ ๋ณด๊ดํจ