티스토리 뷰
이번 포스팅에서는 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 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 디펜던시를 추가하여 스프링 부트 프로젝트를 다운로드합니다.
다운로드한 프로젝트에서 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 공식 문서를 참조 바랍니다.
마지막으로, 몽고 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" }
'IT 기술' 카테고리의 다른 글
Springboot에서 WebSocket으로 메세지 송수신하기 (0) | 2022.08.26 |
---|---|
Springboot에서 @Async로 비동기 처리 함수 작성하기 (0) | 2022.08.26 |
구글 키워드 검색량 조회하는 방법 (3) | 2022.08.25 |
Springboot에서 Database의 Transaction 관리하기 (1) | 2022.08.25 |
Springboot에서 HATEOAS 기반 RESTful API 개발하기 (0) | 2022.08.25 |
- Total
- Today
- Yesterday
- notion 업무일정관리
- 멀티코어 멀티프로세서
- 디자인패턴
- AWS
- 클린코드작성법
- API Gateway 캐싱
- 스프링부트실행
- springboot build
- selenium
- springboot rest api 서버
- codesmell 유형
- C++
- iframe 태그 찾기
- 스프링부트빌드
- springboot 실행
- 스프링부트 restapi
- SPA
- OSI 7계층
- 코드스멜 유형
- TCP/UDP
- notion
- MPA
- springboot restapi
- token
- 클린코드작성원칙
- oracle 메모리
- oracle pga sga
- 테스팅 자동화
- python
- 디자인패턴 구조패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |