JPQL

์ด๋ฏธ์—ฐยท2024๋…„ 8์›” 13์ผ

[spring]

๋ชฉ๋ก ๋ณด๊ธฐ
6/7

๐Ÿ”Ž JPQL

JPQL(Java Persistence Query Language)์€ JPA(Java Persistence API)์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. SQL๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ Java ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿท๏ธ ์ฃผ์š” ํŠน์ง•

์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ ์ž‘์„ฑ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋…๋ฆฝ์ ์ธ ์ฟผ๋ฆฌ ์–ธ์–ด
JPA ๊ตฌํ˜„์ฒด๊ฐ€ JPQL์„ SQL๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰

๐Ÿ”Ž EntityManager๋ฅผ ์‚ฌ์šฉํ•œ JPQL ์ฟผ๋ฆฌ

EntityManager๋Š” JPA์˜ ํ•ต์‹ฌ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, JPQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@Test
public void testEmCreateQuery() {
    String qlString = "SELECT u FROM User u WHERE u.username = :username";

    User findUser = em.createQuery(qlString, User.class)
            .setParameter("username", "teasun")
            .getSingleResult();

    assertThat(findUser.getUsername()).isEqualTo("teasun");
}

๐Ÿท๏ธ ํŠน์ง•

๋ฌธ์ž์—ด๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑ
setParameter()๋ฅผ ํ†ตํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ
ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๋ถ€์กฑํ•˜๊ณ  ์˜คํƒ€์˜ ์œ„ํ—˜์ด ์žˆ์Œ

๐Ÿ”Ž @Query ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ JPQL

Spring Data JPA์—์„œ๋Š” @Query ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์— ์ง์ ‘ JPQL์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.username = :username")
    List<User> findByUsername(@Param("username") String username);

    @Query("SELECT u FROM User u WHERE u.username = ?1")
    List<User> findByUsernamePositional(String username);
}

๐Ÿท๏ธ ํŠน์ง•:

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ์ฟผ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์ •์˜
์ด๋ฆ„ ๊ธฐ๋ฐ˜ ๋˜๋Š” ์œ„์น˜ ๊ธฐ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์ง€์›
์ปดํŒŒ์ผ ์‹œ์ ์— ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๊ฐ€๋Šฅ

๐Ÿ”Ž JPQL์˜ ์žฅ๋‹จ์ 

๐Ÿท๏ธ ์žฅ์ 

๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฟผ๋ฆฌ ์ž‘์„ฑ ๊ฐ€๋Šฅ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋…๋ฆฝ์ ์ธ ์ฟผ๋ฆฌ ์ž‘์„ฑ
๋ณต์žกํ•œ ์กฐ์ธ, ์„œ๋ธŒ์ฟผ๋ฆฌ ๋“ฑ ๊ณ ๊ธ‰ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ ์ง€์›

๐Ÿท๏ธ ๋‹จ์ 

๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ๋กœ ์ธํ•œ ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ถ€์กฑ
๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ
IDE์˜ ์ž๋™ ์™„์„ฑ ์ง€์›์ด ์ œํ•œ์ 

๐Ÿ”Ž ์ฃผ์˜์‚ฌํ•ญ

์ƒ์ˆ˜ ์‚ฌ์šฉ: ๋ฐ˜๋ณต๋˜๋Š” JPQL ๋ฌธ์ž์—ด์€ ์ƒ์ˆ˜๋กœ ์ •์˜ํ•˜์—ฌ ๊ด€๋ฆฌ

public class JPQLConstants {
    public static final String FIND_BY_USERNAME = "SELECT u FROM User u WHERE u.username = :username";
}

๋„ค์ž„๋“œ ์ฟผ๋ฆฌ ํ™œ์šฉ: ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋ฆฌ๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์— @NamedQuery๋กœ ์ •์˜

@Entity
@NamedQuery(name = "User.findByUsername", query = "SELECT u FROM User u WHERE u.username = :username")
public class User { ... }

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉ: SQL ์ธ์ ์…˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํ•ญ์ƒ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉ

ํ…Œ์ŠคํŠธ ์ž‘์„ฑ: JPQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์˜ค๋ฅ˜ ์กฐ๊ธฐ ๋ฐœ๊ฒฌ

QueryDSL ๊ณ ๋ ค: ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํƒ€์ž… ์•ˆ์ „ํ•œ QueryDSL ์‚ฌ์šฉ ๊ฒ€ํ† 

0๊ฐœ์˜ ๋Œ“๊ธ€