IT

Spring Data의 MongoTemplate와 MongoRepository의 차이점은 무엇입니까?

itgroup 2022. 10. 18. 21:39
반응형

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

일반적으로 다음 방법을 권장합니다.

  1. 저장소 추상화에서 시작하여 쿼리 파생 메커니즘 또는 수동으로 정의된 쿼리를 사용하여 단순 쿼리를 선언합니다.
  2. 더 복잡한 쿼리의 경우 수동으로 구현된 메서드를 저장소에 추가합니다(여기 설명 참조).에는, 「」를 합니다.MongoTemplate.

세부 사항

예를 들어 다음과 같습니다.

  1. 커스텀 코드의 인터페이스를 정의합니다.

    interface CustomUserRepository {
    
      List<User> yourCustomMethod();
    }
    
  2. 이 클래스에 대한 구현을 추가하고 명명 규칙을 따라 클래스를 찾을 수 있는지 확인하십시오.

    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
      }
    }
    
  3. 이제 기본 저장소 인터페이스를 커스텀으로 확장하면 인프라에서 자동으로 커스텀 구현을 사용합니다.

    interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository {
    
    }
    

이렇게 하면 기본적으로 선택지가 생깁니다. 선언하기 쉬운 모든 것이 그 안에 들어갑니다.UserRepository더 잘 되는 '수동'에 들어갑니다CustomUserRepository커스터마이즈 옵션에 대해서는, 여기를 참조해 주세요.

FWIW, 멀티 스레드 환경에서의 업데이트에 대해서:

  • MongoTemplate 즉시 사용할 수 있는 '원자성' 조작 제공 updateFirst,updateMulti,findAndModify,upsert작업으로 할 수 .한 번의 작업으로 문서를 수정할 수 있습니다.Update이러한 메서드에서 사용되는 객체에서는 관련 필드만 대상으로 지정할 수 있습니다.
  • MongoRepository 기본적인 CRUD 조작만 제공합니다. find,insert,save,delete모든 필드를 포함하는 POJO와 함께 작동합니다.이렇게 하면 여러 단계(1)에서 문서를 강제로 업데이트해야 합니다.find2. 에서 관련 후 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 } 쪽이냐에 saveDB를 사용하다
(주: 댓글에 제시된 바와 같이 Spring Data의 주석을 사용하더라도 큰 변화는 없습니다.save하면, 「」라고 것이 됩니다.OptimisticLockingFailureException최종 문서는 상기 중 하나이며 두 필드 모두 갱신되지 않고 한 필드만 갱신됩니다.)

따라서 매우 정교한 POJO 모델이 있거나 사용자 지정 쿼리 기능이 필요한 경우를 제외하고 이 옵션이 나은 옵션이라고 할 수 있습니다.MongoRepository웬일인지 그래.

이 답변은 다소 늦어질 수 있지만 저장소 경로 전체를 피하는 것이 좋습니다.실용적으로 큰 가치가 있는 실장 방법은 거의 없습니다.이것을 동작시키기 위해서, Java 설정의 난센스에 부딪히게 됩니다.이러한 설정에서는, 메뉴얼의 도움이 필요 없습니다.

대신에,MongoTemplateSpring 프로그래머가 겪는 구성의 악몽에서 벗어날 수 있는 독자적인 데이터 액세스 레이어를 라우팅 및 만듭니다. MongoTemplate유연성이 뛰어나기 때문에 자신만의 수업과 상호작용을 쉽게 설계할 수 있는 엔지니어에게는 정말 구세주입니다.을 사용하다

  1. 작성하다MongoClientFactory되어 「」를 수 있는 입니다.MongoClient(은 스레드입니다).싱글톤으로 구현하거나 Enum 싱글톤을 사용할 수 있습니다(이것은 스레드 세이프입니다).
  2. 각 도메인 개체의 데이터 액세스 개체를 상속할 수 있는 Data Access Base 클래스를 만듭니다).기본 클래스는 클래스 고유의 메서드가 모든 DB 액세스에 사용할 수 있는 MongoTemplate 개체를 만드는 메서드를 구현할 수 있습니다.
  3. 각 도메인 객체의 각 데이터 액세스 클래스는 기본 메서드를 구현할 수도 있고 기본 클래스에서 구현할 수도 있습니다.
  4. 컨트롤러 메서드는 필요에 따라 데이터 액세스클래스의 메서드를 호출할 수 있습니다.

언급URL : https://stackoverflow.com/questions/17008947/whats-the-difference-between-spring-datas-mongotemplate-and-mongorepository

반응형