Skip to content

Latest commit

ย 

History

History
122 lines (83 loc) ยท 8.98 KB

File metadata and controls

122 lines (83 loc) ยท 8.98 KB

Spring Data JPA์—์„œ Query๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹.

์ฟผ๋ฆฌ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ค€๋‹ค๊ณ ?

์ฉŒ..์ฉ๋‹ค

Spring boot๋ฅผ ํ†ตํ•ด์„œ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ๋œ๋‹ค๋ฉด, DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…,์ฝ๊ธฐ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ž‘๋™์„ ํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ๋ฐฉ์‹์ด ํ•„์š”ํ•˜๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

์‹ค์ œ๋กœ ํ˜„์žฌ Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฝค ํŽธ๋ฆฌํ•œ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ ์ ์„ ์ž˜ ์ด์šฉํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ๊ฒฐ๊ตญ์—๋Š” Query๋ฅผ "์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํฌ์ธํŠธ๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์ข‹๋‹ค."

ํ•˜์ง€๋งŒ ํ•˜๋‚˜ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ์ 

๊น€์˜ํ•œ๋‹˜์˜ JPA๊ฐ•์ขŒ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์˜์ ์„ ์ค€๋‹ค.

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” JPA๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JPA๋ฅผ ๋จผ์ € ํ•™์Šตํ•œ ํ›„์— ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋ฅผ ํ•™์Šตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

JPA๋ฅผ ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฐฐ์šด๋’ค์— Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ์ถ”์ฒœํ•ด๋ด…๋‹ˆ๋‹ค.

Spring JPA Data Doc์—์„œ๋Š”?

https://docs.spring.io/spring-data/jpa/docs/2.3.3.RELEASE/reference/html/#jpa.repositories

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ‚ค์›Œ๋“œ๋งŒ ์žˆ์œผ๋ฉด, JPA๋ฅผ ํ†ตํ•ด์„œ SQL์ด ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Keyword Sample JPQL snippet
And findByLastnameAndFirstname โ€ฆ where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname โ€ฆ where x.lastname = ?1 or x.firstname = ?2
Is, Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals โ€ฆ where x.firstname = ?1
Between findByStartDateBetween โ€ฆ where x.startDate between ?1 and ?2
LessThan findByAgeLessThan โ€ฆ where x.age < ?1
LessThanEqual findByAgeLessThanEqual โ€ฆ where x.age <= ?1
GreaterThan findByAgeGreaterThan โ€ฆ where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual โ€ฆ where x.age >= ?1
After findByStartDateAfter โ€ฆ where x.startDate > ?1
Before findByStartDateBefore โ€ฆ where x.startDate < ?1
IsNull, Null findByAge(Is)Null โ€ฆ where x.age is null
IsNotNull, NotNull findByAge(Is)NotNull โ€ฆ where x.age not null
Like findByFirstnameLike โ€ฆ where x.firstname like ?1
NotLike findByFirstnameNotLike โ€ฆ where x.firstname not like ?1
StartingWith findByFirstnameStartingWith โ€ฆ where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith โ€ฆ where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining โ€ฆ where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc โ€ฆ where x.age = ?1 order by x.lastname desc
Not findByLastnameNot โ€ฆ where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) โ€ฆ where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> ages) โ€ฆ where x.age not in ?1
True findByActiveTrue() โ€ฆ where x.active = true
False findByActiveFalse() โ€ฆ where x.active = false
IgnoreCase findByFirstnameIgnoreCase โ€ฆ where UPPER(x.firstame) = UPPER(?1)

์ด๋Ÿฐ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด์„œ ์•„๋ž˜์ชฝ๊ณผ ๊ฐ™์ด ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์“ฐ๋Š” ๋ฐฉ์‹์„ ํ†ตํ•ด์„œ ์„œ๋น„์Šค๋‹จ์—์„œ ๊ทธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด, ์Šค์Šค๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

KakaoTalk_Photo_2020-09-06-10-19-41

@Repository์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด,

KakaoTalk_Photo_2020-09-06-10-19-51

@Service์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.

Query๋ฅผ ์ง์ ‘ ์จ์„œ ์ง์ ‘ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

๋ฌผ๋ก  Spring Data JPA๋ฅผ ๋ฉ”์†Œ๋“œ ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ, ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ๊ตฌ์ฒด์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์‚ฌ์‹ค ์ €๋Ÿฐ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ถฉ๋ถ„ํžˆ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ง๊ด€์ ์ธ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

  1. ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ด ์žˆ์–ด์•ผํ•œ๋‹ค.
@Query("SELECT u FROM User u WHERE u.status = 1") 
Collection<User> findAllActiveUsers();

From table ๋ณ„์นญ์„ Select๋ฌธ์•ˆ์— ๋„ฃ์–ด์•ผํ•œ๋‹ค. ์•ˆ๊ทธ๋Ÿฌ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ์ฐ์–ด๋‚ด๋ฉด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์€๊ทผ ๊ท€์ฐฎ๋‹ค.

  1. DB์—์„œ ์“ฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹
@Query(
  value = "SELECT * FROM USERS u WHERE u.status = 1", 
  nativeQuery = true)
Collection<User> findAllActiveUsersNative();

@Query ์˜ต์…˜์—์„œ nativeQuery = true๋ฅผ ์ค˜์•ผ์ง€๋งŒ... DB์—์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

JPA์—์„œ ๋ฉ”์†Œ๋“œ Parameter๋ฅผ ํ†ตํ•ด์„œ @Query์— ๊ทธ parameter๊ฐ€ ๋„ฃ์–ด์ง€๋Š” ๋ฐฉ์‹

์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•œ ๊ตฌ์ฒด์  ์กฐ๊ฑด์„ ์ค˜์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ž.

  1. ?๋ฅผ ํ†ตํ•œ ๊ฒฝ์šฐ -> parameter์˜ ์œ„์น˜์— ๋”ฐ๋ฅธ ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

    ?1 -> parameter ์ฒซ๋ฒˆ์งธ ์ž๋ฆฌ์— ์žˆ๋Š”๊ฑธ ๋„ฃ๊ฒ ๋‹ค๋Š” ๋œป.

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
}
  1. :name -> ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ

    public interface UserRepository extends JpaRepository<User, Long> {
    
      @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
      User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                     @Param("firstname") String firstname);
    
      @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
      User findByLastnameOrFirstname(String lastname, String firstname); //์ด๋ ‡๊ฒŒ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
    }

    ๋ฌผ๋ก  @Param์œผ๋กœ ์ง€์ •ํ•ด์ค˜๋„ ๋˜์ง€๋งŒ, Spring 4๋ฒ„์ ผ, java8 ๊ธฐ์ค€์œผ๋กœ @Param์ฃผ์„ ์—†์ด๋„ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„ ๊ธฐ์ค€์œผ๋กœ ์•Œ์•„์„œ ์ž˜ ์ฐพ์•„์ค€๋‹ค.

๋ฌผ๋ก  ์ด๊ฒฝ์šฐ ๋ง๊ณ ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ผ€์ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. SPEL์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๊ธฐ๋„ํ•˜๊ณ  Sortingํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋˜๊ฐ€ ์ง„์งœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ๊ฑด

https://docs.spring.io/spring-data/jpa/docs/2.3.3.RELEASE/reference/html/#jpa.repositories

๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์„ ๋“ฏํ•ฉ๋‹ˆ๋‹ค.