- ์์์ฑ(Persistence) : ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋๋ผ๋ ์ฌ๋ผ์ง์ง ์๋ ๋ฐ์ดํฐ์ ํน์ฑ
- JDBC ํ๋ก๊ทธ๋๋ฐ์ ๋ณต์กํจ์ด๋ ๋ฒ๊ฑฐ๋ก์ ์์ด ๊ฐ๋จํ ์์
๋ง์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋๋๋ ์์คํ
์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์์ผ๋ฉฐ ์์ ์ ์ธ ๊ตฌ๋์ ๋ณด์ฅ
- SQL Mapper์ ORM์ผ๋ก ๊ตฌ๋ถ๋จ
- ์ฐธ๊ณ https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html
- JDBC๋ DB์ ์ ๊ทผํ ์ ์๋๋ก Java์์ ์ ๊ณตํ๋ API
- ๋ชจ๋ Java์ Data Access ๊ธฐ์ ์ ๊ทผ๊ฐ
- ๋ชจ๋ Persistence Framework๋ ๋ด๋ถ์ ์ผ๋ก JDBC API๋ฅผ ์ด์ฉ
- JDBC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ฃ๋ฅผ ์ฟผ๋ฆฌํ๊ฑฐ๋ ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณต
- ORM : ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํจ์ผ๋ก์จ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑ
- SQL Mapper : SQL์ ๋ช
์ํด์ค์ผ ํจ
- ORM : ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ '๊ด๊ณ'๋ฅผ Object์ ๋ฐ์ํ์๋ ๊ฒ์ด ๋ชฉ์
- SQL Mapper : ๋จ์ํ ํ๋๋ฅผ ๋งคํ์ํค๋ ๊ฒ์ด ๋ชฉ์
- SQL <โ ๋งคํ โ> Object ํ๋
- SQL Mapper๋ SQL ๋ฌธ์ฅ์ผ๋ก ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃธ
- Ex) Mybatis, JdbcTempletes ๋ฑ
- JDBC๋ก ์ฒ๋ฆฌํ๋ ์๋น ๋ถ๋ถ์ ์ฝ๋์ ํ๋ผ๋ฏธํฐ ์ค์ ๋ฐ ๊ฒฐ๊ณผ ๋งคํ์ ๋์ ํด์ค
- ๋ฐ์ดํฐ๋ฒ ์ด์ค record์ ์์ ํ์
๊ณผ Map ์ธํฐํ์ด์ค, ์๋ฐ POJO๋ฅผ ์ค์ ํด์ ๋งคํํ๊ธฐ ์ํด xml๊ณผ Annotation ์ฌ์ฉ ๊ฐ๋ฅ
- SQL์ ๋ํ ๋ชจ๋ ์ปจํธ๋กค์ ํ๊ณ ์ ํ ๋ ๋งค์ฐ ์ ํฉ
- SQL ์ฟผ๋ฆฌ๋ค์ด ๋งค์ฐ ์ ์ต์ ํ๋์ด ์์ ๋์ ์ ์ฉ
- ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ค๊ณ์ ๋ํ ๋ชจ๋ ์กฐ์์ ํ๊ณ ์ ํ ๋๋ ์ ํฉํ์ง ์์
1-4. ORM(Object-Relational Mapping)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ <โ ๋งคํ โ> Object ํ๋
- ORM(Object-relational mapping) : ๊ฐ์ฒด๋ ๊ฐ์ฒด๋๋ก ์ค๊ณํ๊ณ , ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋๋ก ์ค๊ณ
- ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃธ
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํํด์ฃผ๋ ๊ฒ
- ORM์ ์ด์ฉํ๋ฉด SQL Query๊ฐ ์๋ ์ง๊ด์ ์ธ ์ฝ๋(๋ฉ์๋)๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์์
- ๊ฐ์ฒด ๊ฐ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL ์๋ ์์ฑ
- Persistant API ๋ผ๊ณ ๋ ํจ
- Ex) Hibernate, JPA ๋ฑ
- Java Persistence API
- ์๋ฐ ORM ๊ธฐ์ ์ ๋ํ API ํ์ค ๋ช
์ธ๋ก, Java์์ ์ ๊ณตํ๋ API
- ORM์ ์ฌ์ฉํ๊ธฐ ์ํ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ๋ชจ์๋ ๊ฒ
- JPA 2.1 ํ์ค ๋ช
์ธ๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด(= ORM Framework) : Hibernate, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials ๋ฑ
- JPA๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ JDBC ์ฌ์ด์์ ๋์
- ๊ฐ๋ฐ์๊ฐ JPA๋ฅผ ์ฌ์ฉํ๋ฉด, JPA ๋ด๋ถ์์ JDBC API๋ฅผ ์ฌ์ฉํ์ฌ SQL์ ํธ์ถํ์ฌ DB์ ํต์
- ์ฐธ๊ณ https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html
- javax.persistance ํจํค์ง๋ก ์ ์๋ API ๊ทธ ์์ฒด
- JPQL(Java Persistence Query Language)
- ๊ฐ์ฒด/๊ด๊ณ ๋ฉํ๋ฐ์ดํฐ
- SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ
- ๊ฐ๋จํ CRUD (๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์์์ DB UPDATE Query๊ฐ ์คํ๋จ)
- ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์์ ํ ์์ ๋กญ๊ฒ ํ์ํ ์ ์์
- ์ง์ฐ ๋ก๋ฉ ์ ๋ต(Lazy Loading) ์ฌ์ฉ(๊ด๋ จ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ทธ ์์ ์ SELECT Query๋ฅผ ๋ ๋ ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ์ ๋ต)
- ๋์ผํ ํธ๋์ญ์
์์ ์กฐํํ ์ํฐํฐ๋ ๊ฐ์์ ๋ณด์ฅ (๊ฒฐ๊ณผ์ ์ผ๋ก, SQL์ ํ ๋ฒ๋ง ์คํ)
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId); // DB์์ ๊ฐ์ ธ์ด
Member member2 = jpa.find(Member.class, memberId); // 1์ฐจ ์บ์์์ ๊ฐ์ ธ์ด
member1 == member2; //๊ฐ๋ค.
- ํธ๋์ญ์
์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ(transactional write-behind) -> ๋ฒํผ๋ง ๊ธฐ๋ฅ
- [ํธ๋์ญ์
]์ commit ํ ๋๊น์ง INSERT, UPDATE, DELETE SQL์ ๋ฉ๋ชจ๋ฆฌ์ ์๋๋ค
transaction.begin(); // [ํธ๋์ญ์
] ์์
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// ์ด๋๊น์ง INSERT SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด์ง ์๊ณ ์๋ค๊ฐ ์ปค๋ฐํ๋ ์๊ฐ ๋ชจ์์ ๋ณด๋
transaction.commit(); // [ํธ๋์ญ์
] ์ปค๋ฐ
transaction.begin(); // [ํธ๋์ญ์
] ์์
changeMember(memberA);
deleteMember(memberA);
DO_BUSINESS_LOGIC_PROCESS(); // ๋น์ฆ๋์ค ๋ก์ง ์ํ ๋์ DB ๋ก์ฐ๋ฝ์ด ๊ฑธ๋ฆฌ์ง ์์
// UPDATE, DELETE SQL ์คํํ๊ณ ์ปค๋ฐ
transaction.commit(); // [ํธ๋์ญ์
] ์ปค๋ฐ
2-2-1. ์ง์ฐ ๋ก๋ฉ(Lazy Loading)
- ๊ฐ์ฒด๊ฐ ์ค์ ๋ก ์ฌ์ฉ๋ ๋ ๋ก๋ฉํ๋ ์ ๋ต
Member member = memberDAO.find(memberId); // SELECT * FROM MEMBER
Team team = member.getTeam();
String teamName = team.getName(); // SELECT * FROM TEAM
- memberDAO.find(memberId) : Member ๊ฐ์ฒด์ ๋ํ SELECT ์ฟผ๋ฆฌ ์คํ
- member.getTeam() ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ ํ, team.getName() ๋ก ์ค์ ๊ฐ์ฒด๋ฅผ ๊ฑด๋๋ฆฌ๋ ์์ ์ Team ๊ฐ์ฒด์ ๋ํ SELECT ์ฟผ๋ฆฌ ์คํ
- Member์ Team ๊ฐ์ฒด ๊ฐ๊ฐ ๋ฐ๋ก ์กฐํํ๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ๋ฅผ 2๋ฒ ํ๊ฒ ๋จ
- JOIN SQL๋ก ํ ๋ฒ์ ์ฐ๊ด๋ ๊ฐ์ฒด๊น์ง ๋ฏธ๋ฆฌ ์กฐํํ๋ ์ ๋ต
- ํญ์ ์ฐ๊ด๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ด ๊ฐ์ ธ์ด
- JPA์ ๊ตฌํ์ฒด ์ค ํ๋
- SQL์ ์ง์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํด์ JDBC API๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ (Hibernate๊ฐ ์ง์ํ๋ ๋ฉ์๋ ๋ด๋ถ์์๋ JDBC API๊ฐ ๋์)
- ๋งค์ฐ ๊ฐ๋ ฅํ ์ฟผ๋ฆฌ ์ธ์ด(HQL, Hibernate Query Language)๋ฅผ ํฌํจํ๊ณ ์์
- HQL : ์์ ํ ๊ฐ์ฒด ์งํฅ์ ์ด๋ฉฐ ์์, ๋คํ์ฑ, ๊ด๊ณ๋ฑ์ ๊ฐ์ฒด์งํฅ์ ๊ฐ์ ์ ๋๋ฆด ์ ์์
- HQL ์ฟผ๋ฆฌ๋ ์๋ฐ ํด๋์ค์ ํ๋กํผํฐ์ ์ด๋ฆ์ ์ ์ธํ๊ณ ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถ
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํ
- ํ๋ก๊ทธ๋๋จธ์ ์ํด ์์ฑ๋๊ณ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์์
- SQL์์๋ ์ง์ํ์ง ์๋ ํ์ด์ง๋ค์ด์
์ด๋ ๋์ ํ๋กํ์ผ๋ง๊ณผ ๊ฐ์ ํฅ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต
- ์ฌ๋ฌ ํ
์ด๋ธ ์์
์ ๋ช
์์ ์ธ join์ ์๊ตฌํ์ง ์์
- ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์ค ํ ์ ์์ผ๋ฉฐ, ๊ฐ์ฒด์งํฅ ๊ฐ๋ฐ์ด ๊ฐ๋ฅ
- ํ
์ด๋ธ ์์ฑ, ๋ณ๊ฒฝ, ๊ด๋ฆฌ๊ฐ ์ฌ์
- ๋ก์ง์ ์ฟผ๋ฆฌ์ ์ง์คํ๊ธฐ ๋ณด๋ค ๊ฐ์ฒด ์์ฒด์ ์ง์ค ํ ์ ์์
- ๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
- ๋ง์ ๋ด์ฉ์ด ๊ฐ์ธ์ ธ ์๊ธฐ ๋๋ฌธ์ ์์์ผ ํ ๊ฒ์ด ๋ง์
- ์ ์ดํดํ๊ณ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ ์์ค ๋๋ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์