Description

Spring Data MongoDB도 Spring Data repository 추상화 인터페이스를 지원한다. 이에 대한 내용은 Spring Data JPA 가이드 중 Repository 부분을 참조한다.

1. 시작하기

MongoDB에 대한 repository를 사용하기 위해서는 다음과 같은 mongo schem의 repistories 설정이 필요하다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
 
    <mongo:mongo host="localhost" />
 
    <mongo:db-factory dbname="database" mongo-ref="mongo" />
 
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    </bean>
 
    <!-- for Repository -->
    <mongo:repositories base-package="egovframework.rte.psl.data.mongodb.repository" />
 
</beans>

Domain Object 생성

일반적인 POJO를 통해 MongoDB에 문서를 저장한다.

public class Person {
	@Id
	private String id;
 
	private String firstname;
 
	private String lastname;
 
	private Address address;
 
	private double[] location;
 
        ...
 
        // getters/setters

기본 repository interface

public interface PersonRepository extends MongoRepository<Person, Long> {
 
  // additional custom finder methods go here
}

Paging 처리

MongoRepository interface는 기본적으로 PagingAndSortingRepository를 extends하기 때문에 다음과 같은 기본 페이징 처리를 지원한다.

@Autowired 
private PersonRepository repository;
 
...
 
@Test
public void readsFirstPageCorrectly() {
 
    Page<Person> persons = repository.findAll(new PageRequest(0, 10));
 
    LOGGER.info("Persons Total elements : " + persons.getTotalElements());
 
    assertTrue(persons.isFirst());
}

2. Query methods

Repository는 Spring Data에서 제공되는 keyword 기반의 query method를 사용할 수 있다.

ex:

public interface PersonRepository extends MongoRepository<Person, String> {
 
    List<Person> findByLastname(String lastname);
 
    Page<Person> findByFirstname(String firstname, Pageable pageable);
 
    Person findByShippingAddresses(Address address);
 
}

지원되는 keyword는 다음과 같다.

Keyword Sample Logic result
GreaterThan findByAgeGreaterThan(int age) {“age” : {“$gt” : age}}
GreaterThanEqual findByAgeGreaterThanEqual(int age) {“age” : {“$gte” : age}}
LessThan findByAgeLessThan(int age) {“age” : {“$lt” : age}}
LessThanEqual findByAgeLessThanEqual(int age) {“age” : {“$lte” : age}}
Between findByAgeBetween(int from, int to) {“age” : {“$gt” : from, “$lt” : to}}
In findByAgeIn(Collection ages) {“age” : {“$in” : [ages…]}}
NotIn findByAgeNotIn(Collection ages) “age” : {“$nin” : [ages…]}}
IsNotNull, NotNull findByFirstnameNotNull() {“age” : {“$ne” : null}}
IsNull, Null findByFirstnameNull() {“age” : null}
Like findByFirstnameLike(String name) {“age” : age} ( age as regex)
Regex findByFirstnameRegex(String firstname) {“firstname” : {“$regex” : firstname }}
(No keyword) findByFirstname(String name) {“age” : name}
Not findByFirstnameNot(String name) {“age” : {“$ne” : name}}
Near findByLocationNear(Point point) {“location” : {“$near” : [x,y]}}
Within findByLocationWithin(Circle circle) {“location” : {“$within” : {“$center” : [ [x, y], distance]}}}
Within findByLocationWithin(Box box) {“location” : {“$within” : {“$box” : [ [x1, y1], x2, y2]}}}
IsTrue, True findByActiveIsTrue() {“active” : true}
IsFalse, False findByActiveIsFalse() {“active” : false}
Exists findByLocationExists(boolean exists) {“location” : {“$exists” : exists }}

3. Repository delete queries

위의 keyword를 delete..By 또는 remove..By 형태로 사용하는 경우 삭제 처리가 가능하다.

public interface PersonRepository extends MongoRepository<Person, String> {
    List <Person> deleteByLastname(String lastname);
 
    Long deletePersonByLastname(String lastname);  		
}

4. Geo-spatial repository queries

Near keyword를 사용하는 경우 geo-spatial 처리와 관련된 query도 처리 가능하다.

public interface PersonRepository extends MongoRepository<Person, String>
 
    // { 'location' : { '$near' : [point.x, point.y], '$maxDistance' : distance}}
    List<Person> findByLocationNear(Point location, Distance distance);
}

5. MongoDB JSON based query methods

org.springframework.data.mongodb.repository.Query anntation을 사용할 경우 JSON query 방식을 통해 직접 query를 지정할 수 있다.

public interface PersonRepository extends MongoRepository<Person, String>
 
  @Query("{ 'firstname' : ?0 }")
  List<Person> findByThePersonsFirstname(String firstname);
 
}
 
egovframework/rte3.5/psl/data/mongodb/repositories.txt · 마지막 수정: 2023/12/21 05:21 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki