Spring boot๋ฅผ ํตํด์ ๊ฐ๋ฐ์ ํ๊ฒ๋๋ค๋ฉด, DB์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ,์ฝ๊ธฐ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์๋์ ํ๊ธฐ์ํด์๋ ๋ฐฉ์์ด ํ์ํ๋ค. ์ฟผ๋ฆฌ๋ฅผ ์๋์ํค๋ ๋ฐฉ์์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์์ด ์กด์ฌํ๋ค.
์ค์ ๋ก ํ์ฌ Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฝค ํธ๋ฆฌํ์ ์ด ์๊ธฐ ๋๋ฌธ์, ๊ทธ ์ ์ ์ ์ด์ฉํ๊ธฐ์ํด์๋ ๊ฒฐ๊ตญ์๋ Query๋ฅผ "์๋ ์์ฑํ ์ ์๋ ํฌ์ธํธ๋ฅผ ์๋ ๊ฒ์ด ์ข๋ค."
๊น์ํ๋์ JPA๊ฐ์ข์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์์ ์ ์ค๋ค.
์คํ๋ง ๋ฐ์ดํฐ JPA๋ JPA๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋๋ก ๋์์ฃผ๋ ๊ธฐ์ ์ ๋๋ค. ๋ฐ๋ผ์ JPA๋ฅผ ๋จผ์ ํ์ตํ ํ์ ์คํ๋ง ๋ฐ์ดํฐ JPA๋ฅผ ํ์ตํด์ผ ํฉ๋๋ค.
JPA๋ฅผ ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ฐฐ์ด๋ค์ Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฑธ ์ถ์ฒํด๋ด ๋๋ค.
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) |
์ด๋ฐ ์์๋ฅผ ํตํด์ ์๋์ชฝ๊ณผ ๊ฐ์ด ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ฐ๋ ๋ฐฉ์์ ํตํด์ ์๋น์ค๋จ์์ ๊ทธ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด, ์ค์ค๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์๋ํ๊ฒ ๋๋ค.
@Repository์์ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ๋๋ฉด,
@Service์์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
๋ฌผ๋ก Spring Data JPA๋ฅผ ๋ฉ์๋ ํค์๋๋ฅผ ํตํด์, ์ฟผ๋ฆฌ๋ฅผ ์ง์ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๊ตฌ์ฒด์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ผํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์ฌ์ค ์ ๋ฐ ํค์๋๋ฅผ ๊ฐ์ง๊ณ ์ถฉ๋ถํ ๋ง๋๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์ง๊ด์ ์ธ ๊ฒฝ์ฐ๋ ์๋ค.
- ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ฐ๋ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ด ์์ด์ผํ๋ค.
@Query("SELECT u FROM User u WHERE u.status = 1")
Collection<User> findAllActiveUsers();From table ๋ณ์นญ์ Select๋ฌธ์์ ๋ฃ์ด์ผํ๋ค. ์๊ทธ๋ฌ๋ฉด ์ค๋ฅ๋ฅผ ๋ง๋ค์ด๋ธ๋ค. ํ์ง๋ง ์ด๋ฐ ์ค๋ฅ๋ฅผ ์ฐ์ด๋ด๋ฉด์ ํด๊ฒฐํ๋ ๊ฒ์ด ์๊ทผ ๊ท์ฐฎ๋ค.
- DB์์ ์ฐ๋ ๊ฒ์ฒ๋ผ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ์
@Query(
value = "SELECT * FROM USERS u WHERE u.status = 1",
nativeQuery = true)
Collection<User> findAllActiveUsersNative();@Query ์ต์ ์์ nativeQuery = true๋ฅผ ์ค์ผ์ง๋ง... DB์์ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ์์ฑํ ์๋ ์๋ค.
์ฟผ๋ฆฌ๋ฅผ ์์ฑ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ ๊ตฌ์ฒด์ ์กฐ๊ฑด์ ์ค์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ค์์ผ๋ก ์ฒ๋ฆฌํด์ผํ๋๊ฐ์ ๋ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์.
-
?๋ฅผ ํตํ ๊ฒฝ์ฐ -> parameter์ ์์น์ ๋ฐ๋ฅธ ์ซ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
?1 -> parameter ์ฒซ๋ฒ์งธ ์๋ฆฌ์ ์๋๊ฑธ ๋ฃ๊ฒ ๋ค๋ ๋ป.
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
}-
: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
๋ฅผ ์ฐธ๊ณ ํด์ ๋์ด๊ฐ๋ ๊ฒ์ด ์ข์ ๋ฏํฉ๋๋ค.


