Spring Data의 MongoTemplate와 MongoRepository의 차이점은 무엇입니까?
spring-data와 mongodb를 사용하여 복잡한 쿼리를 할 수 있는 어플리케이션을 작성해야 합니다.저는 Mongo Repository를 사용하여 시작했지만 예를 찾거나 구문을 실제로 이해하기 위해 복잡한 질의에 시달렸습니다.
저는 다음과 같은 질문에 대해 말하고 있습니다.
@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
List<User> findByEmailOrLastName(String email, String lastName);
}
또는 구문을 잘못 알고 시행착오로 시도한 JSON 기반 쿼리를 사용할 수도 있습니다.mongodb 매뉴얼을 읽은 후에도 (구문이 잘못되어 작동하지 않는 예)
@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
@Query("'$or':[{'firstName':{'$regex':?0,'$options':'i'}},{'lastName':{'$regex':?0,'$options':'i'}}]")
List<User> findByEmailOrFirstnameOrLastnameLike(String searchText);
}
, '아예'는 '아예'라고 생각됩니다.mongoTemplate
잘 되어 있다.MongoRepository
하다
http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/
어떤 것이 더 편리하고 강력한지 말씀해 주시겠어요? mongoTemplate
★★★★★★★★★★★★★★★★★」MongoRepository
둘다다다다???????아니면 한쪽이 다른 쪽보다 기능이 부족합니까?
"편리함"과 "사용하기 강력함"은 어느 정도 상반되는 목표이다.저장소는 템플릿보다 훨씬 편리하지만, 물론 후자의 경우 실행할 대상을 보다 세밀하게 제어할 수 있습니다.
저장소 프로그래밍 모델은 여러 Spring Data 모듈에 사용할 수 있으므로 Spring Data MongoDB 참조 문서의 일반 섹션에서 자세한 설명서를 찾을 수 있습니다.
TL;DR
일반적으로 다음 방법을 권장합니다.
- 저장소 추상화에서 시작하여 쿼리 파생 메커니즘 또는 수동으로 정의된 쿼리를 사용하여 단순 쿼리를 선언합니다.
- 더 복잡한 쿼리의 경우 수동으로 구현된 메서드를 저장소에 추가합니다(여기 설명 참조).에는, 「」를 합니다.
MongoTemplate
.
세부 사항
예를 들어 다음과 같습니다.
커스텀 코드의 인터페이스를 정의합니다.
interface CustomUserRepository { List<User> yourCustomMethod(); }
이 클래스에 대한 구현을 추가하고 명명 규칙을 따라 클래스를 찾을 수 있는지 확인하십시오.
class UserRepositoryImpl implements CustomUserRepository { private final MongoOperations operations; @Autowired public UserRepositoryImpl(MongoOperations operations) { Assert.notNull(operations, "MongoOperations must not be null!"); this.operations = operations; } public List<User> yourCustomMethod() { // custom implementation here } }
이제 기본 저장소 인터페이스를 커스텀으로 확장하면 인프라에서 자동으로 커스텀 구현을 사용합니다.
interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository { }
이렇게 하면 기본적으로 선택지가 생깁니다. 선언하기 쉬운 모든 것이 그 안에 들어갑니다.UserRepository
더 잘 되는 '수동'에 들어갑니다CustomUserRepository
커스터마이즈 옵션에 대해서는, 여기를 참조해 주세요.
FWIW, 멀티 스레드 환경에서의 업데이트에 대해서:
MongoTemplate
즉시 사용할 수 있는 '원자성' 조작 제공updateFirst
,updateMulti
,findAndModify
,upsert
작업으로 할 수 .한 번의 작업으로 문서를 수정할 수 있습니다.Update
이러한 메서드에서 사용되는 객체에서는 관련 필드만 대상으로 지정할 수 있습니다.MongoRepository
기본적인 CRUD 조작만 제공합니다.find
,insert
,save
,delete
모든 필드를 포함하는 POJO와 함께 작동합니다.이렇게 하면 여러 단계(1)에서 문서를 강제로 업데이트해야 합니다.find
2. 에서 관련 후 3. 반환된 POJO에서 관련 필드를 수정합니다.save
쿼리를 정의합니다.@Query
.
여러 REST 엔드포인트가 있는 Java 백엔드 등 멀티 스레드 환경에서는 두 개의 업데이트가 동시에 서로의 변경 사항을 덮어쓸 가능성을 줄이기 위해 단일 방법 업데이트를 사용하는 것이 좋습니다.
예: 다음과 같은 문서가 제공됩니다.{ _id: "ID1", field1: "a string", field2: 10.0 }
두 개의 다른 스레드가 동시에 업데이트를 하고 있습니다.
★★★★★★★★★★★★★★★★ MongoTemplate
이렇게 생겼을 거예요.
THREAD_001 THREAD_002
| |
|update(query("ID1"), Update().set("field1", "another string")) |update(query("ID1"), Update().inc("field2", 5))
| |
| |
는 항상 ""입니다.{ _id: "ID1", field1: "another string", field2: 15.0 }
각 스레드가 DB에 한 번만 액세스하고 지정된 필드만 변경되므로
, 케이스의 에서는, 「」는 「」로 되어 있습니다.MongoRepository
음음음같 뭇매하다
THREAD_001 THREAD_002
| |
|pojo = findById("ID1") |pojo = findById("ID1")
|pojo.setField1("another string") /* field2 still 10.0 */ |pojo.setField2(pojo.getField2()+5) /* field1 still "a string" */
|save(pojo) |save(pojo)
| |
| |
최종 문서는 다음 중 하나입니다.{ _id: "ID1", field1: "another string", field2: 10.0 }
★★★★★★★★★★★★★★★★★」{ _id: "ID1", field1: "a string", field2: 15.0 }
쪽이냐에 save
DB를 사용하다
(주: 댓글에 제시된 바와 같이 Spring Data의 주석을 사용하더라도 큰 변화는 없습니다.save
하면, 「」라고 것이 됩니다.OptimisticLockingFailureException
최종 문서는 상기 중 하나이며 두 필드 모두 갱신되지 않고 한 필드만 갱신됩니다.)
따라서 매우 정교한 POJO 모델이 있거나 사용자 지정 쿼리 기능이 필요한 경우를 제외하고 이 옵션이 더 나은 옵션이라고 할 수 있습니다.MongoRepository
웬일인지 그래.
이 답변은 다소 늦어질 수 있지만 저장소 경로 전체를 피하는 것이 좋습니다.실용적으로 큰 가치가 있는 실장 방법은 거의 없습니다.이것을 동작시키기 위해서, Java 설정의 난센스에 부딪히게 됩니다.이러한 설정에서는, 메뉴얼의 도움이 필요 없습니다.
대신에,MongoTemplate
Spring 프로그래머가 겪는 구성의 악몽에서 벗어날 수 있는 독자적인 데이터 액세스 레이어를 라우팅 및 만듭니다. MongoTemplate
유연성이 뛰어나기 때문에 자신만의 수업과 상호작용을 쉽게 설계할 수 있는 엔지니어에게는 정말 구세주입니다.을 사용하다
- 작성하다
MongoClientFactory
되어 「」를 수 있는 입니다.MongoClient
수(은 스레드입니다).싱글톤으로 구현하거나 Enum 싱글톤을 사용할 수 있습니다(이것은 스레드 세이프입니다). - 각 도메인 개체의 데이터 액세스 개체를 상속할 수 있는 Data Access Base 클래스를 만듭니다).기본 클래스는 클래스 고유의 메서드가 모든 DB 액세스에 사용할 수 있는 MongoTemplate 개체를 만드는 메서드를 구현할 수 있습니다.
- 각 도메인 객체의 각 데이터 액세스 클래스는 기본 메서드를 구현할 수도 있고 기본 클래스에서 구현할 수도 있습니다.
- 컨트롤러 메서드는 필요에 따라 데이터 액세스클래스의 메서드를 호출할 수 있습니다.
언급URL : https://stackoverflow.com/questions/17008947/whats-the-difference-between-spring-datas-mongotemplate-and-mongorepository
'IT' 카테고리의 다른 글
php-fpm과 Nginx Docker 컨테이너를 올바르게 링크하려면 어떻게 해야 합니까? (0) | 2022.10.18 |
---|---|
Java의 이상한 정수 상자 (0) | 2022.10.18 |
문자열의 제로 패드 숫자 (0) | 2022.10.18 |
서브쿼리 vs 조인 (0) | 2022.10.18 |
MysqlDB에서 사용할 Panda 또는 Numpy Nan을 없음으로 대체 (0) | 2022.10.18 |