Criteria API
Criteria API๋ JPA์์ ํ์
์์ ํ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋๋ก ์ง์ํ๋ ๊ธฐ๋ฅ์
๋๋ค.
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
๋ณต์ฌ
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
๋ณต์ฌ
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
๋ณต์ฌ
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.
๋ณต์กํ ๋์ ์ฟผ๋ฆฌ์์๋ ๊น๋ํ ์ฝ๋ ์ ์ง ๊ฐ๋ฅ