JPQL (Java Persistence Query Language)
JPQL์ JPA(Java Persistence API)์์ ์ ๊ณตํ๋ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ก, SQL๊ณผ ์ ์ฌํ์ง๋ง ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
JPQL ์ ์
๊ฐ์ฒด ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ SQL๊ณผ ์ ์ฌํ ์ฟผ๋ฆฌ ์ธ์ด๋ก, SQL์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋์์ผ๋ก ํ๋ ๋ฐ๋ฉด, JPQL์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
โข
SQL๊ณผ ์ ์ฌํ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ง๋ง ํ
์ด๋ธ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์คํ
โข
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋
๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
โข
JPQL์ SQL๋ณด๋ค ๊ฐ์ฒด์งํฅ์ ์ด๋ฉฐ, ์๋์ผ๋ก SQL๋ก ๋ณํ๋์ด ์คํ๋จ
JPQL ์ฃผ์ ์ด๋
ธํ
์ด์
์ด๋
ธํ
์ด์
| ์ค๋ช
|
@Query("JPQL_QUERY") | Spring Data JPA์์ JPQL์ ์คํํ ๋ ์ฌ์ฉ |
@NamedQuery
(name = "queryName", query = "JPQL_QUERY") | ์ ์ JPQL ์ฟผ๋ฆฌ ์ง์ |
@Modifying | INSERT, UPDATE, DELETE ๊ฐ์ ๋ณ๊ฒฝ ์ฟผ๋ฆฌ ์คํ ์ ์ฌ์ฉ |
@Transactional | ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ ํธ๋์ญ์
์ ๋ณด์ฅ |
JPQL ํต์ฌ ์ฌ์ฉ๋ฒ
๊ธฐ๋ณธ ๋ฌธ๋ฒ
SELECT e FROM EntityName e WHERE e.field = :value
SQL
๋ณต์ฌ
โข
EntityName โ ์ํฐํฐ ํด๋์ค๋ช
(SQL๊ณผ ๋ค๋ฅด๊ฒ ํ
์ด๋ธ๋ช
์ด ์๋!)
โข
e.field โ ์ํฐํฐ์ ํ๋๋ช
์ ์ฌ์ฉ
โข
:value โ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ
์ฃผ์ JPQL ๋ฌธ๋ฒ๊ณผ SQL ๋น๊ต
๊ธฐ๋ฅ | JPQL | SQL |
์ ์ฒด ์กฐํ | SELECT u FROM Users u | SELECT * FROM users |
์กฐ๊ฑด ๊ฒ์ | SELECT u FROM Users u
WHERE u.username = :name | SELECT * FROM users
WHERE username = ? |
์ ๋ ฌ | SELECT u FROM Users u
ORDER BY u.id DESC | SELECT * FROM users
ORDER BY id DESC |
COUNT | SELECT COUNT(u) FROM Users u | SELECT COUNT(*) FROM users |
JOIN | SELECT b FROM Boards b
JOIN b.user u
WHERE u.id = :userId | SELECT * FROM boards b
INNER JOIN users u ON b.user_id = u.id
WHERE u.id = ? |
JPQL ์์ ์ฝ๋
๊ธฐ๋ณธ ์กฐํ (SELECT)
@Query("SELECT u FROM Users u WHERE u.username = :username")
Users findByUsername(@Param("username") String username);
Java
๋ณต์ฌ
์ ๋ ฌ ๋ฐ ์กฐ๊ฑด ๊ฒ์
@Query("SELECT b FROM Boards b WHERE b.user.id = :userId ORDER BY b.createdAt DESC")
List<Boards> findBoardsByUser(@Param("userId") Long userId);
Java
๋ณต์ฌ
COUNT ์ฌ์ฉ
@Query("SELECT COUNT(b) FROM Boards b WHERE b.user.id = :userId")
long countBoardsByUser(@Param("userId") Long userId);
Java
๋ณต์ฌ
JOIN ํ์ฉ
@Query("SELECT f FROM Files f JOIN f.board b WHERE b.id = :boardId")
List<Files> findFilesByBoard(@Param("boardId") Long boardId);
Java
๋ณต์ฌ
INSERT, UPDATE, DELETE (DML)
DML(๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฟผ๋ฆฌ)์ @Modifying + @Transactional ํ์!
๊ฒ์๊ธ ์ ๋ชฉ ์
๋ฐ์ดํธ
@Modifying
@Transactional
@Query("UPDATE Boards b SET b.title = :title WHERE b.id = :boardId")
int updateBoardTitle(@Param("boardId") Long boardId, @Param("title") String title);
Java
๋ณต์ฌ
ํน์ ๊ฒ์๊ธ ์ญ์
@Modifying
@Transactional
@Query("DELETE FROM Boards b WHERE b.id = :boardId")
void deleteBoard(@Param("boardId") Long boardId);
Java
๋ณต์ฌ
JPQL ์์ฝ
1.
SQL๊ณผ ์ ์ฌํ์ง๋ง ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์คํ
2.
์๋์ผ๋ก SQL๋ก ๋ณํ๋์ด ์คํ๋๋ฏ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋
๋ฆฝ์
3.
JOIN, GROUP BY, ORDER BY ๋ฑ์ SQL ๊ธฐ๋ฅ์ ์ง์
4.
๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฟผ๋ฆฌ(DML)๋ @Modifying๊ณผ @Transactional์ ํจ๊ป ์ฌ์ฉํด์ผ ํจ
์ด์ JPQL์ ํ์ฉํด ๋ ๊ฐ์ฒด์งํฅ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํด๋ณด์ธ์! 