목차

  1. IntelliJ 클래스 생성
    1. Chat.java
    2. ChatRepository
      1. @Tailable
      2. Cursor (커서)
      3. @Query
      4. Flux<Chat>
      5. Flux
  2. 터미널 테스트
    1. Mongo 테스트 (구 버젼)
    2. Mongosh 테스트 (신 버젼)
  3. http 테스트
    1. postman

 

 

✅ IntelliJ 클래스 생성

 

1️⃣Chat.java

package com.cos.chatapp.chat;

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 LocalDateTime createAt;    // 메세지 생성 시간
}

 

 

 

2️⃣ChatRepository (인터페이스)

package com.cos.chatapp.chat;

import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.data.mongodb.repository.Tailable;
import reactor.core.publisher.Flux;

public interface ChatRepository extends ReactiveMongoRepository<Chat, String> {           // Chat의 id가 String 타입이라서 <Chat, String> 으로 세팅

     @Tailable      // 커서를 안 닫고 계속 유지하는 어노테이션
     @Query("{sender: ?0, receiver: ?1}")
     Flux<Chat> mFindBySender(String sender, String receiver);   // Flux : 흐름, response를 유지하면서 데이터를 계속 흘려보냄 (자세한건 찾아보기)
}

✔️ @Tailable : 커서를 닫지 않음으로써 새로운 데이터가 삽입되면 실시간으로 읽어들일 수 있음 (서버에 신규 데이터가 들어오면 해당 어노테이션을 통해 읽을 수 있게 됨)

✔️ cursor (커서) : 데이터베이스에서 쿼리의 결과 집합을 탐색할 때 사용하는 포인터로, MongoDB에서는 커서를 사용하여 쿼리 결과를 순차적으로 읽어들임

✔️ @Query : MongoDB 쿼리를 정의

✔️ Flux<Chat> : Flux 타입을 사용하여, 여러 개의 Chat 객체를 비동기적으로 스트림 방식으로 처리할 수 있음

✔️ Flux : 여러 개의 항목(데이터)을 비동기적으로 처리할 수 있는 스트림으로, 업데이트된 신규 데이터를 클라이언트에게 보내기 위해 요청과 응답이 완료되어도 연결이 끊기지 않고 서버에서 데이터를 계속 흘려보냄

 

 


 

✅ 터미널 테스트

 

 

1️⃣Mongo 테스트 (구 버젼)

  • mongo : mongo 접속
  • use chat : 데이터베이스를 chat으로 생성
  • db.데이터베이스.save({ }); : 데이터 저장
  • db.데이터베이스.find().pretty(); : 저장된 데이터 모두 보기
  • db.데이터베이스.find({sender:'test1', receiver:'test2'}).pretty(); : 발송인이 test1, 수신인이 test2인 데이터 보기
    ✔️ select : CharRepository에서 설정한 @Query에 의해 사용 가능한 문법
  • exit : mongo 종료

 

 

 

2️⃣Mongosh 테스트 (신 버젼)

  • mongosh : mongosh 접속
  • use chat : 데이터베이스를 chat으로 생성
  • db.데이터베이스.insertOne({ }); : 데이터 하나만 저장
  • db.데이터베이스.insertMany({ }); : 데이터 여러 개 저장
  • db.데이터베이스.find().pretty(); : 저장된 데이터 모두 보기
  • db.데이터베이스.find({sender:'test1', receiver:'test2'}).pretty(); : 발송인이 test1, 수신인이 test2인 데이터 보기
    ✔️ select : CharRepository에서 설정한 @Query에 의해 사용 가능한 문법
  • exit : mongosh 종료

 

 


 

 

✅ http 테스트

 

1️⃣ChatController.java

package com.cos.chatapp.chat;

import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

import java.time.LocalDateTime;

@RestController     // 데이터 리턴 서버
@RequiredArgsConstructor      // 생성자 생성
public class ChatController {

     private final ChatRepository chatRepository;

     @GetMapping(value="/sender/{sender}/receiver/{receiver}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
     public Flux<Chat> getMsg(@PathVariable String sender, @PathVariable String receiver){
          return chatRepository.mFindBySender(sender, receiver)
              .subscribeOn(Schedulers.boundedElastic());
     }

     @PostMapping("/chat")
     public Mono<Chat> setMsg(@RequestBody Chat chat){
          chat.setCreateAt(LocalDateTime.now());
          return chatRepository.save(chat);
     }
}

 

 

 

2️⃣postman으로 데이터 전송

{"sender": "test01", "receiver": "test02", "msg": "테스트입니다ㅏ."}

 

 

 

3️⃣http로 확인

http://localhost:8080/sender/발신자/receiver/수신자

✔️ 발신자, 수신자 : postman에서 전달한 데이터에 맞춰서 test01, test02로 입력

✔️ 에러 발생 : @Tailable 사용 시, 버퍼 사이즈가 커야 하는데 그러지 못해 발생한 에러

 

 

 

4️⃣버퍼 사이즈 키우기

db.runCommand({convertToCapped: 'chat', size: 8192});

✔️ 'chat' : 컬렉션 <chat>을 지칭

✔️ size: 8192 : 8192 byte로 키우겠다는 의미

 

 

 

5️⃣http 재확인

http://localhost:8080/sender/발신자/receiver/수신자

✔️ 상단바에 동그라미(로딩)가 계속 돌아가는 이유 : ChatController의 @Getmapping에서 Flux로 스트림을 계속 흘려보내고 있기 때문

 

 

✔️ 데이터 추가 전송 : http에서 실시간으로 업데이트가 되고, 내용 확인이 가능

 

'SpringBoot > proj' 카테고리의 다른 글

[IntelliJ] 초기 설정  (0) 2024.07.25
[MongoDB] 설치 및 실행(Mac 💻)  (0) 2024.07.24

+ Recent posts