NoSQL/MongoDB

MongoDB SpringFramework 인젝션 방법

jeeyong 2011. 11. 21. 11:57
2012월 5월 21일 추가

spring-data-commons-core-1.2.0.M2.jar


spring-data-mongodb-1.0.0.M5.jar


위 두 패키지를 이용해서 구성하는 예제입니다.


mongo-2.7.3.jar


mongo-2.7.2.jar 버젼에서 약간의 버그가 있었슴다. 



-------------------------------------------------------------------------------------------------------------------------

본 블로깅의 목적은 카산드라에 (2011/11/10 - [NoSQL/cassandra] - Injecting dependencies Cassandra higher-level client Hector for Spring framework.)이어서 Springframework(이하 스프링) 에서 몽고디비를 사용하기위한 스프링에서 제공하는  http://www.springsource.org/spring-data/mongodb 라이브러리에서 xml 설정을 이용한 org.springframework.data.mongodb.core.MongoTemplate 객체 생성방법과 DAO단에서 @Autowired로 불러와 바로 사용하도록하는 방법을 알아보기 위함이다.

본문에 앞서 필요한 라이브러리가 몇가지가 있다. 
1) Spring Core – 3.0.5.RELEASE (어노테이션을 통한 객체주입을 하려면 3. 이후 버젼 부터 사용해야한다.) http://www.springsource.org/node/2880
2) Spring Data MongoDB (mongoTemplate 라이브러리 ) http://www.springsource.org/spring-data/mongodb  
3) 그리고 마지막으로 중요한 Spring Data Commons  http://www.springsource.org/spring-data/commons 이 라이브러리를 추가하지 않으면 객체주입이 안되서 xml에서 자동적으로 객체생성이 불가능해진다.
4)  MongoDB Driver http://www.mongodb.org/display/DOCS/Java+Language+Center#JavaLanguageCenter-JavaDriver 자바 클라이언트 라이브러리 

spring3-jdbc.xml 설정시 반드시 추가해야할 파서
 xmlns:mongo="http://www.springframework.org/schema/data/mongo"
 xsi:schemaLocation="...(생략)
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd" >

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    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.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd">
      
   	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
	</bean> 
	<mongo:mongo host="${mongodb.host}" port="${mongodb.port}"></mongo:mongo>
	<mongo:db-factory dbname="${mongodb.dbname}" username="${mongodb.username}" password="${mongodb.password}" mongo-ref="mongo" />
	<!--  org.springframework.data.mongodb.core.MongoTemplate -->
<context:annotation-config /> <context:component-scan base-package="com.application.controller" /> <context:component-scan base-package="com.application.filter" />
<context:component-scan base-package="com.application.dao.mongodb" />
</beans>

저렇게 mongoTemplate를 등록한후 사용될 객체를 spring pool에 등록을한다.

package com.application.dao.mongodb;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;

import com.mongodb.WriteResult;

@Repository
public class UsersMongodbDAOImpl implements UsersMongodbDAO{

	@Autowired MongoTemplate mongoTemplate;
	@Override
	public Users insert(String account, String name, int age) {
		//
		Users users = new Users();
		users.setAccount(account);
		users.setName(name);
		users.setAge(age);
		mongoTemplate.insert(users);
		
		return users;
	}
	
	@Override
	public Users save(String account, String name, int age) {
		//
		Users users = new Users();
		users.setAccount(account);
		users.setName(name);
		users.setAge(age);
		mongoTemplate.save(users);
		
		return users;
	}

	@Override
	public String update(String account, String name, int age) {
		// 
		
		WriteResult wr = mongoTemplate.updateMulti(Query.query((Criteria.where("account").is(account))), Update.update("age", "asdf"), Users.class);
		return wr.getLastError().toString();
	}

	@Override
	public Users get(String account) {
		// 
		return mongoTemplate.findById(account, Users.class);
	}

}
위에서 처럼 @Autowired를 통해 MongTemplate 객체를 얻어 사용한다.