본문 바로가기

개발 이야기/java

[Java][Spring]MongoDB 연동 및 사용

Java Spring에 MongoDB를 연동하여 메인 디비로 사용해 아주 간단한 웹페이지를 띄워보려고 합니다.

 

처음 프로젝트 생성 후 아무것도 손대지 않은 기본 구조입니다. 필자는 Gradle을 사용합니다.

 

 

 

기본 build.gradle

group 'mongoBlog'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

 

MongoDB 및 기타 몇가지 필요한 API를 build.gradle에 추가해주었습니다. 

각 API의 버전은 개인 프로젝트에 맞게 설정 해주시면 됩니다. 

수정된 build.gradle

group 'mongoBlog'
version '1.0-SNAPSHOT'

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    // mvc
    compile group: 'org.springframework', name: 'spring-webmvc', version: '4.2.5.RELEASE'

    compile group: 'javax.servlet', name: 'jstl', version: '1.2'

    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:'2.6.3'

    // 몽고디비
    compile group: 'org.springframework.data', name: 'spring-data-mongodb', version: '1.9.1.RELEASE'

    compile group: 'org.springframework', name: 'spring-jdbc', version: '4.2.5.RELEASE'

    //테스트
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile group: 'org.springframework', name: 'spring-test', version: '4.2.5.RELEASE'
    testCompile group: 'org.mockito', name: 'mockito-all', version: '1.9.5'
}

그다음은 기본 프로젝트 구조인 src/main/webapp 에 WEB-INF 폴더와 view 폴더를 만들어 주었습니다.

view 폴더는 뷰단에 보일 jsp파일을 정리해 넣기 위해 만든 것이므로 꼭 만드시지 않아도 됩니다.

WEB-INF 폴더에 기본 DispatcherServlet파일과 web.xml 을 만들어 주고

MongoDB 설정 파일을 만들어 주었습니다.

 필자는 DispatcherServlet파일 이름은 page-servlet.xml,

MongoDB 설정 파일 이름은 mongo-connection.xml 로 만들어 주었습니다.

 

 

page-servlet.xml

<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task.xsd">

    <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <ref bean="sortResolver"/>
            <ref bean="pageableResolver"/>
        </mvc:argument-resolvers>
    </mvc:annotation-driven>

    <bean id="sortResolver" class="org.springframework.data.web.SortHandlerMethodArgumentResolver"/>
    <bean id="pageableResolver" class="org.springframework.data.web.PageableHandlerMethodArgumentResolver">
        <constructor-arg ref="sortResolver"/>
    </bean>

    <task:annotation-driven/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

mongo-connection.xml

밑에 소스에 보이는 host와 port를 저의 프로젝트에서는 server-config.properties로 따로 관리합니다.

프로퍼티로 관리하지 않는 분들은 그냥 직접 입력해 넣어주시면 됩니다.

로컬일 경우 host 는 localhost  

port는 기본 27017입니다. 

소스에 보면 databaseName을 설정하는 부분이 있는데 이 부분은 각자 원하시는 이름으로 설정하시면 됩니다.

<?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:context="http://www.springframework.org/schema/context"
       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/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/data/mongo
       http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">

    <context:property-placeholder location="classpath:server-config.properties"/>

    <bean id="mongoClientOptions" class="org.springframework.data.mongodb.core.MongoClientOptionsFactoryBean">
        <property name="connectionsPerHost" value="3"/>
        <property name="connectTimeout" value="1000"/>
        <property name="maxWaitTime" value="1500"/>
        <property name="socketKeepAlive" value="true"/>
    </bean>
    <bean id="mongo" class="org.springframework.data.mongodb.core.MongoClientFactoryBean">
        <property name="host" value="${mongo_ip}"/>
        <property name="port" value="${mongo_port}"/>
        <property name="mongoClientOptions" ref="mongoClientOptions"/>
    </bean>

    <bean id="simpleMongoDbFactory" class="org.springframework.data.mongodb.core.SimpleMongoDbFactory">
        <constructor-arg name="mongo" ref="mongo"/>
        <constructor-arg name="databaseName" value="showMeTheMoney"/>
    </bean>

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="simpleMongoDbFactory"/>
    </bean>
</beans>
 
web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <!--mongoDB 설정 파일 등록-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            WEB-INF/mongo-connection.xml
        </param-value>
    </context-param>

    <!--page-servlet 등록-->
    <servlet>
        <servlet-name>page</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>page</servlet-name>
        <url-pattern>/web/*</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

설정 파일들 셋팅이 끝나면 이제 MongoDB 조회와 삽입 페이지를 구현해 보겠습니다.

우선 프로젝트의 src/main/java 밑에

 src/controller

src/dao

src/vo

패키지를 만들어 주었습니다.

 

 

그리고 각각의 패키지에 vo, dao, controller 클래스를 만들어줍니다.

소스코드의 설명은 너무 길어질 것 같아 생략하겠습니다.

이해가 안되시거나 궁금한 부분에 대해 댓글 남겨주시면 답변해드리겠습니다.

view페이지인 index.jsp 소스 또한 생략하겠습니다.

 

vo.Company

collection의 이름은 Company로 설정하고,

그냥 간단히 회사의 이름과 주소 그리고 고유번호를 저장합니다.

package src.vo;

import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "Company")
public class Company {

    private long id;
    private String name;
    private String url;

    public Company(){

    }

    public Company(long id, String name, String url){
        this.id = id;
        this.name = name;
        this.url = url;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public String toString() {
        return "Company{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", url='" + url + '\'' +
                '}';
    }
}

dao.CompanyDAO

package src.dao;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
import src.vo.Company;

@Repository
public interface CompanyDAO extends MongoRepository<Company,String>{
}

controller.Index

package src.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import src.dao.CompanyDAO;
import src.vo.Company;

@Controller
@RequestMapping("/index")
public class Index {

    private final CompanyDAO companyDAO;

    @Autowired
    public Index(CompanyDAO companyDAO) {
        this.companyDAO = companyDAO;
    }

    @RequestMapping("/")
    public String index(Model model,
                        @PageableDefault(size = 10, sort = {"_id"}, direction = Sort.Direction.DESC) Pageable pageable) {

        model.addAttribute("companies", companyDAO.findAll(pageable));
        return "index";
    }

    @RequestMapping(value = "/addCompany/", produces = "application/text; charset=utf8")
    @ResponseBody
    private String addCompany(@RequestParam("name") String name,
                              @RequestParam("url") String url) {
        Page<Company> companyUidx = companyDAO.findAll(new PageRequest(0, 1, Sort.Direction.DESC, "_id"));

        if (companyUidx.getTotalElements() != 0)
            companyDAO.insert(new Company(companyUidx.getContent().get(0).getId() + 1, name, url));
        else
            companyDAO.insert(new Company(1, name, url));

        return "ok";
    }
}

 

위의 세가지를 모두 만들어주셨다면 mongo-connection.xml에 아래 코드를 넣어 repository를 등록해 주셔야 합니다.

<mongo:repositories base-package="src.dao" mongo-template-ref="mongoTemplate"/>

 

page-servlet.xml에도 아래의 코드를 넣어 controller를 bean으로 만들어 주겠습니다.

<context:component-scan base-package="src.controller"/>

 

모두 완료 되었으면 실행하여 확인해보도록 하겠습니다.

 

처음 페이지를 들어가면 mongoDB에 있는 자료를 모두 가져와(companyDAO.findAll(pageble)) 리스트에 보여주데

현재 db에 아무것도 들어있지 않기에 리스트가 비어있는 상태입니다.

 

 

오른쪽에 회사 추가 버튼으로 회사를 추가 해주겠습니다. 

mongoDB의 경우 auto increment 방법을 몰라

저장된 가장 마지막 값 id를 가져온 값에 1을 더해 고유번호를 넣어주는 방법을 선택하였습니다.

(위의 controller에 addCompany함수)

넣어주고 확인해보면 정상적으로 들어가 있는 것이 보입니다.

 

 

 

이상으로 간단하게 mongoDB를 연동하여 데이터 삽입 및 조회를 해보았습니다.

mongoRepository에 대한 정보는 아래 링크를 참고하시면 됩니다.

 

http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/repository/MongoRepository.html

 

MongoRepository (Spring Data MongoDB 3.2.5 API)

 

docs.spring.io