반응형

스프링부트 2.3.3 을 쓰게되면서 부터 라이브러리 사용법들이 조금 많이 달라졌다.

예를 들어 몽고db 가 있다.

spring-data-mongodb:3.0.0 이후의 버젼이다.

 

몽고 db 쿼리 사용 예시이다.

Date dateLogStartDate = new Date(); // date 조건검색 시작
Date dateLogEndDate = new Date(); // date 조건검색 종료

Query query = new Query();
query.with(Sort.by(Sort.Direction.DESC, "log_date")); // date 내림차순
Criteria criteria = Criteria
        .where("log_date").gte(dateLogStartDate).lte(dateLogEndDate);

query.addCriteria(criteria);
Map<String, Object> result = new HashMap<String, Object>();
List<Test> mongo = null;
long count = mongoTemplate.count(query, Test.class);
log.info( "count : {}", count);
int perPage = 50;
int currentPage = 1;
if(count > 0) {
    query.with(Sort.by(Sort.Direction.DESC, "log_date")); // date 내림차순
    query.limit(perPage);
    query.skip(perPage * (currentPage - 1) );
    mongo = mongoTemplate.find(query, Test.class);
}

document 클래스

@Document(collection="test")
public class Test {

	private Date log_date;

	private String data;

	private String text;

}

spring-data-mongodb:3.0.0 이전 버젼에서는 어노테이션을 붙이지 않아도 동작을 했다.

 

하지만 스프링부트 2.3.0 이후버젼에서 사용하는 spring-data-mongodb:3.0.0 버젼이상은 

@Field 어노테이션을 꼭 붙여줘야 한다.

@Document(collection="test")
public class Test {

	@Field("log_date")
	private Date log_date;

	@Field("data")
	private String data;

	@Field("text")
	private String text;

}

 

@Field 을 붙여주지 않고 쿼리를 조회시 다음과 같은 오류가 생긴다.

org.springframework.data.mapping.PropertyReferenceException: No property log found for type Test!

 

반응형
반응형

spring boot mongodb connection 및 자동 _class 컬럼 insert 삭제 설정

몽고디비를 연결해주려면 스프링부트에서는 yml 설정에서 추가만 해도 되지만,

object 클래스를 넣어줄떄 자동으로 _class 라는 필드가 추가되게 된다.

_class 를 없애주려면 @Configuraion 으로 mongodb 세팅을 자바 코드로 설정을 해주어야 한다.

 

 

해당 내용은 스프링부트 spring-boot-stater-data-mongodb:2.3.3 RELEASE 버젼,

spring-data-mongodb:3.0.3 RELEASE 이다.

차이점은

spring-data-mongodb 2 버젼은 MongoDatabaseFactory 가 아니라 MongoDbFactory 이다.

3 버젼에서는 MongoDbFactory 가 deprecated 가 되어서 MongoDatabaseFactory 를 사용하자.

@Configuration
public class MongoDBConfig {

    @Value("${spring.data.mongodb.uri}")
    private String mongodb_uri;

    @Bean(name = "mongoTemplate1")
    public MongoTemplate mongoTemplate1()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection1");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

    @Bean(name = "mongoTemplate2")
    public MongoTemplate mongoTemplate2()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection2");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

    @Bean(name = "mongoTemplate3")
    public MongoTemplate mongoTemplate3()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection3");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

}

다음과 같이 document 가 여러개이면 document 마다 template 을 나누어서 빈을 등록해준다.

 _class 삭제방법

여기서 _class 를 없애는 방법은 위의 코드와 같이

converter.setTypeMapper(new DefaultMongoTypeMapper(null));

컨버터에 null 을 세팅을 기본으로 해주어야 한다.

 

방법은 여러가지가 있겟지만, 해당 방법이 코드량 적고 각각 document 마다 설정 가능하다는 점이 장점이다.

 

auto localhost 몽고 연결 수정

이대로만 하면 아마 spring boot 가 시작시 자동으로 localhost 27017 로 몽고디비가 연결을 시도한다.

이 점을 수정하려면 시작시에 자동으로 시작되는 class 를 제외시켜주면 된다.

@SpringBootApplication 에 exclude 에 MongoDataAutoConfiguration.class 를 추가해주자.

@SpringBootApplication(exclude = { MongoDataAutoConfiguration.class})
public class MongoApplication {

	public static void main(String[] args) {
		SpringApplication.run(MongoApplication.class, args);
	}

}

yml 파일도 설정해주자

spring:
  data:
    mongodb:
      uri: mongodb://아이디:비번@몽고디비url:27017

 

 

yml 로만 설정을 하게되면 스프링몽고디비 3 버젼에서는 로컬로만 연결이 됐다.

 

해결방법을 찾지 못해도 다음처럼 mongotemplate 을 구성한 이유도 있다.

@Value 로 설정값을 가져와서 연결하는 방법이다.

그래서 실질적으로 어플리케이션이 올라가면서 몽고디비 커넥션을 맺는방식은 아니고 빈을 생성시에 yml 에서 값을 가져와서 mongoTemplate 에 사용을 한다.

yml 에 굳이 계정정보를 넣지 않아도 되지만, 자바코드보다는 yml 에 설정값을 넣는 편이 낫다.

 

 

반응형

+ Recent posts