복붙노트

[SPRING] spring-data-mongodb 멀티 테넌트 만들기

SPRING

spring-data-mongodb 멀티 테넌트 만들기

마지막으로 8 월에 sbzoom은 spring-data-mongoDB 멀티 테넌트를 만들기위한 해결책을 제안했습니다.

"당신은 자신의 RepositoryFactoryBean을 만들어야 만합니다. 다음은 Spring MongoDB Reference Docs의 예제입니다. 자신의 MongoTemplate을 구현하고 ensureIndexes () 호출을 지연 시키거나 제거해야하지만, 몇 가지 클래스를 다시 작성해야합니다. MongoTemplate이 Spring 대신 호출되도록하십시오. "

아무도 이것이나 비슷한 것을 구현 했습니까?

해결법

  1. ==============================

    1.여기 고양이를 다듬는 데는 몇 가지 방법이 있습니다. 근본적으로 모두 당신이 임차를 적용하고 싶은 수준까지 내려갑니다.

    여기 고양이를 다듬는 데는 몇 가지 방법이 있습니다. 근본적으로 모두 당신이 임차를 적용하고 싶은 수준까지 내려갑니다.

    기본 접근법은 스레드별로 고객을 식별하는 일종의 키를 바인딩하여 현재 실행 스레드가 처리하는 고객에 대해 알 수 있도록하는 것입니다. 대개 로그인 한 사용자로부터 임차인을 파생시킬 수 있기 때문에 ThreadLocal에 인증 관련 정보를 입력하면됩니다.

    이제 그 자리에 있다면 입주자 지식을 적용 할 수있는 몇 가지 옵션이 있습니다. 가장 일반적인 것들을 간략하게 요약 해 드리겠습니다.

    여러 클라이언트의 데이터를 구분하는 한 가지 방법은 세입자별로 개별 데이터베이스를 만드는 것입니다. Spring 데이터 MongoDB의 핵심 추상화는 MongoDBFactory 인터페이스이다. 가장 쉬운 방법은 SimpleMongoDbFactory.getDb (String name)을 재정의하고 부모 메소드를 데이터베이스 이름 (예 : 세입자 접두사 등으로 풍부하게된다.

    또 다른 옵션은 세입자에게 특정 컬렉션을 부여하는 것입니다. 임차인 선주 또는 후손을 통해 이 메커니즘은 @Document 주석의 collectionName 속성에서 Spring Expression Language (SpEl)을 사용하여 실제로 활용할 수 있습니다. 먼저 Spring 빈을 통해 테넌트 프리픽스를 노출합니다.

     @Component("tenantProvider")
     public class TenantProvider {
    
       public String getTenantId() {
         // … implement ThreadLocal lookup here
       }
     }
    

    그런 다음 @Document 매핑을 사용하여 도메인 유형에 SpEL을 사용하십시오.

     @Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
     public class Account { … }
    

    SpEl을 사용하면 스프링 빈을 이름으로 참조하고 메소드를 실행할 수 있습니다. MongoTemplate (따라서 저장소 추상화는 일시적으로) 문서 클래스의 매핑 메타 데이터를 사용할 것이고 매핑 하위 시스템은 collectionName 특성을 평가하여 상호 작용할 컬렉션을 찾습니다.

  2. ==============================

    2.Oliver Gierke와 비슷한 접근 방식을 가졌습니다. 적어도 데이터베이스 수준. https://github.com/Loki-Afro/ultultant-spring-mongodb 이런 일을 할 수 있어야합니다 :

    Oliver Gierke와 비슷한 접근 방식을 가졌습니다. 적어도 데이터베이스 수준. https://github.com/Loki-Afro/ultultant-spring-mongodb 이런 일을 할 수 있어야합니다 :

            MultiTenantMongoDbFactory.setDatabaseNameForCurrentThread("test");
            this.personRepository.save(createPerson("Phillip", "Wirth", ChronoUnit.YEARS.between(
                    LocalDate.of(1992, Month.FEBRUARY, 3),
                    LocalDate.now())));
    
            System.out.println("data from test: " + this.personRepository.findAll());
    //        okay? fine. - lets switch the database
            MultiTenantMongoDbFactory.setDatabaseNameForCurrentThread("test666");
    
    //        should be empty
            System.out.println("data from test666: " + this.personRepository.findAll());
    
  3. from https://stackoverflow.com/questions/16325606/making-spring-data-mongodb-multi-tenant by cc-by-sa and MIT license