JDBC๋ DB์ ์ ๊ทผํ ์ ์๋๋ก Java์์ ์ ๊ณตํ๋ API์
๋๋ค.
๋ชจ๋ Java Data Access ๊ธฐ์ ์ ๊ทผ๊ฐ์ผ๋ก, ๋ชจ๋ Persistence Framework๋ ๋ด๋ถ์ ์ผ๋ก JDBC API๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Persistence Framework๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๊ณผ์ ์ ๋์์ฃผ๊ณ ์๋ํํ๋ ๋งค๊ฐ ์ํํธ์จ์ด๋ก,
๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ์๋ฐ ๊ฐ์ฒด ์ธต๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธต ์ฌ์ด๋ฅผ ๋งค๋๋ฝ๊ฒ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํฉ๋๋ค.
ํฌ๊ฒ SQL Mapper์ ORM์ผ๋ก ๋๋ฉ๋๋ค.
๐ก ์์์ฑ Persistence
๋ฐ์ดํฐ๋ฅผ ์์ฑํ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋๋ผ๋ ์ฌ๋ฆฌ์ง์ง ์๋ ๋ฐ์ดํฐ์ ํน์ฑ์ผ๋ก,
์์์ฑ์ ๊ฐ์ง ์๋ ๋ฐ์ดํฐ๋ ๋จ์ง ๋ฉ๋ชจ๋ฆฌ์์๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ฉด ๋ชจ๋ ์์ด๋ฒ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ํ์ผ ์์คํ
, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํน์ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ์ฌ ์์์ฑ์ ๋ถ์ฌํด์ผ ํฉ๋๋ค.
๐ก Persistence Layer
1๏ธโฃ ํ๋ ์ ํ
์ด์
๊ณ์ธต(Presentation layer), UI๊ณ์ธต
2๏ธโฃ ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต(Application layer), ์๋น์ค๊ณ์ธต
3๏ธโฃ ๋น์ฆ๋์ค ๋
ผ๋ฆฌ ๊ณ์ธต(Business logic layer), ๋๋ฉ์ธ๊ณ์ธต
4๏ธโฃ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต(Data access layer), ์์๊ณ์ธต
SQL Mapper๋ Object์ SQL์ ํ๋๋ฅผ ๋งคํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒดํํ๋ ๊ธฐ์ ์
๋๋ค.
๊ฐ์ฒด์ ํ
์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋งคํํ๋ ๊ฒ์ด ์๋๋ผ, SQL๋ฌธ์ ์ง์ ์์ฑํ๊ณ ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ ํ ๊ฐ์ฒด์ ๋งคํํ ์ง ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ํ์ ์ผ๋ก JdbcTemplate, Mybatis๊ฐ ์์ผ๋ฉฐ, DBMS์ ์ข
์์ ์ธ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
MyBatis๋ ์๋ฐ์์ SQL Mapper๋ฅผ ์ง์ํด์ฃผ๋ ํ๋ ์์ํฌ๋ก, SQL๋ฌธ์ ์ง์ ์์ฑํ์ฌ ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒดํํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ๋ฌธ์ xml๋ก ๋ถ๋ฆฌํ ์ ์์ผ๋ฉฐ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฒด์ ์ฟผ๋ฆฌ๋ฌธ์ ๋ชจ๋ ๊ด๋ฆฌํด์ผ ํ๋ฉฐ, DB CRUD ๋ฉ์๋๋ฅผ ์ง์ ๋ค ๊ตฌํํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค.
ORM์ด๋ Object์ DB ํ
์ด๋ธ์ ๋งคํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒดํํ๋ ๊ธฐ์ ์
๋๋ค.
๊ฐ๋ฐ์๊ฐ ๋ฐ๋ณต์ ์ธ SQL์ ์ง์ ์์ฑํ์ง ์์๋ ๋์ด ํธ๋ฆฌํ๋ฉฐ DBMS์ ์ข
์์ ์ด์ง ์์ต๋๋ค.
๋ํ์ ์ผ๋ก JPA๊ฐ ์์ผ๋ฉฐ, ๋ณต์กํ ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ JPQL์ ์ฌ์ฉํ๊ฑฐ๋ SQL Mapper๋ฅผ ํผ์ฉํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
JPA๋ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์
์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ์ํ ์ธํฐํ์ด์ค์
๋๋ค.
์๋ฐ ORM์ ๊ธฐ์ ํ์ค์ผ๋ก, CRUD ๋ฉ์๋๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ์ง์ ๋ง๋ค์ง ์์๋ ๋๋ฉฐ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ฟผ๋ฆฌ๊ฐ ์์ ๋์ด ๋ฐ์ดํฐ ์ ๋ณด๊ฐ ๋ฐ๋๋ฉด ๊ฐ์ฒด๋ง ์์ ํ๋ฉด ๋์ด ํธ๋ฆฌํ์ง๋ง, ๋ณต์กํ ์ฟผ๋ฆฌ ์์ฑ์ด ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
Spring Data JPA๋ Spring์์ ์ ๊ณตํ๋ ๋ชจ๋ ์ค ํ๋๋ก, ๊ฐ๋ฐ์๊ฐ JPA๋ฅผ ๋ ์ฝ๊ณ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋๋ค.
์ด๋ JPA๋ฅผ ํ ๋จ๊ณ ์ถ์ํ์ํจ Repository๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋๋ค.
์ฌ์ฉ์๊ฐ Repository ์ธํฐํ์ด์ค์ ์ ํด์ง ๊ท์น๋๋ก ๋ฉ์๋๋ฅผ ์
๋ ฅํ๋ฉด, Spring์ด ์์์ ํด๋น ๋ฉ์๋ ์ด๋ฆ์ ์ ํฉํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด์ Bean์ผ๋ก ๋ฑ๋กํด์ค๋๋ค.
Hibernate๋ JPA๋ผ๋ ๋ช
์ธ์ ๊ตฌํ์ฒด์
๋๋ค.
javax.persistence.EntityManager์ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก,
์ฝ๊ฒ ๋งํ๋ฉด, JPA์ Hibernate๋ ๋ง์น ์๋ฐ์ interface์ ํด๋น interface๋ฅผ ๊ตฌํํ class์ ๊ฐ์ ๊ด๊ณ์
๋๋ค.
์ ์ฌ์ง์ JPA์ Hibernate์ ์์ ๋ฐ ๊ตฌํ ๊ด๊ณ๋ฅผ ๋ํ๋ธ ๊ฒ์
๋๋ค.
JPA์ ํต์ฌ์ธ EntityManagerFactory, EntityManager, EntityTransaction์ Hibernate์์๋
๊ฐ๊ฐ SessionFactory, Session, Transaction์ผ๋ก ์์๋ฐ๊ณ ๊ฐ๊ฐ Impl๋ก ๊ตฌํํ๊ณ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
๐ก JPQL (Java Persistence Query Language)
JPA๋ SQL์ ์ถ์ํํ JPQL์ด๋ผ๋ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐ๋ผ์ ํ
์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌ ํ๋ ๊ฒ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
JPQL์ SQL์ ์ถ์ํํ๊ธฐ ๋๋ฌธ์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL์ ์์กดํ์ง ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ฐ๋ผ์ JPQL๊ณผ SQL์ ๊ฐ์ฅ ๋๋ ทํ ์ฐจ์ด์ ์ JPQL์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋ฉฐ, SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋ ๊ฒ์
๋๋ค.
String username = "java";
String jpql = "select m from Member m where m.username = :username";
List<Member> result = em.createQuery(query, Member.class).getResultList();
JPQL์ ๊ธฐ๋ณธ ๋ฌธ์์ด๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์ ์๋ฌ๋ฅผ ๋ฐ์ํ์ง ์๋๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
๋ํ ๋์ ์ผ๋ก ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์์ฑํ๋ ๋ฐ ํจ์จ์ ์ด์ง ๋ชปํฉ๋๋ค.
QueryDSL์ด๋ ์ ์ ํ์
์ ์ด์ฉํด์ SQL, JPQL์ ์ฝ๋๋ก ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ์คํ์์ค ๋น๋ API์
๋๋ค.
ํ์ด๋ฒ๋ค์ดํธ ์ฟผ๋ฆฌ ์ธ์ด(HQL: Hibernate Query Language)์ ์ฟผ๋ฆฌ๋ฅผ ํ์
์ ์์ ํ๊ฒ ์์ฑ ๋ฐ ๊ด๋ฆฌํด์ฃผ๋ ํ๋ ์์ํฌ์
๋๋ค.
JPQL์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ์ฌ ์ปดํ์ผ ์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ณต์กํ๊ณ ๋์ ์ธ ์ฟผ๋ฆฌ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
String username = "java";
List<Member> result = queryFactory
.select(member)
.from(member)
.where(usernameEq(username))
.fetch();