티스토리 뷰

728x90
반응형

이번 포스팅에서는 Springboot에서 MongoDB와 연동하는 방법에 대해 알아보도록 하겠습니다.

MongoDB 개요

MongoDB는 도큐먼트 데이터를 기반으로 다루는 NoSQL 데이터베이스입니다. NoSQL은 Not Only SQL의 약자이고, 관계형 데이터베이스(RDBMS)의 한계를 극복하고자 개발된 데이터베이스입니다. 관계형 데이터베이스는 고정된 스키마로 인해 일부 데이터만 저장하더라도, 사용하지 않는 칼럼에 대한 메모리 공간도 사용해야 하는 단점이 존재합니다. 몽고 DB에서는 데이터를 스키마에 얽매이지 않고 데이터를 저장할 수 있는 기능을 제공합니다. 관계형 데이터베이스는 서버의 성능을 향상하기 위해 스케일 업(=고사양 하드웨어로 교체)으로 주로 성능을 개선해야만 하지만, NoSQL 데이터베이스는 샤딩(여러 개의 데이터베이스에 데이터를 분산)을 통해, 성능 향상을 할 수 있습니다. 몽고 DB에서 사용하는 용어 및 정의는 아래와 같습니다.

  • 도큐먼트 (=Document) : 데이터를 저장하는 단위. JSON의 Key-value 형태로 데이터를 저장 , RDBMS에서 1개의 record와 대응됨
  • 컬렉션 (=Collection) : 도큐먼트의 집합, RDBMS에서 테이블과 대응됨

도큐먼트의 데이터 저장 형식은 아래와 같습니다. 

{
        name:"shcheon",
        age:"30",
        hobby:["programming","tennis"]
}

몽고 DB에서 CRUD 수행을 위한 질의어는 아래와 같이 사용할 수 있습니다. 이해를 돕기 위해 RDBMS 쿼리와 같이 비교해보았습니다.

  • Create 구문 : db.users.insert({name:"test 1"}) = insert into users('name') values('test 1')
  • Read 구문 : db.users.find({name:"test 1"}) = select * from users where name = 'test 1'
  • Update 구문 : db.users.update({name:"test"}, {$set:{name:"updateTest1"}}) = update users set name='updateTest1' where name = 'test'
  • Delete 구문 : db.users.delete({name:"test}) = delete from users where name = 'test'

Docker에서 MongoDB 구동하기

도커를 활용하면 몽고 DB 서버를 손쉽게 설치 및 실행 가능합니다. 윈도에서 도커를 설치하지 않으신 분은 아래 링크를 참조하여 윈도에서 도커를 설치하는 방법을 참조 바랍니다.

 

[Docker] 윈도우(Windows)에서 도커(Docker) 설치하기

도커(Docker)는 가상화를 이용한 프로세스를 격리하여 실행해주는 소프트웨어 플랫폼입니다. 도커를 이용하면, 어떠한 Host OS환경에서도 프로세스를 동일한 환경에서 실행할 수 있습니다. 마치 빈

shcheon.tistory.com

Docker Desktop을 설치하면, 윈도우 커맨드 창에서 Docker 명령어를 사용하실 수 있습니다. 윈도 커맨드 창을 실행한 뒤 아래 명령어를 통해 몽고 DB이미지를 다운로드, 몽고 DB 도커 컨테이너 실행, 접속이 가능합니다.

# MongoDB Docker 이미지 다운로드
docker pull mongo

# MongoDB Docker 컨테이너 생성
docker run --name mongodb-container -v ~/data:/data/db -d -p 27017:27017 mongo

# MongoDB Docker 컨테이너 중지
docker stop mongodb-container

# MongoDB Docker 컨테이너 시작
docker start mongodb-container

# MongoDB Docker 컨테이너 재시작
docker restart mongodb-container

# MongoDB 컨테이너 Bash 접속
docker exec -it mongodb-container bash

Springboot MongoDB 실습용 프로젝트 다운로드

https://start.spring.io/ 에서 MongoDB 디펜던시를 추가하여 스프링 부트 프로젝트를 다운로드합니다.

springboot mongdb 프로젝트 다운로드

다운로드한 프로젝트에서 build.gradle 파일을 열어보면 몽고 DB 디펜던시가 추가된 것을 확인할 수 있습니다.

implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
testImplementation 'io.projectreactor:reactor-test'

MongoDB API 코드 작성하기

스프링 부트에서 몽고 DB에 접속하여, 데이터를 저장하는 코드를 작성해보겠습니다. 우선, 데이터를 저장할 Entity 클래스인 Customer 클래스를 아래와 같이 작성합니다.

package com.example.demo;

import org.springframework.data.annotation.Id;

public class Customer {

    @Id
    public String id;

    public String firstName;
    public String lastName;

    public Customer() {}

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return String.format(
                "Customer[id=%s, firstName='%s', lastName='%s']",
                id, firstName, lastName);
    }

}

@Id 어노테이션은 몽고 DB 내부에서 사용하는 Id 값이며, 자동으로 생성됩니다. firstName과 lastName에는 별도의 어노테이션 명시되어 있지 않습니다. 클래스의 멤버 변수에 어노테이션이 없으면, 몽고 DB에서 Document의 Field 명과 동일하게 사용됩니다. 다음으로, 몽고 DB와 연동을 지원하는 Repository 인터페이스를 작성합니다. 

package com.example.demo;

import java.util.List;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface CustomerRepository extends MongoRepository<Customer, String> {

    public Customer findByFirstName(String firstName);
    public List<Customer> findByLastName(String lastName);

}

MongoRepository를 상속받아, 몽고 DB와 CRUD를 수행하기 위한 쿼리에 해당하는 메서드를 정의할 수 있습니다. Springboot에서 몽고 DB 쿼리를 작성하는 방법에 대해 궁금하신 분은 Springboot MongoDB 공식 문서를 참조 바랍니다.

 

Spring Data MongoDB - Reference Documentation

abs, acos, acosh, add (* via plus), asin, asin, atan, atan2, atanh, ceil, cos, cosh, derivative, divide, exp, floor, integral, ln, log, log10, mod, multiply, pow, round, sqrt, subtract (* via minus), sin, sinh, tan, tanh, trunc

docs.spring.io

 마지막으로, 몽고 DB에 데이터를 저장하고, 읽는 예제를 실행해보겠습니다. 아래와 같은 Main클래스를 작성합니다.

package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private CustomerRepository repository;

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

    @Override
    public void run(String... args) throws Exception {

        repository.deleteAll();

        // save a couple of customers
        repository.save(new Customer("Alice", "Smith"));
        repository.save(new Customer("Bob", "Smith"));

        // fetch all customers
        System.out.println("Customers found with findAll():");
        System.out.println("-------------------------------");
        for (Customer customer : repository.findAll()) {
            System.out.println(customer);
        }
        System.out.println();

        // fetch an individual customer
        System.out.println("Customer found with findByFirstName('Alice'):");
        System.out.println("--------------------------------");
        System.out.println(repository.findByFirstName("Alice"));

        System.out.println("Customers found with findByLastName('Smith'):");
        System.out.println("--------------------------------");
        for (Customer customer : repository.findByLastName("Smith")) {
            System.out.println(customer);
        }

    }

}

Main함수를 실행하면, 아래와 같이 Customer 객체가 몽고 DB 리포지터리 인터페이스를 통해 저장되고, 읽어 올 수 있다는 것을 알 수 있습니다. 소스를 실행한 후 출력되는 로그는 아래 참조 바랍니다. 

Customers found with findAll():
-------------------------------
Customer[id=62905c9b222d993a15861001, firstName='Alice', lastName='Smith']
Customer[id=62905c9b222d993a15861002, firstName='Bob', lastName='Smith']

Customer found with findByFirstName('Alice'):
--------------------------------
Customer[id=62905c9b222d993a15861001, firstName='Alice', lastName='Smith']
Customers found with findByLastName('Smith'):
--------------------------------
Customer[id=62905c9b222d993a15861001, firstName='Alice', lastName='Smith']
Customer[id=62905c9b222d993a15861002, firstName='Bob', lastName='Smith']

만약 Springboot에서 MongoRepository beans를 찾을 수 없다고 한다면, build.gradle파일에서 몽고 DB 디펜던시를 아래와 같이 변경한 후, 프로젝트를 다시 열어주세요. 

implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'

MongoDB Document 조회하기

Springboot를 실행한 이후, MongoDB에 데이터가 정상적으로 저장되었는지 확인해보겠습니다. 먼저 Docker MongoDB에 접속합니다. MongoDB에 접속하여, Customer 컬렉션을 조회하면, Alice와 Bob 데이터가 저장되어 있는 것을 확인할 수 있습니다. 

# Docker MongoDB 컨테이너에 접속
docker exec -it mongodb-container bash

# Bash Shell에서 MongoDB에 접속하기
root@be14ab9634fa:/# mongo
MongoDB shell version v5.0.8
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f115d8d2-a1d8-4e23-8690-adf7d3c2bf4a") }
MongoDB server version: 5.0.8

# 컬렉션 조회하기
> db.customer.find()
{ "_id" : ObjectId("6290613d3ca81f4afba532c3"), "firstName" : "Alice", "lastName" : "Smith", "_class" : "com.example.demo.Customer" }
{ "_id" : ObjectId("6290613d3ca81f4afba532c4"), "firstName" : "Bob", "lastName" : "Smith", "_class" : "com.example.demo.Customer" }

 

728x90
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함