2025. 10. 20. 14:56ใJava/JPA
๐งฉ JPA ์ค์ต โค — JPQL (Java Persistence Query Language)
์ด๋ฒ ์ค์ต์์๋ JPQL์ ๊ธฐ๋ณธ ๊ฐ๋
๊ณผ Typed Query, ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ํ์ตํ๋ค.
JPQL์ SQL์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ง์ํ๋ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ค.
์ฆ, “ํ
์ด๋ธ๋ช
”์ด ์๋ “์ํฐํฐ ํด๋์ค๋ช
(Book)”๊ณผ “์ปฌ๋ผ๋ช
”์ด ์๋ “ํ๋๋ช
(bookname, price)”์ผ๋ก ์์ฑ๋๋ค.

โถ ํ๋ก์ ํธ ํด๋ ๊ตฌ์กฐ
JPABasic_JPQL
โโ src/main/java/
โ โโ entity/
โ โ โโ Book.java
โ โโ Test.java
โ
โโ src/main/resources/
โ โโ META-INF/
โ โโ persistence.xml
โ
โโ pom.xml
โก๏ธ ์์ JPA + Hibernate ํ๊ฒฝ์์ ์์ฑ๋์์ผ๋ฉฐ, ๋ณ๋์ Spring ์ค์ ์์ด EntityManagerFactory๋ฅผ ์ง์ ์์ฑํ๋ค.
โท persistence.xml ์ค์
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="3.0"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence
https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
<persistence-unit name="my-pu">
<class>entity.Book</class>
<properties>
<property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpql_basic"/>
<property name="jakarta.persistence.jdbc.user" value="root"/>
<property name="jakarta.persistence.jdbc.password" value="1234"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
๐ hbm2ddl.auto = update → ํ
์ด๋ธ์ด ์์ผ๋ฉด ์๋ ์์ฑ, ํ๋ ๋ณ๊ฒฝ ์ alter
๐ show_sql = true → ์คํ๋๋ JPQL → SQL ๋ณํ ๋ก๊ทธ ์ถ๋ ฅ
โธ ์ํฐํฐ ํด๋์ค — Book.java
package entity;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name="book")
public class Book {
@Id
private int bookid;
private String bookname;
private String publisher;
private int price;
public int getBookid() { return bookid; }
public void setBookid(int bookid) { this.bookid = bookid; }
public String getBookname() { return bookname; }
public void setBookname(String bookname) { this.bookname = bookname; }
public String getPublisher() { return publisher; }
public void setPublisher(String publisher) { this.publisher = publisher; }
public int getPrice() { return price; }
public void setPrice(int price) { this.price = price; }
@Override
public String toString() {
return "Book [bookid=" + bookid + ", bookname=" + bookname +
", publisher=" + publisher + ", price=" + price + "]";
}
}
โ
Book ์ํฐํฐ๋ ํ
์ด๋ธ “book”๊ณผ ๋งคํ๋๋ฉฐ, ๊ฐ ํ๋๋ ์ปฌ๋ผ(bookid, bookname, publisher, price)์ ๋งคํ๋๋ค.
์ด์ JPQL์ ์ด Book ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์กฐํ๋ฅผ ์ํํ๋ค.
โน JPQL ๊ธฐ๋ณธ ์ฟผ๋ฆฌ — ์ ์ฒด ์กฐํ
import jakarta.persistence.*;
import java.util.List;
public class Test {
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("my-pu");
EntityManager em = emf.createEntityManager();
// Typed Query
String jpql = "select b from Book b"; // ํ
์ด๋ธ์ด ์๋ Book ์ํฐํฐ ๊ธฐ์ค
TypedQuery<Book> query = em.createQuery(jpql, Book.class);
List<Book> bookList = query.getResultList();
for (Book book : bookList) {
System.out.println(book);
}
em.close();
}
}
โ ์คํ ๊ฒฐ๊ณผ (์ฝ์)
Book [bookid=1, bookname=์ถ๊ตฌ์ ์ญ์ฌ, publisher=๊ตฟ์คํฌ์ธ , price=7000]
Book [bookid=2, bookname=์ถ๊ตฌ๋ฅผ ์๋ ์ฌ์, publisher=๋๋ฌด์, price=13000]
Book [bookid=3, bookname=์ถ๊ตฌ์ ์ดํด, publisher=๋ํ๋ฏธ๋์ด, price=22000]
Book [bookid=4, bookname=๊ณจํ ๋ฐ์ด๋ธ, publisher=๋ํ๋ฏธ๋์ด, price=35000]
Book [bookid=5, bookname=ํผ๊ฒจ ๊ต๋ณธ, publisher=๊ตฟ์คํฌ์ธ , price=8000]
...
- JPQL์ select b from Book b๋ SQL๋ก ๋ณํ ์ select * from book ํํ๋ก ์คํ๋๋ค.
- Book์ ํด๋์ค๋ช
์ด๋ฉฐ, b๋ ์ํฐํฐ์ ๋ณ์นญ(alias)์ด๋ค.
โบ JPQL + ์์น ํ๋ผ๋ฏธํฐ (Positional Parameter)
String jpql = "select b from Book b where b.price > ?1";
TypedQuery<Book> query = em.createQuery(jpql, Book.class);
query.setParameter(1, 15000); // ?1 → 15000์ผ๋ก ์นํ
List<Book> bookList = query.getResultList();
for (Book book : bookList) {
System.out.println(book);
}
โ ์คํ SQL
Hibernate: select b1_0.bookid,b1_0.bookname,b1_0.price,b1_0.publisher
from Book b1_0 where b1_0.price>?
โ ๊ฒฐ๊ณผ (price > 15000)
Book [bookid=3, bookname=์ถ๊ตฌ์ ์ดํด, publisher=๋ํ๋ฏธ๋์ด, price=22000]
Book [bookid=4, bookname=๊ณจํ ๋ฐ์ด๋ธ, publisher=๋ํ๋ฏธ๋์ด, price=35000]
Book [bookid=7, bookname=์ผ๊ตฌ์ ์ถ์ต, publisher=์ด์๋ฏธ๋์ด, price=20000]
- ?1์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฏธํ๋ค.
- setParameter(1, 15000) ํํ๋ก ๊ฐ์ ๋ฐ์ธ๋ฉํ๋ค.
- SQL Injection ์ํ ์์ด ์์ ํ๊ฒ ์กฐ๊ฑด ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
โป JPQL + ์ด๋ฆ ํ๋ผ๋ฏธํฐ (Named Parameter)
String jpql = "select b from Book b where b.price > :price";
TypedQuery<Book> query = em.createQuery(jpql, Book.class);
query.setParameter("price", 15000);
List<Book> bookList = query.getResultList();
for (Book book : bookList) {
System.out.println(book);
}
โ ์คํ ๊ฒฐ๊ณผ
Hibernate: select b1_0.bookid,b1_0.bookname,b1_0.price,b1_0.publisher
from Book b1_0 where b1_0.price>?
Book [bookid=3, bookname=์ถ๊ตฌ์ ์ดํด, publisher=๋ํ๋ฏธ๋์ด, price=22000]
Book [bookid=4, bookname=๊ณจํ ๋ฐ์ด๋ธ, publisher=๋ํ๋ฏธ๋์ด, price=35000]
Book [bookid=7, bookname=์ผ๊ตฌ์ ์ถ์ต, publisher=์ด์๋ฏธ๋์ด, price=20000]
- :price ํํ๋ก ์ ์ธ ํ, setParameter("price", 15000)๋ก ๊ฐ ์ ๋ฌ.
- ์์น ํ๋ผ๋ฏธํฐ๋ณด๋ค ๊ฐ๋
์ฑ์ด ์ข๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
โผ JPQL vs SQL ๋น๊ต
| ๊ตฌ๋ถ | JPQL | SQL |
|---|---|---|
| ๋์ | ์ํฐํฐ ํด๋์ค | ํ ์ด๋ธ |
| ํ๋ ์ฐธ์กฐ | ์ํฐํฐ์ ํ๋๋ช | ์ปฌ๋ผ๋ช |
| ์์ | select b from Book b where b.price > 10000 |
select * from book where price > 10000 |
| ๊ฒฐ๊ณผ | Book ๊ฐ์ฒด ๋ฆฌ์คํธ | ResultSet (row ๊ธฐ๋ฐ) |
โฝ ํต์ฌ ์์ฝ
- JPQL์ SQL์ด ์๋๋ผ ์ํฐํฐ ๊ฐ์ฒด ์ค์ฌ์ ์ฟผ๋ฆฌ ์ธ์ด์ด๋ค.
- TypedQuery<T>๋ฅผ ์ฌ์ฉํด ํ์ ์์ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์๋ค.
- setParameter()๋ก ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ํตํด ์กฐ๊ฑด์ ๋์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
- ๊ฒฐ๊ณผ๋ ์ํฐํฐ ๊ฐ์ฒด(Book)๋ก ๋ฐํ๋์ด, ์๋ฐ ์ปฌ๋ ์ (List)์ผ๋ก ๋ค๋ฃฐ ์ ์๋ค.
โพ ์ค์ต ์ ๋ฆฌ
| ์ข ๋ฅ | ์์ | ํน์ง |
|---|---|---|
| ๊ธฐ๋ณธ ์กฐํ | select b from Book b |
์ํฐํฐ ์ ์ฒด ์กฐํ |
| ์์น ํ๋ผ๋ฏธํฐ | ?1, ?2 |
์์ ๊ธฐ๋ฐ ๋ฐ์ธ๋ฉ |
| ์ด๋ฆ ํ๋ผ๋ฏธํฐ | :price |
์ด๋ฆ ๊ธฐ๋ฐ ๋ฐ์ธ๋ฉ (๊ฐ๋ ์ฑ↑) |
| ๊ฒฐ๊ณผ | List<Book> |
์ํฐํฐ ๊ฐ์ฒด ๋ฆฌ์คํธ ๋ฐํ |
โฟ ํ ์ค ์์ฝ
JPQL์ “ํ
์ด๋ธ ์ค์ฌ SQL”์ด ์๋๋ผ “์ํฐํฐ ์ค์ฌ ์ฟผ๋ฆฌ ์ธ์ด”์ด๋ค.
SQL์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค๋ฉด, JPQL์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค.