728x90
๐ JPA ?
- Java Persistence API
- ์๋ฐ ์ง์์ ORM ๊ธฐ์ ํ์ค
- ORM?
- Object-relational mapping(๊ฐ์ฒด ๊ด๊ณ ๋งคํ)
- ๊ฐ์ฒด๋ ๊ฐ์ฒด๋๋ก ์ค๊ณ
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋๋ก ์ค๊ณ
- ORM ํ๋ ์์ํฌ๊ฐ ์ค๊ฐ์์ ๋งคํ
- ๋์ค์ ์ธ ์ธ์ด์๋ ๋๋ถ๋ถ ORM ๊ธฐ์ ์ด ์กด์ฌํจ.
- ORM?
- JPA ๋ ํ์ค๋ช ์ธ
- JPA ๋ ์ธํฐํ์ด์ค์ ๋ชจ์.
- JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์์ ๋์ํจ.
- JPA์ ์ญ์ฌ?
- "EJB (์ํฐํฐ ๋น (์๋ฐํ์ค))" ์์ ์์ --> ๋๊ตฐ๊ฐ๊ฐ ๋ถํธํด์ ๋ง๋ ๊ฒ์ด "ํ์ด๋ฒ๋ค์ดํธ" (์ด๊ฑด ์คํ์์ค.) --> ์ด ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ๋ณด๋ค ๋ค๋ฌ์ด์ ๋ง๋ ๊ฒ์ด ํ์ฌ์ "JPA"
๐ JPA๋ฅผ ์ ์ฌ์ฉํด์ผ ํ๋ ์ง ?
- 1. SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ -> ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ
- 2. ์์ฐ์ฑ _ JPA์ CRUD
- ์ ์ฅ : jpa.persist(member);
- ์กฐํ : Member member = jpa.find(memberId);
- ์์ : member.setName("๋ณ๊ฒฝํ ์ด๋ฆ");
- ์ญ์ : jpa.remove(member);
- JPA๊ฐ ์๋ฐ ์ปฌ๋ ์ ์ ์ด์ฉํ๋ ๊ฒ ๊ฐ์ด. ๊ทธ ๊ณผ์ ์ ๋ค ํด์ฃผ๊ณ , DB์ ์ ์ฅํด์ฃผ๋ ์ผ์ ํจ.
- 3. ์ ์ง๋ณด์
- ๋ง์ฝ ์ปฌ๋ผ์ด ์ถ๊ฐ ๋๋ค๋ฉด,
- ๊ธฐ์กด JDBC์ ๊ฒฝ์ฐ,
public Class Member{
String id;
String name;
String email;
}
Insert๋ฌธ
INSERT INTO MEMBER (ID, NAME, EMAIL)
VALUES('gloria', '๊ธ๋ก๋ฆฌ์', 'gloria94682015@tistory.com');
SELECT๋ฌธ
SELECT ID, NAME, EMAIL
FROM MEMBER;
์คํ ์ง์ ์ TEL์ ๋ฃ์ด๋ฌ๋ผ๊ณ ํ๋ฉด?
public Class Member{
String id;
String name;
String email;
// ์คํ ์ง์ ์ tel ์ ์ถ๊ฐ ํด๋ฌ๋ผ๊ณ ํ๋ฉด?
String tel;
}
Insert๋ฌธ
INSERT INTO MEMBER (ID, NAME, EMAIL, TEL)
VALUES('gloria', '๊ธ๋ก๋ฆฌ์', 'gloria94682015@tistory.com', '010123456789');
SELECT๋ฌธ
SELECT ID, NAME, EMAIL, TEL
FROM MEMBER;
-
- ์คํ ์ง์ ์ TEL์ด ๋ค์ด๊ฐ์ผํ๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ถ ๋ค ์์ ํด์ค์ผํจ.
- JPA ์ ๊ฒฝ์ฐ
public Class Member{
private String id;
private String email;
// ์คํ ์ง์ ์ tel ์ ์ถ๊ฐ ํด๋ฌ๋ผ๊ณ ํ๋ฉด?
private String tel; // ๊ทธ๋ฅ ํ๋๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋จ.,
}
-
- ์ด๋ ๊ฒ ํ๋๋ง ์ถ๊ฐํ๋ฉด ๋จ, SQL ์ JPA ๊ฐ ์์์ ์ฒ๋ฆฌํด์ค๋ค.
- 4. ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ
- JPA์ ์์
-
- https://gloria94682015.tistory.com/74 ๋ฏธ๋ฆฌ ๊ณต๋ถํ ๋ด์ฉ,
- JPA ๊ฐ ์์์ INSERT INTO ELECS ์ INSERT INTO CELLPHONE ์ผ๋ก ๋๋ ์ ์ฟผ๋ฆฌ๋ฅผ ๋๋ฆผ.
-
- JPA์ ์ฐ๊ด๊ด๊ณ
//JPA์ ์ฐ๊ด๊ด๊ณ
member.setTeam(team);
jpa.persist(member);
-
- JPA์ ๊ฐ์ฒด ๊ทธ๋ํ ํ์
//JPA์ ๊ฐ์ฒด ๊ทธ๋ํ ํ์
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
-
- ์ํฐํฐ๋ฅผ ์ ๋ขฐํ ์ ์๋ค.
- ์ด์ : JPA ๋ "์ง์ฐ๋ก๋ฉ" ์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์.
- member.getTeam() ์ด๋ member.getOrder().getDelivery() ๋ฅผ ํด์
- ์ค์ ๋ก ์ด ๊ฐ์ฒด๋ฅผ ์กฐํํด์ ์ฌ์ฉํ๋ ์์ ์ ์ฟผ๋ฆฌ๊ฐ ๋์์ ๊ฐ์ฒด์ ์ฑ์์ง.
- ์ํฐํฐ๋ฅผ ์ ๋ขฐํ ์ ์๋ค.
// JPA ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ํฐํฐ๋ฅผ ์ ๋ขฐํ ์ ์์.
class MemberService {
public void process(){
Member member = memberDAO.find(memberId);
member.getTeam(); // ์์ ๋กญ๊ฒ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ ์ ์์.
member.getOrder().getDelivery();
}
}
-
- JPA์ ๋น๊ตํ๊ธฐ
- ๋์ผํ ํธ๋์ญ์ ์์ ์กฐํํ ์ํฐํฐ๋ ๊ฐ์์ ๋ณด์ฅํด์ค.
- JPA์ ๋น๊ตํ๊ธฐ
- 6. ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ
- 1) 1์ฐจ ์บ์์ ๋์ผ์ฑ ๋ณด์ฅ
- 1๏ธโฃ ๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํํจ. --> ( ์ฝ๊ฐ์ ์กฐํ ์ฑ๋ฅ ํฅ์ )
- 2๏ธโฃ DB Isolation Level ์ด Read Commit ์ด์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์์ Repeatable Read ๋ณด์ฅ.
- ๋ญ๊ฐ ๋๊ฒ ์ดํดํ๊ธฐ ์ด๋ ค์์,,, ์ผ๋จ, ๊ฑด๋๋. ใ ใ ;;...
- 1) 1์ฐจ ์บ์์ ๋์ผ์ฑ ๋ณด์ฅ
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); // SQL
Member m2 = jpa.find(Member.class, memberId); // ์บ์
// m1 == m2
// SQL ์ 1๋ฒ๋ง ์คํํจ.
- ์ด ๋์ ์บ์๋, ๊ธฐ์กด์ ์๊ณ ์๋ ์บ์์๋ ์ข ๋ค๋ฆ.
- ํ ํธ๋์ ์ ์ ์์ ~ ๋ ์ฌ์ด์์ ๋์ผ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ผ๋ก, ์์ฃผ ์งง์ ์บ์ ์ฒ๋ฆฌ.
- 2) ํธ๋์ญ์
์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ - INSERT
- 1๏ธโฃ ํธ๋์ญ์ ์ ์ปค๋ฐํ ๋๊น์ง INSERT SQL ์ ๋ชจ์.
- 2๏ธโฃ JDBC BATCH SQL ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ๋ฒ์ SQL ์ ์ก.
- ์ต์ ํ๋๋ง ์ผ์ฃผ๊ฒ ๋๋ฉด, ํธํ๊ฒ ๊ฐ๋ฅ.
transaction.begin(); // ํธ๋์ ์
์์.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//persist๋ก ์ ์ฅ์ ํ๋ค๊ณ ํด๋, ๋ฐ๋ก INSERT SQL ์ DB์ ๋ณด๋ด์ง ์์.
// ์ปค๋ฐ์ ํ๋ ์๊ฐ, ์์๋์๋ INSERT SQL์ DB์ ๋ชจ์์ ๋ณด๋.
transaction.commit(); // ํธ๋์ ์
์ปค๋ฐ.
-
- 2) ํธ๋์ญ์
์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ - UPDATE
- 1๏ธโฃ UPDATE, DELETE ๋ก ์ธํ ๋ก์ฐ(ROW)๋ฝ ์๊ฐ ์ต์ํ
- 2๏ธโฃ ํธ๋์ ์ ์ปค๋ฐ ์ UPDATE, DELETE SQL ์คํํ๊ณ , ๋ฐ๋ก ์ปค๋ฐ.
- LOCK ?
- ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ฐฉ๋ฒ.
- ROW LOCK ?
- ํ ์์ค์ ๋ฝ์ 1๊ฐ์ ํ์ ๊ธฐ์ค์ผ๋ก ๋ฝ ์ค์ ์ ํจ.
- DML์ ๋ํ ๋ฝ์ผ๋ก ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฝ์ด๋ผ๊ณ ํจ.
- 2) ํธ๋์ญ์
์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ - UPDATE
transaction.begin(); // ํธ๋์ ์
์์.
changeMember(memberA);
deleteMember(memberB);
๋น์ฆ๋์ค ๋ก์ง ์ํ(); // ๋น์ฆ๋์ค ๋ก์ง ์ํ ๋์ DB ๋ก์ฐ ๋ฝ์ด ๊ฑธ๋ฆฌ์ง ์์.
//persist๋ก ์ ์ฅ์ ํ๋ค๊ณ ํด๋, ๋ฐ๋ก INSERT SQL ์ DB์ ๋ณด๋ด์ง ์์.
// ์ปค๋ฐ์ ํ๋ ์๊ฐ, ์์๋์๋ UPDATE, DELETE SQL์ DB์ ๋ชจ์์ ๋ณด๋.
transaction.commit(); // ํธ๋์ ์
์ปค๋ฐ.
-
- 3) ์ง์ฐ๋ก๋ฉ
- ์ง์ฐ ๋ก๋ฉ : ๊ฐ์ฒด๊ฐ ์ค์ ์ฌ์ฉ๋ ๋ ๋ก๋ฉ.
- ์ฆ์ ๋ก๋ฉ : JOIN SQL ๋ก ํ๋ฒ์ ์ฐ๊ด๋ ๊ฐ์ฒด๊น์ง ๋ฏธ๋ฆฌ ์กฐํ.
- JPA ์ ์ต์ ์ด ์์. ๋ฉค๋ฒ๋ฅผ ๊ฐ์ ธ์ฌ ๋, ๋๋ถ๋ถ ํ์ ๊ฐ์ ธ์จ๋ค๊ณ ํ๋ฉด ์ฆ์ ๋ก๋ฉ์ด ์ ๋ฆฌํ๋๊น,
- ์ต์ ์ ์ฃผ๋ฉด ๋จ.
- 3) ์ง์ฐ๋ก๋ฉ
// ์ง์ฐ๋ก๋ฉ
Member member = memberDAO.find(memberId); // select * from member
Team team = member.getTeam();
String teamName = team.getName(); // select * from team
// ์ฆ์ ๋ก๋ฉ
Member member = memberDAO.find(memberId); // select m.*, t.* from member join team on m.teamId = t.id
Team team = member.getTeam();
String teamName = team.getName();
- 7. ๋ฐ์ดํฐ ์ ๊ทผ ์ถ์ํ์ ๋ฒค๋ ๋ ๋ฆฝ์ฑ
- 8. ํ์ค
๐ ?
- ใ ใ
๊ฐ๋ฐ ๊ณต๋ถ๋ฅผ ์ํ ๋ธ๋ก๊ทธ ์ ๋๋ค.
์ค๋ฅ๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
๊ฐ์ฌํฉ๋๋ค.

728x90
'JAVA > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA๊ฐ์] 2-1) Hello JPA - ํ๋ก์ ํธ ์์ฑ (0) | 2022.08.17 |
---|---|
[JPA๊ฐ์] 1-1) SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ ๋ฌธ์ ์ (0) | 2022.08.15 |
[์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ] 1์ฅ. JPA ์๊ฐ (0) | 2022.08.14 |