[JPA] 1.JPA ์๊ฐ
0. ๋ค์ด๊ฐ๋ฉฐ
JPA๊ฐ ์ค๋ฌด์์ ์ด๋ ค์ด ์ด์
1) ๊ฐ์ฒด์ ํ ์ด๋ธ ์ฌ๋ฐ๋ฅด๊ฒ ๋งตํํ๊ณ 2) ์ค๊ณํ๋ ๋ฒ์ ๋ชฐ๋ผ์
1. SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ ๋ฌธ์ ์
Application์ ๊ฐ์ฒด์งํฅ
Database๋ ๊ด๊ณํ
+ ์ํ, ์ฃผ๋ฌธ๋ง๋ค CRUD๋ฅผ ๋ค ๋ง๋ค์ด์ผํจ
+ ๊ฐ์ฒด์ ํ๋ ํ๋ ์ถ๊ฐํ๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ ๋ค ๊ณ ์ณ์ผํจ
ํจ๋ฌ๋ค์์ ๋ถ์ผ์น
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ถ์ํ / ์บก์ํ / ์ ๋ณด์๋ / ์์ / ๋คํ์ฑ ๋ฑ ์์คํ ์ ๋ณต์ก์ฑ์ ์ ์ดํ ์ ์๋ ๋ค์ํ ์ฅ์น๋ค์ ์ ๊ณต
๊ฐ์ฒด๋ฅผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ
[๊ฐ์ฒด] - [sql ๋ณํ] - [RDB]
sql ๋ณํ = sql ๋งตํผ๊ฐ ๊ฐ๋ฐ์์ ์ญํ
(a) <<< ์์๊ด๊ณ >>>
- Album ์ ์ฅ
1) ๊ฐ์ฒด ๋ถํด
2) INSERT INTO ITEM
3) INSERT INTO ALBUM
- Album ์กฐํ
1) ๊ฐ๊ฐ์ ํ ์ด๋ธ์ ๋ฐ๋ฅธ ์กฐ์ธ SQL ์์ฑ
2) ๊ฐ๊ฐ์ ๊ฐ์ฒด ์์ฑ
-> ์์๋งํด๋ ๋ณต์ก
๊ทธ๋์ DB ์ ์ฅํ ๊ฐ์ฒด์๋ ์์ ๊ด๊ณ๋ฅผ ์ฐ์ง ์์!!
์๋ฐ ์ปฌ๋ ์
์ ์ ์ฅํ๋ค๋ฉด?
list.add(album);
์๋ฐ ์ปฌ๋ ์ ์์ ์กฐํํ๋ฉด? : ๋ถ๋ชจ ํ์ ์ผ๋ก ์กฐํ ํ ๋คํ์ฑ ํ์ฉ
Item item = list.get(albumId);
(b) <<< ์ฐ๊ด๊ด๊ณ >>>
- ๊ฐ์ฒด๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉ : member.getTeam()
- ํ ์ด๋ธ์ ์ธ๋ ํค๋ฅผ ์ฌ์ฉ : JOIN ON M.TEAM_ID = T.TEAM_ID
์๋์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ๋ง์ถ์ด ๋ชจ๋ธ๋ง
์๋๋ ๊ฐ์ฒด๋ค์ด ๋ชจ๋ธ๋ง
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ์ธ์ํธ ์ฟผ๋ฆฌ / ์กฐํ ๊ฐ ๊น๋ค๋ก์์ง
์ธ์ํธ -> TEAM_ID ์นผ๋ผ์ ๋ฃ์๋ member.getTeam().getId(); ์์ผ๋ก ํด์ผํจ
์กฐํ -> SQL JOIN์ผ๋ก ๋ฉค๋ฒ ๊ฐ์ ธ์์ ๋ฉค๋ฒ ํ ๊ฐ๊ฐ ๋ฃ์ด์ฃผ๊ณ ๊ด๊ณ ์ค์ ๊น์ง ํด์(member.setTeam(team)) return
์๋ฐ ์ปฌ๋ ์ ์์ ๊ด๋ฆฌํ๋ค๋ฉด?
list.add(member);
Member member = list.get(memberId);
Team team = member.getTeam();
(c) <<< ๊ฐ์ฒด ๊ทธ๋ํ ํ์ >>>
- ๊ฐ์ฒด๋ ์์ ๋กญ๊ฒ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ ์ ์์ด์ผํ๋ค
์ํฐํฐ ์ ๋ขฐ ๋ฌธ์
-> DAO์์ member ๊ฐ์ฒด ๊ฐ์ ธ์๋๋ฐ ํด๋น member๊ฐ์ฒด์์ member.getOrder() ๋ฑ ํ ์ ์์๊น?
-> DAO์์ find ๋ฉ์๋๊ฐ ์ด๋ป๊ฒ ์ค๊ณ๋์๋์ง๋ฅผ ๋ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ๋จ
๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ฉํ ์๋ ์๋ค
- ์ํฉ์ ๋ฐ๋ผ ๋์ผํ ํ์ ์กฐํ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๋ฒ ์์ฑํ๋ค๋ฉด memberDAO.getmember/member with order ๋ฑ๋ฑ ๋ฉ์๋๋ฅผ ๋ค ๋ง๋ค์ด์ค์ผํจ...
๊ณ์ธตํ ์ํคํ ์ฒ - ์ง์ ํ ์๋ฏธ์ ๊ณ์ธต ๋ถํ ์ด ์ด๋ ค์
(d) <<< ๋น๊ตํ๊ธฐ >>>
๋๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด ๊ฐ๊ฐ ์์ฑํด์ ๋น๊ตํ๋ฉด ๋ถ๋ช ํ ๋ค๋ฅธ ๊ฐ์ฒด๋ผ๊ณ ์ธ์ํ๋ค
ํ์ง๋ง ์๋ฐ ์ปฌ๋ ์ ์์ list.get(memberId)๋ผ๊ณ ํด์ ์์ฑํ ๋๊ฐ์ member ๊ฐ์ฒด๋ ๋์ผํ๋ค!
๊ฒฐ๋ก ) ๊ฐ์ฒด๋ต๊ฒ ๋ชจ๋ธ๋ง ํ ์๋ก ๋งตํ ์์ ๋ง ๋์ด๋จ...
-> ๊ฐ์ฒด๋ฅผ ์๋ฐ ์ปฌ๋ ์ ์ ์ ์ฅํ๋ฏ์ด DB์ ์ ์ฅํ ์๋ ์์๊น?
= JPA(Java Persistentce API)
2. JPA ์๊ฐ
JPA?
- Java Persistence API
- ์๋ฐ ์ง์์ ORM ๊ธฐ์ ํ์ค
ORM?
- Object-relational mapping (๊ฐ์ฒด ๊ด๊ณ ๋งตํ)
- ๊ฐ์ฒด๋ ๊ฐ์ฒด๋๋ก ์ค๊ณ
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋๋ก ์ค๊ณ
- ORM ํ๋ ์์ํฌ๊ฐ ์ค๊ฐ์์ ๋งตํ
- ๋์ค์ ์ธ ์ธ์ด์๋ ๋๋ถ๋ถ ORM ๊ธฐ์ ์ด ์กด์ฌ
JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์์ ๋์
JPA ๋์ - ์ ์ฅ, ์กฐํ
JPA ์๊ฐ
EJB : ์ํฐํฐ ๋น (์๋ฐ ํ์ค) -> ํ์ด๋ฒ๋คํธ (์คํ ์์ค) -> JPA (์๋ฐ ํ์ค)
JPA๋ ํ์ค ๋ช ์ธ
- ์ธํฐํ์ด์ค์ ๋ชจ์
- 2.1 ํ์ค ๋ช ์ธ๋ฅผ ๊ตฌํํ 3๊ฐ์ง ๊ตฌํ์ฒด
- ํ์ด๋ฒ๋ค์ดํธ, EclipseLink, DataNucleus
JPA๋ฅผ ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
- SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ
- ์์ฐ์ฑ
- ์ ์ง๋ณด์
- ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ
- ์ฑ๋ฅ
- ๋ฐ์ดํฐ ์ ๊ทผ ์ถ์ํ์ ๋ฒค๋ ๋ ๋ฆฝ์ฑ
- ํ์ค
1) ์์ฐ์ฑ - JPA์ CRUD
- ์ ์ฅ : jpa.persist(member)
- ์กฐํ : Member member = jpa.find(memberId)
- ์์ : member.setName("๋ณ๊ฒฝํ ์ด๋ฆ")
- ์ญ์ : jpa.remove(member)
2) ์ ์ง๋ณด์
- ๊ธฐ์กด: ํ๋ ๋ณ๊ฒฝ์ ๋ชจ๋ SQL ์์
- JPA : ํ๋๋ง ์ถ๊ฐํ๋ฉด๋จ, SQL์ JPA๊ฐ ์ฒ๋ฆฌ
3) JPA์ ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ
(a) JPA์ ์์
[์ ์ฅ]
- ๊ฐ๋ฐ์๊ฐ ํ ์ผ : jpa.persist(album);
- ๋๋จธ์ง JPA๊ฐ ์ฒ๋ฆฌ : INSERT INTO ITEM... / INSERT INTO ALBUM...
[์กฐํ]
- ๊ฐ๋ฐ์๊ฐ ํ ์ผ : Album album = jpa.find(Album.class, albumId);
- ๋๋จธ์ง JPA๊ฐ ์ฒ๋ฆฌ : SELECT I.*, A.* FROM ITEM I JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
(b) JPA์ ์ฐ๊ด๊ด๊ณ
- ์ฐ๊ด๊ด๊ณ ์ ์ฅ : member.setTeam(team); / jpa.persist(member);
(c) JPA์ ๊ฐ์ฒด ๊ทธ๋ํ ํ์
- ๊ฐ์ฒด ๊ทธ๋ํ ํ์ : Member member = jpa.find(Member.class, memberId); / Team team = member.getTeam();
์ ๋ขฐํ ์ ์๋ ์ํฐํฐ, ๊ณ์ธต
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam();
member.getOrder();.getDelivery();
}
}
(d) JPA์ ๋น๊ตํ๊ธฐ
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2 //๊ฐ๋ค
* ๋์ผํ ํธ๋์ญ์ ์์ ์กฐํํ ์ํฐํฐ๋ ๊ฐ์์ ๋ณด์ฅ
4) JPA์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ
(a) 1์ฐจ ์บ์์ ๋์ผ์ฑ(identity)๋ณด์ฅ
- ๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํ - ์ฝ๊ฐ์ ์กฐํ ์ฑ๋ฅ ํฅ์
- DB isolation level์ด Read Commit์ด์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ Repeatable Read ๋ณด์ฅ
-> jpa.find ์ฌ๋ฌ๊ฐ๋ผ๋ sql์กฐํ ํ๋ฒ๋ง ๋จ!!! (๊ฐ์ ํธ๋์ญ์ ์์์)
(b) ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ(transactional write-behind)
[INSERT]
- ํธ๋์ญ์ ์ ์ปค๋ฐํ ๋๊น์ง INSERT SQL์ ๋ชจ์
- JDBC BATCH SQL ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ ๋ฒ์ SQL ์ ์ก
transaction.begin(); //ํธ๋์ญ์
์์
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// ์ฌ๊ธฐ๊น์ง INSERT SQL ๋ณด๋ด์ง ์์
// ์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT SQL ๋ชจ์์ ๋ณด๋
transaction.commit();
[UDPATE, DELETE]
- UPDATE, DELETE๋ก ์ธํ ๋ก์ฐ(ROW)๋ฝ ์๊ฐ ์ต์ํ
- ํธ๋์ญ์ ์ปค๋ฐ ์ UPDATE, DELETE SQL ์คํํ๊ณ ๋ฐ๋ก ์ปค๋ฐ
transaction.begin();
changeMember(memberA);
deleteMember(memberB);
// ๋น์ฆ๋์ค ๋ก์ง ์ํ() - ๋น์ฆ๋์ค ๋ก์ง ์ํ ๋์ DB ๋ก์ฐ ๋ฝ์ด ๊ฑธ๋ฆฌ์ง ์์
// ์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ UPDATE, DELETE SQL ๋ณด๋
transaction.commit();
(c) ์ง์ฐ ๋ก๋ฉ(Lazy Loading), ์ฆ์ ๋ก๋ฉ
- ์ง์ฐ ๋ก๋ฉ : ๊ฐ์ฒด๊ฐ ์ค์ ์ฌ์ฉ๋ ๋ ๋ก๋ฉ
- ์ฆ์ ๋ก๋ฉ : JOIN SQL๋ก ํ๋ฒ์ ์ฐ๊ด๋ ๊ฐ์ฒด๊น์ง ๋ฏธ๋ฆฌ ์กฐํ
์ง์ฐ๋ก๋ฉ
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName(); // ์ด๋ ํ๋ก์ ์ด๊ธฐํ (team๋ฐ์ดํฐ ๊ฐ์ ธ์์ ๊ฐ ์ฑ์์ค)
์ฆ์๋ก๋ฉ
Member member = memberDAO.find(memberId); // member team ๊ฐ์ด ์ด๋ค๊ณ ์
ํ
ํด๋๋ฉด ์ฆ์ ๋ก๋ฉ(์กฐ์ธํด์ ๊ฐ์ ธ์ด)
Team team = member.getTeam();
String teamName = team.getName();
ORM์ [๊ฐ์ฒด]์ [RDB] ๋ ๊ธฐ๋ฅ ์์ ์๋ ๊ธฐ์
'๐จโ๐ป Web Development > JPA - ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] 4.์ํฐํฐ ๋งตํ (0) | 2023.03.10 |
---|---|
[JPA] 3.์์์ฑ ๊ด๋ฆฌ - ๋ด๋ถ ๋์ ๋ฐฉ์ (0) | 2023.03.09 |
[JPA] 2.JPA ์์ํ๊ธฐ (0) | 2023.03.09 |
์ต๊ทผ๋๊ธ