Search

JPQL

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์„ ํ™œ์šฉํ•ด ๋” ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณด์„ธ์š”!