Search

Criteria API

Criteria API

Criteria API๋Š” JPA์—์„œ ํƒ€์ž… ์•ˆ์ „ํ•œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
SQL์ด๋‚˜ JPQL๊ณผ ๋‹ฌ๋ฆฌ, ์ž๋ฐ” ์ฝ”๋“œ๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ๋ฐฉ์‹์œผ๋กœ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Criteria API ์ •์˜

Criteria API๋Š” JPQL์„ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” API๋กœ, javax.persistence.criteria ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠน์ง•
โ€ข
JPQL๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉด์„œ ์ปดํŒŒ์ผ ์‹œ์ ์— ์˜ค๋ฅ˜๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅ
โ€ข
๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ๋ฐฉ์‹์œผ๋กœ ๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ
โ€ข
SQL Injection ๋ฐฉ์ง€ ํšจ๊ณผ
โ€ข
์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์Œ

์ฃผ์š” ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ

ํด๋ž˜์Šค
์„ค๋ช…
CriteriaBuilder
์ฟผ๋ฆฌ ์ƒ์„ฑ์— ํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ œ๊ณต (์—ฐ์‚ฐ, ๋น„๊ต, ๋…ผ๋ฆฌ ์—ฐ์‚ฐ ๋“ฑ)
CriteriaQuery<T>
์ฟผ๋ฆฌ ๊ฐ์ฒด, SELECT, WHERE, ORDER BY ๋“ฑ์„ ์„ค์ •
Root<T>
์กฐํšŒ ๋Œ€์ƒ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ง€์ •
Predicate
WHERE ์ ˆ ์กฐ๊ฑด์„ ํ‘œํ˜„
Join<T, X>
์—”ํ„ฐํ‹ฐ ๊ฐ„์˜ JOIN์„ ์ˆ˜ํ–‰

Criteria API ํ•ต์‹ฌ ์‚ฌ์šฉ๋ฒ•

Criteria API ๊ธฐ๋ณธ ๊ตฌ์กฐ

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Users> query = cb.createQuery(Users.class); Root<Users> root = query.from(Users.class); query.select(root); TypedQuery<Users> typedQuery = entityManager.createQuery(query); List<Users> users = typedQuery.getResultList();
Java
๋ณต์‚ฌ
CriteriaBuilder โ†’ CriteriaQuery โ†’ Root โ†’ ์ฟผ๋ฆฌ ์‹คํ–‰

WHERE ์กฐ๊ฑด ์ถ”๊ฐ€

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Users> query = cb.createQuery(Users.class); Root<Users> root = query.from(Users.class); Predicate usernameEquals = cb.equal(root.get("username"), "John"); query.select(root).where(usernameEquals); List<Users> result = entityManager.createQuery(query).getResultList();
Java
๋ณต์‚ฌ
cb.equal()์„ ์‚ฌ์šฉํ•˜์—ฌ WHERE username = 'John' ์กฐ๊ฑด ์ถ”๊ฐ€

ORDER BY ์ •๋ ฌ

query.orderBy(cb.desc(root.get("id"))); // ID ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
Java
๋ณต์‚ฌ

COUNT ์‚ฌ์šฉ

CriteriaQuery<Long> countQuery = cb.createQuery(Long.class); countQuery.select(cb.count(countQuery.from(Users.class))); Long count = entityManager.createQuery(countQuery).getSingleResult();
Java
๋ณต์‚ฌ

JOIN ํ™œ์šฉ

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Boards> query = cb.createQuery(Boards.class); Root<Boards> root = query.from(Boards.class); Join<Boards, Users> userJoin = root.join("user"); // Users ์—”ํ„ฐํ‹ฐ์™€ JOIN Predicate userIdPredicate = cb.equal(userJoin.get("id"), 1L); query.select(root).where(userIdPredicate); List<Boards> boards = entityManager.createQuery(query).getResultList();
Java
๋ณต์‚ฌ
root.join("user") โ†’ Users ์—”ํ„ฐํ‹ฐ์™€ JOIN ์ˆ˜ํ–‰

Criteria API ์˜ˆ์ œ ์ฝ”๋“œ

์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ ์กฐํšŒ

public List<Users> findUsersByName(String username) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Users> query = cb.createQuery(Users.class); Root<Users> root = query.from(Users.class); query.select(root) .where(cb.equal(root.get("username"), username)); return entityManager.createQuery(query).getResultList(); }
Java
๋ณต์‚ฌ

ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ

public List<Boards> findBoardsByUser(Long userId) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Boards> query = cb.createQuery(Boards.class); Root<Boards> root = query.from(Boards.class); Join<Boards, Users> userJoin = root.join("user"); query.select(root) .where(cb.equal(userJoin.get("id"), userId)) .orderBy(cb.desc(root.get("createdAt"))); return entityManager.createQuery(query).getResultList(); }
Java
๋ณต์‚ฌ

ํŠน์ • ์‚ฌ์šฉ์ž์˜ ํŒŒ์ผ ๊ฐœ์ˆ˜ ์กฐํšŒ

public Long countFilesByUser(Long userId) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Long> query = cb.createQuery(Long.class); Root<Files> root = query.from(Files.class); Join<Files, Users> userJoin = root.join("user"); query.select(cb.count(root)) .where(cb.equal(userJoin.get("id"), userId)); return entityManager.createQuery(query).getSingleResult(); }
Java
๋ณต์‚ฌ

Criteria API ์š”์•ฝ

1.
JPQL๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅ
2.
์ปดํŒŒ์ผ ์‹œ์  ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๊ฐ€๋Šฅ โ†’ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋›ฐ์–ด๋‚จ
3.
๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋…์„ฑ์ด ๋†’๊ณ , ๋™์  ์ฟผ๋ฆฌ์— ์ ํ•ฉ
4.
SQL Injection ๋ฐฉ์ง€ ํšจ๊ณผ
5.
๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ์—์„œ๋„ ๊น”๋”ํ•œ ์ฝ”๋“œ ์œ ์ง€ ๊ฐ€๋Šฅ
Criteria API๋ฅผ ํ™œ์šฉํ•ด ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”!