이번 글에서는 Spring Boot MongoDB 세팅과 어떻게 사용하는지 간략하게 파악해볼 간단한 데모 앱을 만들겠습니다.

 

개발 환경 : STS 4.8.1, JDK 11, Spring Boot 2.6.2 Mongo 5.0.5 Community, Maven 4.0.0

 

1. Spring Boot 프로젝트 생성 

Spring Stater Project 생성하고 중간 의존성 설정 단계에서 아래와 같이 설정하고 생성합니다.

프로젝트, 패키지 명은 적절하게 설정해주세요.

저는 SpringbootMongoDbDemo, com.example.demo 라고 설정했습니다.

 

아래와 같은 구조를 가진 프로젝트가 생성된 것을 확인할수있습니다.

Customer, CustomerRepository 파일은 다음 과정에서 생성할 파일들입니다.

 

 

2. application.properties 파일 설정

설치된 MongoDB는 테스트를 위한 기본 버전으로 username과 password 설정이 없어서 주석처리했습니다.

별도의 Mongo 설정 없이 아래의 설정만으로도 MongoDB에 액세스 가능합니다.

보통 기본 uri가 localhost를 많이 쓰고 database는 미리 test로 생성했습니다.

spring.data.mongodb.uri=mongodb://localhost:27017
spring.data.mongodb.database=test
#spring.data.mongodb.username=
#spring.data.mongodb.passwrod=

 

3. Customer 객체 생성

Spring boot에서 Mongo를 사용 가능한 방법은 스프링 가이드를 참고해보면

크게 2가지 정도인데, 간단한 CRUD 처리는 MongoRepository를 사용하면 되고

조금 복잡한 작업을 위해서는 MongoTemplate 사용하면 됩니다.

이번 글에서는 MongoRepository 로 간략한 CRUD 테스트를 진행해보겠습니다.

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;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

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

@Id는 MongoDB의 _id로 맵핑.

이름을  구성하는 아주 간단한 객체입니다.

 

4. CustomerRepository Interface 생성

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를 상속받는 인터페이스를 생성합니다. 

findByFirstName 메소드 성을 기준으로 Customer를 조회 가능하며,

findByLastName 메소드 이름을 기준으로 Customer 목록을 조회 가능합니다.

 

5. CommandLineRunner 생성 및 서버 스타트

자동 생성된 SpringbootMongoDbDemoApplication.java 파일로 이동하여 CommandLineRunner 구현해줍니다.

Overide된 run 메소드 안에 CRUD 테스트 코드를 작성하고 Boot Dashboard에서 서버를 Start 합니다.

 

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 SpringbootMongoDbDemoApplication implements CommandLineRunner {

	@Autowired
	private CustomerRepository repository;
	
	public static void main(String[] args) {
		SpringApplication.run(SpringbootMongoDbDemoApplication.class, args);
	}
	
	@Override
	public void run(String... args) throws Exception {

		// 최초 실행시 삭제
		repository.deleteAll(); 
		
		// Customer 객체 생성
		Customer Bob = new Customer("Bob", "Smith");
		Customer John = new Customer("John", "Smith");
		Customer Alice = new Customer("Alice", "Smith");
		
		// mongoDB에 insert 수행.
		repository.save(Bob);
		repository.save(John);
		repository.save(Alice);
		
		// mongoDB에 Update 수행.
		Alice.setFirstName("Alice");
		Alice.setLastName("Chris");
		repository.save(Alice);
		
		// mongoDB에 조회 수행.
		Customer temp = repository.findByFirstName("Bob");
		// mongoDB에 삭제 수행.
		repository.delete(temp);
		
		System.out.println("Customers found with findAll():");
		System.out.println("-------------------------------");
		for (Customer customer : repository.findAll()) {
			System.out.println(customer);
		}
		System.out.println();

		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);
		}
		
	}
}

 

로그를 확인해보면 작성한 코드대로 CRUD가 이뤄진 것을 확인 가능합니다.

 

6. MongDB Compass 툴로 데이터 확인

해당 툴은 MongoDB Compass 시 기본 설치되는 툴입니다.

MongoDB Compass 툴로 접속하여 정보를 다시 확인해보겠습니다.

Document에서 데이터를 확인가능합니다.

해당 코드는 Github에서도 확인 가능하며, 하단의 spring 가이드를 토대로 일부 수정됐습니다.

 

7. 마치며

JPA Demo를 예전에 만들어본적이 있는데요.

블로그에는 추후에 올릴 예정이지만 JPA Repository 와 거의 유사한 패턴을 가지고 있습니다.

경험이 있는 분들이라면 아마 어렵지 않게 작성가능하지 않을까 싶습니다.

 

참고 : https://spring.io/guides/gs/accessing-data-mongodb/

MongoDB는 크게 Community, Enterprise, Atlas 버전으로 나뉩니다.

Atlas는 쉽게 말하면 Enterprise 버전의 Cloud 버전이라고 보면 됩니다.

당연히 Enterprise 버전이 지원되는 기능도 많고, 가장 중요한 무료/유료 차이점이 있습니다.

앞으로 간단하게 Demo를 만들어볼 생각이기 때문에 Community 버전으로 설치를 진행해보겠습니다.

 

1. Community 버전 다운로드 및 설치

https://www.mongodb.com/try/download/community?tck=docs_server 

 

MongoDB Community Download

Download the Community version of MongoDB's non-relational database server from MongoDB's download center.

www.mongodb.com

2. 설치 시 설치 경로 등은 적절하게 필요에 따라 설치해주세요.

중간에 Compass 설치하는지 동의 여부가 체크가 되어 있는데 Client 툴로 보면 되고, robo 3T 같은 다른 툴도 존재합니다.

 

3. 설치가 완료되면 시스템 환경 변수를 등록합니다.

 (MongoDB설치경로\bin)

 

4. DB 디렉터리 생성

터미널 창을 열고 mongod를 입력/실행하면 로그를 확인할 수 있습니다.

 

{"error":"NonExistentPath: Data directory C:\\data\\db\\ not found. Create the missing directory or specify another path using (1) the --dbpath command line option, or (2) by adding the 'storage.dbPath' option in the configuration file."}}

 

로그 내용 중에 위와 같은 에러가 발생한 것을 확인할 수 있는데 로컬 디스크 C 하위에 data/db 폴더를 만들어주거나

--dbpath 옵션과 argument로 Data directory 경로를 직접 지정해 주면 해결이 가능합니다.

 

5. 서비스 확인

다시 터미널 창에서 mongod를 입력하면 Waiting for connections라는 문구가 나오고 mongoDB가 정상 동작 중인 것이고 로그를 통해 확인할 수 있는 것은 address=127.0.0.1(localhost), port=27017입니다. 브라우저 창을 실행하여

주소에 localhost:27017 을 입력하면 아래와 같은 메시지가 나오면 기본적인 설치가 완료됐습니다.

 

It looks like you are trying to access MongoDB over HTTP on the native driver port.

 

6. Mongo Compass 실행

프로그램 목록에서 찾아 실행시키고 아래 화면에서 Fill in connection fields individually 를 클릭하고

정보를 입력하면 DB에 접속하여 DB 정보들을 확인 가능합니다.

 

'DB > MongoDB' 카테고리의 다른 글

MongoDB 소개  (0) 2022.01.18

1. 소개

일반적으로 널리 쓰이는 관계형 데이터베이스(MySQL 등)는 데이터 중복을 제거하고 무결성을 보장하기 위해

정규화를 하게 되어 있는데 이러한 정규화가 과도해지면 어떤 데이터를 추출하기 위해 많은 조인 작업이 필요하고

인해 성능 저하가 있을수 있습니다.

하지만 NoSQL[각주:1]은 아래 구조처럼 중첩 데이터 형태를 가지므로 불필요한 조인을 최소화합니다.

NoSQL 데이터베이스는 소개하려는 MongoDB 를 포함해서 Redis 등 종류가 다양한 편이고 각각 구조에 차이가 조금씩 있습니다. 

 

2. 관계형 데이터 베이스와 비교한 MongoDB 논리적 구조

관계형 데이터베이스 MongoDB
Table Collection
Row Document
Column Field
Primary Key Object_ID field
Relationship Embbeded, Link

아래 이미지는 실제 MongoDB Compass에서 조회한 Customer Collection의 Document 예시입니다.

 

3. 특징

NoSQL 데이터베이스의 한 종류이기 때문에 비슷한 특징을 가집니다.

관계형 데이터베이스와 비교해봤는데요. 절대적인 내용이 아니라 일반적 관점에서 비교한 내용이

참고해주시기 바랍니다.

예를 들어 관계형 데이터베이스라고 해도 Scale-Up 가능한 것은 아닙니다.

MySQL 같은 경우 MySQL Cluster 같은 기능으로 Scale-Out 이 가능합니다.

  관계형 데이터베이스 MongoDB
적합한 시스템 데이터 정합성이 보장되어야하는 시스템 가용성이 중요하고 낮은 지연이 필요한 시스템
구조 정규화, 무결성이 보장된 스키마 스키마 없는 자유로운 모델 
트랜잭션 ACID 지원 완화된 ACID 지원
확장 Scale-Up Scale-Out
API SQL  객체 기반 API 제공

 

4. 마치며

여기까지 간략하게 소개와 특징들을 관계형 데이터베이스와 비교해보았고

실무에서 Redis를 먼저 접해 봤기 때문에 어떤 사례에 적합한지는 미리 경험을 해보았습니다.

빠른 응답과 빈번한 데이터 처리가 필요한 좋아요 같은 기능에 적용해보면 좋을 것 같고

Oauth 구조에서 Refresh Token 체킹 하는 기능에도 적용해보면 좋을 것 같은 생각이 듭니다.

이론적인 정리 내용은 이만 줄이고 MongoDB 기본 설치와 Spring boot를 활용한 Demo앱 제작을 다음 단계로

진행해보겠습니다.

 

  1. 비관계형 데이터베이스를 지칭. [본문으로]

'DB > MongoDB' 카테고리의 다른 글

MongoDB 설치  (0) 2022.01.19

오래전 기술 블로그를 하다가 신규 프로젝트 등 여러가지 사정으로 중단을 하고

개인적으로만 학습하고 대충 정리해놨는데 복습하는 차원에서 재정리하여 공유해보려고합니다.

정리하면서 새로 습득하는 부분들도 추가로 작성할 예정입니다.

+ Recent posts