스프링부트 채팅서버 만들기 - 4강 @Tailable

치즈말랑이·2022년 1월 5일
0
post-custom-banner

Chat.java

package com.cos.chatapp;

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") // collection 이름 설정
public class Chat {

    @Id
    private String id;
    private String msg;
    private String sender; // 보내는 사람
    private String receiver; // 받는 사람

    private LocalDateTime createdAt;
}

@Data

@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode을 한꺼번에 설정해주는 매우 유용한 어노테이션

클래스 레벨에서 @Data 어노테이션을 붙여주면, 모든 필드를 대상으로 접근자와 설정자가 자동으로 생성되고, final 또는 @NonNull 필드 값을 파라미터로 받는 생성자가 만들어지며, toStirng, equals, hashCode 메소드가 자동으로 만들어진다.
(출처: https://www.daleseo.com/lombok-popular-annotations/)

ChatRepository.java

package com.cos.chatapp;

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> {

    @Tailable // 커서를 안닫고 계속 유지한다.
    @Query("{sender:?0,receiver:?1}") // MongoDB 문법
    Flux<Chat> mFindBySender(String sender, String receiver); // Flux(흐름) response를 유지하면서 데이터를 계속 흘려보내기
}

일반적인 Http 프로토콜을 사용하면 예를들어 데이터가 1,2,3 건 있을때 이것들을 한번에 모아 처리한다.
하지만 채팅은 이렇게 하면 안되고 데이터가 요청될때마다 응답해야하므로 SSE 프로토콜을 사용한다.

@Tailable은 데이터를 하나 보낸 후에 닫는게 아니라 계속 커서를 유지해서 데이터가 들어오면 받게 한다.

@Query는 sender와 receiver에 지정된 이름에 따라 db에서 찾겠다는 뜻이다.

Flux는 데이터를 한번만 받고 닫는게 아니라 들어오는 대로 계속 흘려보내 response를 유지한다.

MongoDB 명령어

  • show collections;
    collection의 목록을 띄운다.
  • use chat;
    이름이 chat인 collection을 선택한다.
  • db.chat.find();
    chat에 있는 데이터를 가져온다.
  • db.chat.save({sender:'cor', receiver:'ssar', msg:'응반가워'});
    chat에 json형태의 데이터를 저장한다.
  • db.chat.find().pretty();
    chat에 있는 데이터를 가독성 좋게 가져온다.
  • db.chat.find({sender:'cos', receiver:'ssar'}).pretty();
    json형식의 데이터를 찾아 가져온다.
profile
공부일기
post-custom-banner

0개의 댓글