25.02.14 TIL MongoDB

신성훈·2025년 2월 14일

TIL

목록 보기
133/162

1. MongoDB란?

MongoDB는 NoSQL (Not Only SQL) 데이터베이스로 관계형 데이터베이스(RDBMS)와 달리 스키마가 없고(JSON 기반), 유연한 데이터 구조를 제공합니다.
MongoDB는 데이터를 문서(Document) 형태로 저장하며 테이블과 행이 아닌 컬렉션(Collection)과 도큐먼트(Document) 구조를 사용합니다.


2. MongoDB의 주요 개념

개념설명
Database여러 개의 컬렉션을 포함하는 논리적 저장소
Collection여러 개의 도큐먼트(Document)로 구성된 데이터 그룹
DocumentMongoDB에서 저장하는 JSON 형식의 데이터 단위
FieldDocument 내부의 key-value 데이터
Index데이터를 빠르게 조회할 수 있도록 지원
Replica Set데이터의 가용성을 높이기 위한 복제본 설정
Sharding대량의 데이터를 여러 서버에 분산 저장하는 방식

3. MongoDB의 특징

1) 스키마가 없는 유연한 데이터 구조

  • 테이블 없이 JSON 형식으로 데이터를 저장하여 유연한 스키마를 제공함
  • 동적으로 컬럼(필드)을 추가/삭제 가능

2) 높은 확장성

  • 수평적 확장(Sharding) 지원
  • 데이터가 커지면 여러 서버에 분산하여 저장

3) 빠른 읽기/쓰기 성능

  • Index 지원으로 빠른 조회 가능
  • 메모리 내 연산이 가능하여 성능 최적화

4) 복제(Replication) 및 자동 장애 조치

  • Replica Set을 이용해 장애 발생 시 자동 복구 가능

5) 트랜잭션 지원 (ACID 일부 적용 가능)

  • MongoDB 4.0 이후부터 다중 문서 트랜잭션 지원

4. MongoDB vs RDBMS 비교

비교 항목MongoDB (NoSQL)RDBMS (MySQL, PostgreSQL 등)
데이터 구조JSON 기반 문서(Document)테이블(Row, Column)
스키마없음 (유연함)고정 스키마
확장성수평적 확장 (Sharding)주로 수직적 확장
트랜잭션기본적으로 약함 (4.0부터 지원)강력한 ACID 지원
조인(Join)직접 지원하지 않음 (Embedding, Lookup 사용)기본 지원
쿼리 언어BSON 기반 쿼리SQL
성능대량의 데이터에 유리복잡한 관계형 데이터 처리에 유리
  • MongoDB는 유연한 데이터 구조와 확장성 덕분에 빠르게 변화하는 데이터 환경에 적합하지만 RDBMS보다 데이터 무결성 보장이 약할 수 있습니다.

5. MongoDB 주요 명령어 (CRUD)

1) 데이터베이스 연결

mongo

2) 데이터베이스 생성 및 사용

use myDatabase;

3) 컬렉션 생성

db.createCollection("users");

4) 데이터 삽입 (Create)

db.users.insertOne({
    name: "Alice",
    age: 25,
    hobbies: ["reading", "traveling"]
});
db.users.insertMany([
    { name: "Bob", age: 30 },
    { name: "Charlie", age: 35 }
]);

5) 데이터 조회 (Read)

db.users.find();
db.users.find({ age: { $gt: 25 } });  // 나이가 25보다 큰 데이터 조회

6) 데이터 수정 (Update)

db.users.updateOne({ name: "Alice" }, { $set: { age: 26 } });
db.users.updateMany({ age: { $lt: 30 } }, { $set: { status: "young" } });

7) 데이터 삭제 (Delete)

db.users.deleteOne({ name: "Alice" });
db.users.deleteMany({ age: { $lt: 30 } });

6. Spring Boot에서 MongoDB 사용

1) 의존성 추가 (pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2) MongoDB 설정 (application.properties)

spring.data.mongodb.uri=mongodb://localhost:27017/myDatabase

3) 도큐먼트 모델 생성 (User.java)

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

@Document(collection = "users")
public class User {
    @Id
    private String id;
    private String name;
    private int age;

    // 생성자, Getter, Setter
}

4) Repository 인터페이스 생성 (UserRepository.java)

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

public interface UserRepository extends MongoRepository<User, String> {
    User findByName(String name);
}

5) 서비스 및 컨트롤러 구현

import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }
}
  • Spring Boot와 MongoDB를 함께 사용하면 JPA와 유사한 방식으로 쉽게 데이터를 관리할 수 있습니다.

7. MongoDB의 장점과 단점

- 장점

  • 유연한 데이터 모델 → JSON 기반으로 저장하여 변경이 용이
  • 수평 확장 가능(Sharding) → 대량의 데이터 처리에 적합
  • 빠른 읽기/쓰기 성능 → 복잡한 JOIN이 필요하지 않은 경우 유리
  • 다양한 데이터 타입 지원 → Array, Object 등

- 단점

  • 복잡한 관계형 데이터 처리 불리 → JOIN 미지원 (Lookup으로 가능하지만 성능 저하)
  • 트랜잭션 기능 부족 → RDBMS만큼 강력한 ACID 지원 부족
  • 메모리 사용량 많음 → 인덱싱과 이중 저장 구조(BSON)로 인해 공간 사용 증가

8. MongoDB 사용 사례

  1. 로그 데이터 저장 (대량의 실시간 로그 데이터 저장)
  2. IoT 데이터 관리 (JSON 기반으로 센서 데이터 저장)
  3. 소셜 미디어 플랫폼 (유저 프로필, 게시글 저장)
  4. 캐싱 및 세션 관리 (Redis와 함께 사용 가능)
  5. 추천 시스템 (빅데이터 분석 및 처리)

9. 마무리

MongoDB는 유연성과 확장성이 뛰어나며 빠르게 변화하는 데이터 구조를 다룰 때 유용합니다.
Spring Boot와 결합하면 쉽게 사용할 수 있지만 관계형 데이터가 중요한 경우 RDBMS가 더 적합할 수도 있습니다.
프로젝트에 맞는 데이터베이스를 선택하는 것이 중요하다는 것을 다시 한번 깨달았습니다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글