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;
}
@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 명령어