์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฑํ ํด์ฃผ์ธ์
OOPQuery
JPA๋ ๋ค์ํ ์ฟผ๋ฆฌ ๋ฐฉ๋ฒ์ ์ง์
- JPQL
- JPA Criteria
- QueryDSL
- ๋ค์ดํฐ๋ธ SQL
- JDBC API ์ง์ ์ฌ์ฉ, MyBatis, SpringJdbcTemplate ํจ๊ป ์ฌ์ฉ
JPQL
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ
- ๋ฌธ์ ๋ ๊ฒ์ ์ฟผ๋ฆฌ
- ๊ฒ์์ ํ ๋๋ ํ
์ด๋ธ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์
- ๋ชจ๋ DB ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํด์ ๊ฒ์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ
- ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ํ ๋ฐ์ดํฐ๋ง DB์์ ๋ถ๋ฌ์ค๋ ค๋ฉด ๊ฒฐ๊ตญ ๊ฒ์์กฐ๊ฑด์ด ํฌํจ๋ SQL์ด ํ์
- JPA๋ SQL์ ์ถ์ํํ JPQL์ด๋ผ๋ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด ์ ๊ณต
- SQL๊ณผ ๋ฌธ๋ฒ ์ ์ฌ, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN ์ง์
- JPQL์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ
- SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌ
- ํ
์ด๋ธ์ด ์๋ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์ํ๋ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ
- SQL์ ์ถ์ํํด์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL์ ์์กดX
- JPQL์ ํ๋ง๋๋ก ์ ์ํ๋ฉด ๊ฐ์ฒด ์งํฅ SQL
1
2
3
4
|
//๊ฒ์
String jpql = "select m FROM Member m where m.name like '%hello%'";
List<Member> result = em.createQuery(jpql, Member.class).getResultList();
|
JPQL ๋ฌธ๋ฒ
- select m from Member m where m.age > 18
- ์ํฐํฐ์ ์์ฑ์ ๋์๋ฌธ์ ๊ตฌ๋ถ(Member, username)
- JPQL ํค์๋๋ ๋์๋ฌธ์ ๊ตฌ๋ถ ์ํจ(SELECT, FROM, where)
- ์ํฐํฐ ์ด๋ฆ์ ์ฌ์ฉ, ํ
์ด๋ธ ์ด๋ฆ์ด ์๋(Member)
- ๋ณ์นญ์ ํ์(m)
๊ฒฐ๊ณผ ์กฐํ API
- query.getResultList() : ๊ฒฐ๊ณผ๊ฐ ํ๋ ์ด์, ๋ฆฌ์คํธ ๋ฐํ
- query.getSingleResult() : ๊ฒฐ๊ณผ๊ฐ ์ ํํ ํ๋, ๋จ์ผ ๊ฐ์ฒด ๋ฐํ(์ ํํ ํ๋๊ฐ ์๋๋ฉด ์์ธ ๋ฐ์)
ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ - ์ด๋ฆ ๊ธฐ์ค, ์์น ๊ธฐ์ค
1
2
3
4
5
|
SELECT m FROM Member m where m.username=:username
query.setParameter("username",usernameParam);
SELECT m FROM Member m where m.username=?1
query.setParameter(1,usernameParam);
|
ํ๋ก์ ์
- SELECT m FROM Member m -> ์ํฐํฐ ํ๋ก์ ์
- SELECT m.team FROM Member m -> ์ํฐํฐ ํ๋ก์ ์
- SELECT username,age FROM Member m -> ๋จ์ ๊ฐ ํ๋ก์ ์
- new ๋ช
๋ น์ด : ๋จ์ ๊ฐ์ DTO๋ก ๋ฐ๋ก ์กฐํ
SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
- DISTINCT๋ ์ค๋ณต ์ ๊ฑฐ
ํ์ด์ง API
- JPA๋ ํ์ด์ง์ ๋ค์ ๋ API๋ก ์ถ์ํ
- setFirstResult(int startPosition) : ์กฐํ ์์ ์์น(0๋ถํฐ ์์)
- setMaxResults(int maxResult) : ์กฐํํ ๋ฐ์ดํฐ ์
์กฐ์ธ
- ๋ด๋ถ ์กฐ์ธ : SELECT m FROM Member m [INNER] JOIN m.team t
- ์ธ๋ถ ์กฐ์ธ : SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
- ์ธํ ์กฐ์ธ : SELECT count(m) from Member m, Team t where m.username = t.name
- ์ฐ๊ด๊ด๊ณ ์์ด๋ ์กฐ์ธํ ์ ์๋ ๋ง ์กฐ์ธ
ํ์น ์กฐ์ธ
- ์ํฐํฐ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ๋ฒ์ ์กฐํํ๋ ๋ฐฉ๋ฒ
- ๋ณ์นญ์ ์ฌ์ฉํ ์ ์๋ค.
- N+1๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ชจ๋ ์กฐ์ธ์ ๋ค Lazy ๋ก ๋ฐ๋ฅด๊ณ ํน์ ๋ถ๋ถ๋ง ํ์น ์กฐ์ธ์ ์ฌ์ฉํ๋๊ฒ ๋ฒ ์คํธ๋ค.
- JPQL : select m from Member m join fetch m.team
- ๋ง์น eager๋ฅผ ๊ฑด๊ฒ์ฒ๋ผ ํ๋ฒ์ ๊ฐ์ ธ์จ๋ค.
- SQL : SELECT M., T. FROM MEBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID
๊ธ์ด์ด
brinst
Backend Developer