[MongoDB]스프링부트 프로젝트에 MongoDB 간단 적용(Local)

LeeYulhee·2023년 8월 16일
0

👉 MongoDB란?


  • MongoDB는 NoSQL 데이터베이스로, 특히 문서 기반의 데이터베이스로 분류
  • JSON과 유사한 형태의 BSON (Binary JSON) 형식으로 데이터를 저장
  • 스키마가 유연하며, 대규모 데이터와 분산 환경에 적합하게 설계



👉 MongoDB 다운로드


  • 💻 MongoDB 다운로드 사이트
    • Entetprise Server 다운로드 → 실행
    • 다운로드 팝업
      • Setup Type에서 Complete 선택
      • Service Configuration에서 ‘Install MongoD as a Service’, ‘Run service as Network Service user’ 선택
      • Install MongoDB Compass에서 Install MongoDB Compass 선택(GUI 툴)
  • 다운로드 후 환경변수에서 Path 설정
    • C:\Program Files\MongoDB\Server\7.0\bin
      • MongoDB 폴더에 bin이 있는 경로 설정
  • 다운로드 확인
    • 명령 프롬포트 창에 mongod --version 입력

💻 참고 사이트 : MongoDB 다운로드 방법 참고



👉 SpringBoot 프로젝트에 적용


💻 참고 코드 : springboot-webflux-mongo-chatapp

  • 해당 프로젝트 Gradle로 변경
    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
    	implementation 'org.springframework.boot:spring-boot-starter-webflux'
    	compileOnly 'org.projectlombok:lombok'
    	developmentOnly 'org.springframework.boot:spring-boot-devtools'
    	annotationProcessor 'org.projectlombok:lombok'
    	testImplementation 'org.springframework.boot:spring-boot-starter-test'
    	testImplementation 'io.projectreactor:reactor-test'
    }
  • 디렉토리 구조 및 프론트 파일의 위치
  • application.yml 코드 적용
    spring:
      data:
        mongodb:
          host: localhost
          port: 27017 # MongoDB 기본 포트
          database: chatdb # 해당 프로젝트 MongoDB 데이터베이스 이름
  • Chat.java 코드 변경(collation → collection)
    package com.ll.mongoChat;
    
    import lombok.Data;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    
    import java.time.LocalDateTime;
    
    @Data
    @Document(collection = "chat")
    public class Chat {
        @Id
        private String id;
        private String msg;
        private String sender; // 보내는 사람
        private String receiver; // 받는 사람 (귓속말)
        private Integer roomNum; // 방 번호
    
        private LocalDateTime createdAt;
    }
  • localhost:8080/chat.html로 접속하면 채팅 화면 볼 수 있음



👉 오류 발생(Mapping된 주소로 접속했을 경우)


  • 오류 내용

    [8a95178a-2] There was an unexpected error (type=Internal Server Error, status=500).
    Command failed with error 2 (BadValue): 'Field 'locale' is invalid in: { locale: "chat" }' on server localhost:27017. The full response is {"ok": 0.0, "errmsg": "Field 'locale' is invalid in: { locale: \"chat\" }", "code": 2, "codeName": "BadValue"}
    org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 2 (BadValue): 'Field 'locale' is invalid in: { locale: "chat" }' on server localhost:27017. The full response is {"ok": 0.0, "errmsg": "Field 'locale' is invalid in: { locale: \"chat\" }", "code": 2, "codeName": "BadValue"}
    	at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:140)
    	Suppressed: The stacktrace has been enhanced by Reactor, refer to additional information below: 
    Error has been observed at the following site(s):
    	*__checkpoint ⇢ Handler com.ll.mongoChat.ChatController#findByRoomNum(Integer) [DispatcherHandler]
    	*__checkpoint ⇢ HTTP GET "/chat/roomNum/1" [ExceptionHandlingWebHandler]
    • 📌 해결 방법
      • Document 디렉토리의 Chat.java 파일
        • @Document(collection = “chat”)로 변경
        • 다른 방법으로는 @Document(collation = "{ 'locale': 'en' }") 바꾸는 방법도 있다고 함
      • collection과 collation의 차이
        • collection : MongoDB의 컬렉션 이름을 지정하는 경우
        • collation : 문자열 정렬 순서를 설정하는 경우에 사용(콜레이션 규칙 설정)

  • 오류 내용

    2023-08-16T16:33:25.545+09:00 ERROR 10340 --- [ntLoopGroup-3-3] a.w.r.e.AbstractErrorWebExceptionHandler : [2cad4529-1]  500 Server Error for HTTP GET "/chat/roomNum/1"
    
    org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 2 (BadValue): 'error processing query: ns=chatdb.chat batchSize=2Tree: roomNum $eq 1
    Sort: {}
    Proj: {}
     tailable cursor requested on non capped collection' on server localhost:27017. The full response is {"ok": 0.0, "errmsg": "error processing query: ns=chatdb.chat batchSize=2Tree: roomNum $eq 1\nSort: {}\nProj: {}\n tailable cursor requested on non capped collection", "code": 2, "codeName": "BadValue"}
    	at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:140) ~[spring-data-mongodb-4.1.2.jar:4.1.2]
    	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
    Error has been observed at the following site(s):
    	*__checkpoint ⇢ Handler com.ll.mongoChat.ChatController#findByRoomNum(Integer) [DispatcherHandler]
    	*__checkpoint ⇢ HTTP GET "/chat/roomNum/1" [ExceptionHandlingWebHandler]
    • tailable cursor가 capped collection이 아닌 컬렉션에서 요청되었음을 의미

      • Tailable cursor는 capped collection에서만 사용할 수 있음
      • Capped collection은 MongoDB에서 고정된 크기를 갖는 특수한 타입의 컬렉션
      • 이 컬렉션에 데이터가 추가될 때 크기가 한도를 초과하면, 가장 오래된 데이터부터 자동으로 제거
    • 📌 해결 방법

      • 💻 MongoDB Shell 다운로드
      • 다운로드 받은 폴더 → bin → mongosh.exe 실행
      • 현재 설정한 DB 포트로 접속
        • mongodb://localhost:27017
      • 해당 데이터베이스로 이동
        • use chatdb
      • convertToCapped 명령어 입력
        • db.runCommand( { convertToCapped: 'chat', size: 8192 } )
      • 적용 여부 확인
        • db.chat.stats()
          • capped: true로 되어있으면 성공
      • exit으로 쉘 종료



👉 MongoDB Compass


  • 첫 화면에서 Connect(기본 포트가 27017)
  • 연결되면 프로젝트에서 생성한 이름의 데이터베이스가 생겨 있음
  • 확인해보면 해당 데이터베이스에 컬렉션이 생성되어 있고, 내부에 메세지 내용이 저장되어 있음
    • Find 버튼을 이용하면 새로고침
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글