[Spring Boot] Chapter.8 Spring Data JPA

๊ตฟ๊ฑฐ๋ฆฌยท2023๋…„ 6์›” 11์ผ
0

๐Ÿงก JPQL

  • JPA Query Language์˜ ์ค€๋ง
  • SQL์€ ํ…Œ์ด๋ธ”์ด๋‚˜ ์นผ๋Ÿผ์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  JPQL์€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ

๐Ÿ’› ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ƒ์„ฑ ์˜ˆ

// (๋ฆฌํ„ดํƒ€์ž…) + {์ฃผ์ œ + ์„œ์ˆ ์–ด(์†์„ฑ)} ๊ตฌ์กฐ์˜ ๋ฉ”์„œ๋“œ
List<Person> findByLastnameAndEmail(
		String lastName, String email
        );

๐Ÿ’š ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ฃผ์ œ ํ‚ค์›Œ๋“œ

  • find...By

  • read...By

  • get...By

  • query...By

  • search...By

  • stream...By

๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ‚ค์›Œ๋“œ. (...)์—๋Š” ๋„๋ฉ”์ธ์„ ํ‘œํ˜„ ๊ฐ€๋Šฅ. ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ๋Š” Collection์ด๋‚˜ Stream์— ์†ํ•œ ํ•˜์œ„ ํƒ€์ž…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • exists...By

    • ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ‚ค์›Œ๋“œ. booleanํƒ€์ž….
  • count...By

    • ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ๋ ˆ์ฝ”๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด.
  • delete...By, remove...By

    • ์‚ญ์ œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰. ๋ฆฌํ„ด ํƒ€์ž…์ด ์—†๊ฑฐ๋‚˜ ์‚ญ์ œํ•œ ํšŸ์ˆ˜๋ฅผ ๋ฆฌํ„ด.
  • First<number>..., Top<number>...

    • ์ปค๋ฆฌ๋ฅผ ํ†ตํ•ด ์กฐํšŒ๋œ ๊ฒฐ๊ด๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ํ‚ค์›Œ๋“œ.
    • ๋‘ ํ‚ค์›Œ๋“œ๋Š” ๋™์ผํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰, ์ฃผ์ œ์™€ By ์‚ฌ์ด์— ์œ„์น˜.
    • ํ•œ ๋ฒˆ์˜ ๋™์ž‘์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฑด์„ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ. ๋‹จ ๊ฑด์œผ๋กœ ์กฐํšŒํ•˜๋ ค๋ฉด <number>๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋จ.

๐Ÿ’™ JPQL์˜ ์กฐ๊ฑด์ž ํ‚ค์›Œ๋“œ

  • Is
    ๊ฐ’์˜ ์ผ์น˜๋ฅผ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์ž ํ‚ค์›Œ๋“œ. ์ƒ๋žต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ Equals์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰.

  • (Is)Not
    ๊ฐ’์˜ ๋ถˆ์ผ์น˜๋ฅผ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์ž ํ‚ค์›Œ๋“œ. Is๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๊ณ  Not ํ‚ค์›Œ๋“œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ.

  • (Is)Null, (Is)NotNull
    ๊ฐ’์ด null์ธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์กฐ๊ฑด์ž ํ‚ค์›Œ๋“œ.

  • (Is)True, (Is)False
    boolean ํƒ€์ž…์œผ๋กœ ์ง€์ •๋œ ์นผ๋Ÿผ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ํ‚ค์›Œ๋“œ.

  • And, Or
    ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ๋ฌถ์„ ๋•Œ ์‚ฌ์šฉ.

  • (Is)GreaterThan, (Is)LessThan, (Is)Between
    ์ˆซ์ž๋‚˜ datetime ์นผ๋Ÿผ์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ ๋น„๊ต ์—ฐ์‚ฐ์— ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์ž ํ‚ค์›Œ๋“œ. Greater, Less ํ‚ค์›Œ๋“œ๋Š” ๋น„๊ต ๋Œ€์ƒ์— ๋Œ€ํ•œ ์ดˆ๊ณผ/๋ฏธ๋งŒ์˜ ๊ฐœ๋…์œผ๋กœ ๋น„๊ต ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰, ๊ฒฝ๊ณ—๊ฐ’์„ ํฌํ•จํ•˜๋ ค๋ฉด Equal ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€.

  • (Is)StartingWith(==StartsWith), (Is)EndingWith(==EndsWith), (Is)Containg(==Contains), (Is)Like
    ์นผ๋Ÿผ๊ฐ’์—์„œ ์ผ๋ถ€ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ์กฐ๊ฑด์ž ํ‚ค์›Œ๋“œ. ์ฟผ๋ฆฌ๋ฌธ์˜ '%' ํ‚ค์›Œ๋“œ์™€ ๋™์ผํ•œ ์—ญํ• . StartingWith์€ ๋ฌธ์ž์—ด์˜ ์•ž, EndingWith์€ ๋ฌธ์ž์—ด์˜ ๋์— '%'๊ฐ€ ๋ฐฐ์น˜๋จ.

๐Ÿ’œ ์ •๋ ฌ ์ฒ˜๋ฆฌ

์ผ๋ฐ˜์ ์ธ ์ฟผ๋ฆฌ๋ฌธ์—์„œ ์ •๋ ฌ์€ ORDER BY๋กœ ์ฒ˜๋ฆฌ. ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋„ ์ •๋ ฌ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉํ•จ.

// Asc : ์˜ค๋ฆ„์ฐจ์ˆœ, Desc : ๋‚ด๋ฆผ์ฐจ์ˆœ
List<Product> findByNameOrderByNumberAsc(String name);
List<Product> findByNameOrderByNumberDesc(String name);

๐Ÿงก ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

Page์™€ Pageable์„ ์‚ฌ์šฉ.

// ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ
Page<Product> findByName(String name, Pageable pageable);
// ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
Page<Product> productPage = productRepository.findByName("ํŽœ", PageUequest.of(0, 2));

๐Ÿ’› @Query ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ
@Query ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ์ง์ ‘ JPQL ์ž‘์„ฑ ๊ฐ€๋Šฅ.

@Query("SELECT p FROM Product p WHERE p.name = :name")
List<Product> findByNameParam(@Param("name" String name);

๐Ÿ’š QueryDSL

์ •์  ํƒ€์ž…์„ ์ด์šฉํ•ด SQL๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ. QueryDSL์€ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.

  • QueryDSL์˜ ์žฅ์ 
    • IDE๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๊ณ ์ •๋œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ธฐ์— ๋™์ ์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ ๊ฐ€๋Šฅ.
    • ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฏ€๋กœ ๊ฐ€๋…์„ฑ ๋ฐ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ.
    • ๋„๋ฉ”์ธ ํƒ€์ž…๊ณผ ํ”„๋กœํผํ‹ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ.

JPA Auditing

๊ฐ ๋ฐ์ดํ„ฐ๋งˆ๋‹ค '๋ˆ„๊ฐ€' '์–ธ์ œ' ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ๊ณ  ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ๊ฐ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ. ๋Œ€ํ‘œ์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ƒ์„ฑ ์ฃผ์ฒด
  • ์ƒ์„ฑ ์ผ์ž
  • ๋ณ€๊ฒฝ ์ฃผ์ฒด
  • ๋ณ€๊ฒฝ ์ผ์ž

์ด๋Ÿฌํ•œ ํ•„๋“œ๋“ค์€ ๋งค๋ฒˆ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋–„๋งˆ๋‹ค ๊ฐ’์„ ์ฃผ์ž…ํ•ด์•ผ ํ•จ. ์ด๋Ÿฌํ•œ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ•ด์„œํ•˜๊ธฐ ์œ„ํ•ด Spring Data JPA์—์„œ๋Š” ๊ฐ’์„ ์ž๋™์œผ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต.

profile
๊ฐœ๋ฐœ์ž๋ฅผ ํ–ฅํ•ด

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