1. JPA๋?
2. SQL ์ค์ฌ ๊ฐ๋ฐ์ ๋ฌธ์ ์
3. JPA(Java Persistence API) ์ฌ์ฉ์ด์
JPA๋ ์๋ฐ ์ง์์ ORM(Object-relational mapping)๊ธฐ์ ํ์ค์ผ๋ก ์ธํฐํ์ด์ค์ ๋ชจ์์ด๋ค. ORM์ ๊ฐ์ฒด๋ ๊ฐ์ฒด๋๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋๋ก ์ค๊ณํ์ฌ ORM ํ๋ ์์ํฌ๊ฐ ์ค๊ฐ์์ ๊ทธ ๋์ ๋งคํํด์ฃผ๋ ๊ฒ์ด๋ค. Spring Boot์ ๊ฐ์ด ์น์๋ฒ ๊ฐ๋ฐ ์ฉ๋๋ก ์ฌ์ฉํ๋ Node Express์์๋ Sequelize๊ฐ ORM์ธ ์ ์ด๋ค.
JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC์ฌ์ด์์ ๋์ํ๋ค. JDBC(Java Database Connectivity)๋ ์๋ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ ์ ์๋๋ก ํ๋ ์๋ฐ API์ด๋ค.
์์์ JPA๋ ์ธํฐํ์ด์ค์ ๋ชจ์์ด๋ผ๊ณ ํํํ๋ค. JPA 2.1 ํ์ค ๋ช
์ธ๋ฅผ ๊ตฌํํ 3๊ฐ์ง ๊ตฌํ์ฒด๋ก๋ Hibernate, EclipseLink, DataNucleus๊ฐ ์๋ค.
JPA๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ก๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ ํ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ฌดํ ๋ฐ๋ณต, ์ง๋ฃจํ ์ฝ๋๊ฐ ๋ ์ ์๋ค. ๋ค์ ์์๋ฅผ ๋ณด์!
public class Member{
private String memberId;
private String name;
}
ํ์์ ๊ดํ ํด๋์ค๊ฐ ์๋ค. ํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋๋น์ ์ ์ฅ ๋ฐ ์์ , ์กฐํ, ์ญ์ ๋ฅผ ํ๊ธฐ ์ํด์ ์ฟผ๋ฆฌ๋ฌธ์ด ๊ณ์ํด์ ๋ฐ๋ณต๋ ๊ฒ์ด๊ณ ๊ฐ๋ฐ์๋ ์๋ง์ ์ฟผ๋ฆฌ๋ฌธ์ ๋ฐ๋ณต ์์ฑํด์ผ ๋๊ธฐ ๋๋ฌธ์ ์๋นํ ๊ท์ฐฎ๊ณ ํผ๊ณคํ ๊ฒ์ด๋ค...๐ฎโ๐จ
INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES
SELECT MEMBER_ID, NAME FROM MEMBER M
UPDATE MEMBER SET ...
ํจ๋ฌ๋ค์์ด ๋ค๋ฅธ ๋ ๊ฐ์ง๋ฅผ ๊ฐ์ง๊ณ ์ต์ง๋ก ๋งคํํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. Object๋ฅผ RDB์ ๋ฃ์ผ๋ ค๊ณ ํ๋๊น ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
ํ์ง๋ง, RDB๊ฐ ์ธ์ํ ์ ์๋ ๊ฒ์ SQL๋ฟ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ, Object๋ฅผ SQL๋ก ์ง์ผํ๋ค. ๊ฐ๋ฐ์๊ฐ SQL๋งคํผ๊ฐ ๋์ด ์๋ง์ SQL ์์
์ ํ๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
๊ฐ์ฒด์๋ ์์๊ด๊ณ๊ฐ ์กด์ฌํ์ง๋ง RDB์๋ ์์๊ด๊ณ๊ฐ ์กด์ฌํ์ง ์๋๋ค.
๋ค๋ง ์ํผํ์
๊ณผ ์๋ธํ์
์ด ์กด์ฌํ ๋ฟ์ด๋ค.
์ ๋ค์ด์ด๊ทธ๋จ์ ํตํด ์๋ฅผ ๋ค์๋ฉด ALBUM์ ์กฐํํ๊ธฐ ์ํด์ ITEM๊ณผ ALBUM์ JOINํด์ ์กฐํํด์ผ ํ๋ค. ๋ํ ์์ฑํ๊ธฐ ์ํด์ ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ชจ๋ ํ๋๊ฐ์ ์ธํ ํ๋ค.Item๊ณผ Album ๊ฐ๊ฐ ๋ชจ๋ ํ๋๊ฐ์ ์ธํ ํ๋ค. MOVIE, BOOK์ ๋ํ CRUD ๋ก์ง์ ์คํํ๊ธฐ ์ํด์๋ ๋๊ฐ์ ๋ณต์กํ๊ณ ๋ฐ๋ณต๋๋ ๊ณผ์ ์ด ๊ณ์๋ ๊ฒ์ด๋ค....๐ตโ๐ซ
๊ฐ์ฒด๋ ์์ ๋กญ๊ฒ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ ์ ์์ด์ผ ํ๋ค.
ํ์ง๋ง, ์๋น์ค ๋ก์ง์์ RDB์ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ ์ ์๋ค.
์ฒ์ ์คํํ๋ SQL์ ๋ฐ๋ผ ํ์ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
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 ์ปฌ๋ผ ์ฌ์ฉ
}
์ฒ์ SQL์์ Member์ Team์ ๊ฐ์ ธ์๋ค๊ณ ํ๋ฉด, Order๋ ๊ฐ์ ธ์ค์ง ์์๊ธฐ ๋๋ฌธ์
member.getOrder(); ์ null ๊ฐ์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
SELECT M.*, T.* FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
member.getTeam(); //OK
member.getOrder(); //null
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam(); //???
member.getOrder().getDelivery(); // ???
}
}
DAO์์ ์ง์ ์ด๋ค ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ธ๋์ง ํ์ธํ์ง ์๋ ์ด์, ์ ์๊ฐ ์๋ค. ์ง์ ํ ์๋ฏธ์ ๊ณ์ธต ๋ถํ ์ด ์ด๋ ต๋ค.
์ ๋ฆฌํด๋ณด๋ฉด ๊ฐ์ฒด๋ต๊ฒ ๋ชจ๋ธ๋ง ํ ์๋ก ๋งคํ ์์
๋ง ๋์ด๋๋ค.
๊ฐ์ฒด๋ฅผ ์๋ฐ ์ปฌ๋ ์
์ ์ ์ฅ ํ๋ฏ์ด DB์ ์ ์ฅํ ์๋ ์์๊น? ๋ผ๋ ์๊ฐ์ผ๋ก ๋์จ ๊ฒฐ๊ณผ๊ฐ JPA(Java Persistence API)์ธ ๊ฒ์ด๋ค!
์์์ SQL ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ์ ๋์ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ์ ์ ๋ณด์๋ค JPA๋ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ํด์ค๋ค.
SQL ์ค์ฌ์์ ๊ฐ๋ฐํ ๊ฒฝ์ฐ ์ ๋ง์ SQL๋ฌธ์ ์์ฑํด์ผ ํ๋ค ํ์ง๋ง JPA ์ฌ์ฉ์
โข ์ ์ฅ: jpa.persist(member)
โข ์กฐํ: Member member = jpa.find(memberId)
โข ์์ : member.setName(โ๋ณ๊ฒฝํ ์ด๋ฆโ)
โข ์ญ์ : jpa.remove(member)
์์ ๊ฐ์ด ๊ฐ๋จํ ์ฝ๋๋ก CRUD๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
๊ธฐ์กด์ ํ๋ ๋ณ๊ฒฝ์ ๋ชจ๋ SQL๋ฌธ์ ์์ ํด์ผ ํ๋ค. ํ์ง๋ง JPA์ฌ์ฉ์ ํ๋๋ง ์ถ๊ฐํ๋ฉด ๋๊ณ , SQL์ JPA๊ฐ ์ฒ๋ฆฌํ๋ค.
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId); // DB์์ ๊ฐ์ ธ์ด
Member member2 = jpa.find(Member.class, memberId); // 1์ฐจ ์บ์์์ ๊ฐ์ ธ์ด
member1 == member2; //๊ฐ๋ค.
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //์บ์
println(m1 == m2) //true
๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํํ๋ค. ์ด๋ sql๋ฌธ์ ํ๋ฒ๋ง ์คํํจ์ผ๋ก ์ฝ๊ฐ์ ์ฑ๋ฅ ํฅ์์ด ์๋ค.
DB Isolation Level์ด Read Commit์ด์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์์ Repeatable Read ๋ณด์ฅํ๋ค.
transaction.begin(); // [ํธ๋์ญ์
] ์์
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//์ฌ๊ธฐ๊น์ง INSERT SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด์ง ์๋๋ค.
//์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT SQL์ ๋ชจ์์ ๋ณด๋ธ๋ค.
transaction.commit(); // [ํธ๋์ญ์
] ์ปค๋ฐ
transaction.begin(); // [ํธ๋์ญ์
] ์์
changeMember(memberA);
deleteMember(memberB);
๋น์ฆ๋์ค_๋ก์ง_์ํ(); //๋น์ฆ๋์ค ๋ก์ง ์ํ ๋์ DB ๋ก์ฐ ๋ฝ์ด ๊ฑธ๋ฆฌ์ง ์๋๋ค.
//์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ UPDATE, DELETE SQL์ ๋ณด๋ธ๋ค.
transaction.commit(); // [ํธ๋์ญ์
] ์ปค๋ฐ
์ถ์ฒ