s
s
spring
Search…
Spring Data JPA
img
JPA 처리를 담당하는 Repository는 기본적으로 4가지가 있다.
  • Repository는 CRUD 기능외의 처리를 할 때 사용하면 좋다.
1
@Indexed
2
public interface Repository<T, ID> {
3
4
}
Copied!
  • CrudRepository는 기본적인 CRUD 기능을 제공해준다.
1
public interface CrudRepository<T, ID> extends Repository<T, ID> {
2
3
<S extends T> S save(S entity);
4
5
Optional<T> findById(ID primaryKey);
6
7
Iterable<T> findAll();
8
9
long count();
10
11
void delete(T entity);
12
13
boolean existsById(ID primaryKey);
14
15
// … more functionality omitted.
16
}
Copied!
  • PagingAndSortingRepository : CRUD + 페이징과 sorting 기능 제공
1
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
2
Iterable<T> findAll(Sort sort);
3
Page<T> findAll(Pageable pageable);
4
}
Copied!
  • JpaRepository는 PagingAndSortingRepository + JPA관련 특화 기능들(flusing, 배치성 작업) 기능을 제공해준다.

Query Creation

사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어 Bean으로 등록해준다. 이때 정해진 규칙은 아래 표를 참조하면 좋다.
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

Native Queries

@Query 어노테이션으로 원래 쿼리문을 그대로 사용할 수 있다.
1
public interface UserRepository extends JpaRepository<User, Long> {
2
3
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
4
User findByEmailAddress(String emailAddress);
5
}
Copied!
1
public interface UserRepository extends JpaRepository<User, Long> {
2
3
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
4
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
5
nativeQuery = true)
6
Page<User> findByLastname(String lastname, Pageable pageable);
7
}
Copied!

예시

1
public interface MemberRepository extends CrudRepository<Member, String>{
2
}
Copied!
이렇게 상속만 하면, 기본적인 CrudRepository의 기능을 다 사용할 수 있다. CRUD에 추가적으로 구현하고 싶은 기능이 있으면 구현할 수 있다.
이때 별도로 @Repository 어노테이션을 추가하지 않아도 된다.
1
@Service
2
public class MemeberServiceImpl implements MemberService {
3
4
@Autowired
5
MemberRepository memberRepository;
6
7
public boolean isEnrolledMember(String mbrId) {
8
9
// mbrId(ID) 기준으로 회원 여부 확인(있으면 true, 없으면 false)
10
boolean isEnrolledMember = memberRepository.existsById(mbrId);
11
return isEnrolledMember;
12
}
13
}
Copied!

참조