시뻘건 개발 도전기

#16 : query method를 정의하자 본문

Framework/spring

#16 : query method를 정의하자

시뻘건볼때기 2020. 5. 24. 16:32
반응형

repository 프록시는 메소드 명으로부터 query를 가지고 오는 방법이 두 가지가 있다.

  1. 메소드 명으로부터 query를 직접 가지고 오는 방법.
  2. 수동적으로 정의된 query를 가지고 오는 방법.

이 두 가지 방법의 선택은 스토어에 따라 달라질 수 있다. 실제 어떤 query가 만들어 지는지는 어떠한 전략(?)이 있다.

  • CREATE
    • query 메소드의 이름을 가지고 query를 만든다.
    • well-known prefix를 모두 제거하고 나머지 이름 부분 가지고 파싱해서 query를 만든다. (ex. findById())
  • USE_DECLARED_QUERY
    • 선언 되어있는 query를 찾는다.
    • 찾지 못하면 예외가 있으니 예외처리를 해주어야한다.
    • 어노테이션을 사용하여서 어딘가에 정의되어 있을 수 있다.
  • CREATE_IF_NOT_FOUND
    • 기본 값
    • 정의된 query를 먼저 찾고 없으면 메소드 명을 가지고 query를 만든다.

 

 

제거되는 prefix는 다음과 같다.

  1. find…By
  2. read…By
  3. query…By
  4. count…By
  5. get…By

그래서 이런식으로 메소드명을 정의하면 된다.

interface PersonRepository extends Repository<Person, Long> {
	List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

	// Enables the distinct flag for the query
	List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
	List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

	// Enabling ignoring case for an individual property
	List<Person> findByLastnameIgnoreCase(String lastname);
	// Enabling ignoring case for all suitable properties
	List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

	// Enabling static ORDER BY for a query
	List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
	List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

잘 보면 distinct도 함께있고 orderby 등 sql문을 유추할 수도 있다. 메소드를 파싱한 실제 결과는 persistence store에 따라 다르지만 다음과 같이 주의사항이 있다.

  • 조건절을 'AND' 또는 'OR'를 가지고 연결 할 수 있다.
  • Between, LessThan, GreaterThan, Like도 지원한다.
  • 지원되는 연산자는 datastore마다 다르니 해당 문서를 참고해야한다.
  • 개별 특성(ex. findByLastnaeIgnoreCase)과 대소문자 구분을 무시해주는 특성(ex. findByLastnameAndFirstnameAllIgnoreCase) ignoreCase flag의 설정을 지원한다.
반응형

'Framework > spring' 카테고리의 다른 글

#18 : Lombok  (0) 2020.07.22
#17 : H2 database 연동 준비  (0) 2020.06.13
#15 : 상속 없이 repository를 만들자  (0) 2020.05.24
#14 : JPA 시작  (0) 2020.05.18
#13 : JDBC (Java DataBase Connectivity)  (0) 2020.05.10
Comments