상세 컨텐츠

본문 제목

Spring Data & MongoDB : 메소드 이름만으로 쿼리하기

IT/프로그래밍

by James Lee. 2017. 8. 9. 17:50

본문

Edit

Spring Data & MongoDB : 메소드 이름만으로 쿼리하기 

Spring Data에서는 메서드의 이름만으로 쿼리를 할 수 있는 기능을 제공한다.

Example

MongoTemplate을 사용하여 사용자를 이름으로 조회하는 쿼리는 아래와 같다.

@Repository
public class UserRepository {
@Autowired
private MongoTemplate mongo;

public List<User> findByName(String name) {
Criteria criteria = Criteria.where("name").is(name);
Query query = new Query(criteria);
return mongo.find(query, User.class, "user");
}

}

이는 아래와 같이 줄일 수 있다. 코드가 훨씬 짧아졌다.

@Repository
public interface UserRepository extends MongoRepository<User, String> {
List<User> findByName(String name);
}

2개 이상의 조건으로 쿼리를 하면 중간에 And, Or등의 단어를 넣어서 연결해준다.
이메일 주소와 이름으로 유저를 검색하는 예시는 아래와 같다.

public interface UserRepository extends Repository<User, Long> {
List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

And, Or과 같이 쿼리와 매핑되는 키워드에 대한 정보는 여기에서 확인할 수 있다.

장점

findById와 같이 간단한 쿼리의 경우 쿼리에 대한 코드를 별도로 작성할 필요가 없어서 생산성이 늘어난다.

단점

쿼리 조건이 길어질수록 가독성이 급격히 떨어진다. 예를들어 사용자를 조회하는데 이름, 나이, 이메일로 조회한다면
findByNameAndAgeAndEmail이라는 메서드명을 사용해야 할 것이다.

규칙

  1. 쿼리 메서드의 이름은 다음 접두사 중 하나로 시작해야합니다. find … By , read … By , query … By , count … By , and get … By .
  2. 반환 된 쿼리 결과의 수를 제한 하려면 첫 번째 By 단어 앞에 First 또는 Top 키워드를 추가하면 됩니다. 둘 이상의 결과를 얻으려면 First 및 Top 키워드에 선택적인 숫자 값을 추가해야합니다 . 예를 들어 findTopBy , findTop1By , findFirstBy 및 findFirst1By는 모두 지정된 검색 기준과 일치하는 첫 번째 엔터티를 반환합니다.
  3. 고유한 결과를 선택 하려면 첫 번째 By 단어 앞에 Distinct 키워드 를 추가 해야합니다 . ex : findTitleDistinctBy 또는 findDistinctTitleBy
  4. 첫 번째 By 단어 뒤에 쿼리 메서드의 검색 기준을 추가해야합니다 . 지원되는 키워드와 속성식 을 결합하여 검색 기준을 지정할 수 있습니다.
  5. 쿼리 메서드가 x 검색 조건을 지정하면 x 메서드 매개 변수를 추가해야합니다. 즉, 메소드 매개 변수의 수는 검색 조건 수와 같아야합니다. 또한 메소드 매개 변수는 검색 조건과 동일한 순서로 제공되어야 합니다.

참고

%23%20Spring%20Data%20%26%20MongoDB%20%3A%20%uBA54%uC18C%uB4DC%20%uC774%uB984%uB9CC%uC73C%uB85C%20%uCFFC%uB9AC%uD558%uAE30%20%28Keyword%20Magic%29%0A%0A@%28MongoDB%29%5BSpring%2C%20MongoDB%2C%uD2F0%uC2A4%uD1A0%uB9AC%5D%0A%0ASpring%20Data%uC5D0%uC11C%uB294%20%uBA54%uC11C%uB4DC%uC758%20%uC774%uB984%uB9CC%uC73C%uB85C%20%uCFFC%uB9AC%uB97C%20%uD560%20%uC218%20%uC788%uB294%20%uAE30%uB2A5%uC744%20%uC81C%uACF5%uD55C%uB2E4.%0A%0A%23%23%23%20Example%0A%60MongoTemplate%60%uC744%20%uC0AC%uC6A9%uD558%uC5EC%20%uC0AC%uC6A9%uC790%uB97C%20%uC774%uB984%uC73C%uB85C%20%uC870%uD68C%uD558%uB294%20%uCFFC%uB9AC%uB294%20%uC544%uB798%uC640%20%uAC19%uB2E4.%20%0A%60%60%60%0A@Repository%0Apublic%20class%20UserRepository%20%7B%0A%20%20%20%20@Autowired%0A%20%20%20%20private%20MongoTemplate%20mongo%3B%0A%0A%20%20%20%20public%20List%3CUser%3E%20findByName%28String%20name%29%20%7B%0A%20%20%20%20%20%20%20%20Criteria%20criteria%20%3D%20Criteria.where%28%22name%22%29.is%28name%29%3B%0A%20%20%20%20%20%20%20%20Query%20query%20%3D%20new%20Query%28criteria%29%3B%0A%20%20%20%20%20%20%20%20return%20mongo.find%28query%2C%20User.class%2C%20%22user%22%29%3B%0A%20%20%20%20%7D%0A%0A%7D%0A%60%60%60%0A%uC774%uB294%20%uC544%uB798%uC640%20%uAC19%uC774%20%uC904%uC77C%20%uC218%20%uC788%uB2E4.%20%uCF54%uB4DC%uAC00%20%uD6E8%uC52C%20%uC9E7%uC544%uC84C%uB2E4.%0A%60%60%60%0A@Repository%0Apublic%20interface%20UserRepository%20extends%20MongoRepository%3CUser%2C%20String%3E%20%7B%0A%20%20%20%20List%3CUser%3E%20findByName%28String%20name%29%3B%0A%7D%0A%60%60%60%0A%0A2%uAC1C%20%uC774%uC0C1%uC758%20%uC870%uAC74%uC73C%uB85C%20%uCFFC%uB9AC%uB97C%20%uD558%uBA74%20%uC911%uAC04%uC5D0%20And%2C%20Or%uB4F1%uC758%20%uB2E8%uC5B4%uB97C%20%uB123%uC5B4%uC11C%20%uC5F0%uACB0%uD574%uC900%uB2E4.%0A__%uC774%uBA54%uC77C%20%uC8FC%uC18C%uC640%20%uC774%uB984%uC73C%uB85C%20%uC720%uC800%uB97C%20%uAC80%uC0C9%uD558%uB294%20%uC608%uC2DC%uB294%20%uC544%uB798%uC640%20%uAC19%uB2E4.__%0A%60%60%60%0Apublic%20interface%20UserRepository%20extends%20Repository%3CUser%2C%20Long%3E%20%7B%0A%20%20List%3CUser%3E%20findByEmailAddressAndLastname%28String%20emailAddress%2C%20String%20lastname%29%3B%0A%7D%0A%60%60%60%0A%0AAnd%2C%20Or%uACFC%20%uAC19%uC774%20%uCFFC%uB9AC%uC640%20%uB9E4%uD551%uB418%uB294%20%uD0A4%uC6CC%uB4DC%uC5D0%20%uB300%uD55C%20%uC815%uBCF4%uB294%20%5B%uC5EC%uAE30%5D%28https%3A//docs.spring.io/spring-data/jpa/docs/current/reference/html/%23jpa.query-methods.query-creation%29%uC5D0%uC11C%20%uD655%uC778%uD560%20%uC218%20%uC788%uB2E4.%0A%0A%23%23%23%23%20%uC7A5%uC810%0AfindById%uC640%20%uAC19%uC774%20%uAC04%uB2E8%uD55C%20%uCFFC%uB9AC%uC758%20%uACBD%uC6B0%20%uCFFC%uB9AC%uC5D0%20%uB300%uD55C%20%uCF54%uB4DC%uB97C%20%uBCC4%uB3C4%uB85C%20%uC791%uC131%uD560%20%uD544%uC694%uAC00%20%uC5C6%uC5B4%uC11C%20%uC0DD%uC0B0%uC131%uC774%20%uB298%uC5B4%uB09C%uB2E4.%20%0A%23%23%23%23%20%uB2E8%uC810%0A__%uCFFC%uB9AC%20%uC870%uAC74%uC774%20%uAE38%uC5B4%uC9C8%uC218%uB85D%20%uAC00%uB3C5%uC131%uC774%20%uAE09%uACA9%uD788%20%uB5A8%uC5B4%uC9C4%uB2E4.__%20%uC608%uB97C%uB4E4%uC5B4%20%uC0AC%uC6A9%uC790%uB97C%20%uC870%uD68C%uD558%uB294%uB370%20%uC774%uB984%2C%20%uB098%uC774%2C%20%uC774%uBA54%uC77C%uB85C%20%uC870%uD68C%uD55C%uB2E4%uBA74%20%0AfindByNameAndAgeAndEmail%uC774%uB77C%uB294%20%uBA54%uC11C%uB4DC%uBA85%uC744%20%uC0AC%uC6A9%uD574%uC57C%20%uD560%20%uAC83%uC774%uB2E4.%20%0A%0A%23%23%23%23%20%uADDC%uCE59%0A%0A1.%20%uCFFC%uB9AC%20%uBA54%uC11C%uB4DC%uC758%20%uC774%uB984%uC740%20%uB2E4%uC74C%20%uC811%uB450%uC0AC%20%uC911%20%uD558%uB098%uB85C%20%uC2DC%uC791%uD574%uC57C%uD569%uB2C8%uB2E4.%20find%20...%20By%20%2C%20read%20...%20By%20%2C%20query%20...%20By%20%2C%20count%20...%20By%20%2C%20and%20get%20...%20By%20.%0A2.%20%uBC18%uD658%20%uB41C%20%uCFFC%uB9AC%20%uACB0%uACFC%uC758%20%uC218%uB97C%20%uC81C%uD55C%20%uD558%uB824%uBA74%20%uCCAB%20%uBC88%uC9F8%20By%20%uB2E8%uC5B4%20%uC55E%uC5D0%20First%20%uB610%uB294%20Top%20%uD0A4%uC6CC%uB4DC%uB97C%20%uCD94%uAC00%uD558%uBA74%20%uB429%uB2C8%uB2E4.%20%uB458%20%uC774%uC0C1%uC758%20%uACB0%uACFC%uB97C%20%uC5BB%uC73C%uB824%uBA74%20First%20%uBC0F%20Top%20%uD0A4%uC6CC%uB4DC%uC5D0%20%uC120%uD0DD%uC801%uC778%20%uC22B%uC790%20%uAC12%uC744%20%uCD94%uAC00%uD574%uC57C%uD569%uB2C8%uB2E4%20.%20%uC608%uB97C%20%uB4E4%uC5B4%20findTopBy%20%2C%20findTop1By%20%2C%20findFirstBy%20%uBC0F%20findFirst1By%uB294%20%uBAA8%uB450%20%uC9C0%uC815%uB41C%20%uAC80%uC0C9%20%uAE30%uC900%uACFC%20%uC77C%uCE58%uD558%uB294%20%uCCAB%20%uBC88%uC9F8%20%uC5D4%uD130%uD2F0%uB97C%20%uBC18%uD658%uD569%uB2C8%uB2E4.%0A3.%20%uACE0%uC720%uD55C%20%uACB0%uACFC%uB97C%20%uC120%uD0DD%20%uD558%uB824%uBA74%20%uCCAB%20%uBC88%uC9F8%20By%20%uB2E8%uC5B4%20%uC55E%uC5D0%20Distinct%20%uD0A4%uC6CC%uB4DC%20%uB97C%20%uCD94%uAC00%20%uD574%uC57C%uD569%uB2C8%uB2E4%20.%20ex%20%3A%20findTitleDistinctBy%20%uB610%uB294%20findDistinctTitleBy%0A4.%20%uCCAB%20%uBC88%uC9F8%20By%20%uB2E8%uC5B4%20%uB4A4%uC5D0%20%uCFFC%uB9AC%20%uBA54%uC11C%uB4DC%uC758%20%uAC80%uC0C9%20%uAE30%uC900%uC744%20%uCD94%uAC00%uD574%uC57C%uD569%uB2C8%uB2E4%20.%20%uC9C0%uC6D0%uB418%uB294%20%uD0A4%uC6CC%uB4DC%uC640%20%uC18D%uC131%uC2DD%20%uC744%20%uACB0%uD569%uD558%uC5EC%20%uAC80%uC0C9%20%uAE30%uC900%uC744%20%uC9C0%uC815%uD560%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%0A5.%20%uCFFC%uB9AC%20%uBA54%uC11C%uB4DC%uAC00%20x%20%uAC80%uC0C9%20%uC870%uAC74%uC744%20%uC9C0%uC815%uD558%uBA74%20x%20%uBA54%uC11C%uB4DC%20%uB9E4%uAC1C%20%uBCC0%uC218%uB97C%20%uCD94%uAC00%uD574%uC57C%uD569%uB2C8%uB2E4.%20%uC989%2C%20__%uBA54%uC18C%uB4DC%20%uB9E4%uAC1C%20%uBCC0%uC218%uC758%20%uC218%uB294%20%uAC80%uC0C9%20%uC870%uAC74%20%uC218%uC640%20%uAC19%uC544%uC57C%uD569%uB2C8%uB2E4.%20__%20%uB610%uD55C%20__%uBA54%uC18C%uB4DC%20%uB9E4%uAC1C%20%uBCC0%uC218%uB294%20%uAC80%uC0C9%20%uC870%uAC74%uACFC%20%uB3D9%uC77C%uD55C%20%uC21C%uC11C%uB85C%20%uC81C%uACF5__%uB418%uC5B4%uC57C%20%uD569%uB2C8%uB2E4.%0A%0A%0A%23%23%23%20%uCC38%uACE0%0A-%20Spring%20Data%20Docs%0A%09-%20https%3A//docs.spring.io/spring-data/jpa/docs/current/reference/html/%23jpa.query-methods%0A%09-%20https%3A//docs.spring.io/spring-data/jpa/docs/current/reference/html/%23repositories.query-methods%0A-%20%5BCreating%20Database%20Queries%20From%20Method%20Names%0A%5D%28https%3A//www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-creating-database-queries-from-method-names/%29%0A


관련글 더보기

댓글 영역