์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•ด์ฃผ์„ธ์š”

OOPQuery

 ·  โ˜• 2 min read · ๐Ÿ‘€... ์กฐํšŒ์ˆ˜

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
๊ธ€์“ด์ด
brinst
Backend Developer

๋ชฉ์ฐจ