목차
- IntelliJ 클래스 생성
- Chat.java
- ChatRepository
- @Tailable
- Cursor (커서)
- @Query
- Flux<Chat>
- Flux
- 터미널 테스트
- Mongo 테스트 (구 버젼)
- Mongosh 테스트 (신 버젼)
- http 테스트
- 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 |