📕 배포 환경에서 RDBMS를 NoSql로 적용하기
@Getter
@NoArgsConstructor(access = PROTECTED)
@Document(collection = "chat")
@SuperBuilder
public class ChatMessage {
@Id
private String id;
private String content;
private Long senderId;
private String senderUsername;
private String senderAvatar;
private Long chatRoomId;
private Long chatId;
private LocalDateTime createDate;
@Enumerated(STRING)
private ChatMessageType type;
public static ChatMessage create(String content, Long senderId, String senderUsername, String senderAvatar, ChatMessageType chatMessageType, Long chatRoomId) {
ChatMessage chatMessage = ChatMessage.builder()
.content(content)
.senderId(senderId)
.senderUsername(senderUsername)
.senderAvatar(senderAvatar)
.type(chatMessageType)
.chatRoomId(chatRoomId)
.createDate(LocalDateTime.now())
.build();
return chatMessage;
}
}
- Entity로 되어있던 것을 MongoDB로 바꾸면서 RDBMS에 연관관계 설정을 끊어주고 @Document(collection = "chat")로 MongoDB 설정을 해준다.
- 위에 어노테이션을 보면 Entity가 사라지고 @Document로 대신하는것을 볼 수 있다.
public interface DmMessageRepository extends MongoRepository<DmMessage, Long> {
List<DmMessage> findByDmId(Long dmId);
}
- repository에서도 JPA설정을 끊어주고 MongoRepository를 설정해준다.
- 사용법은 JPA랑 많이 비슷하여 JPA를 사용해봤다면 쉽게 사용할 수 있을 것이다.
@NoRepositoryBean
public interface MongoRepository<T, ID>
extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
<S extends T> S insert(S entity);
<S extends T> List<S> insert(Iterable<S> entities);
@Override
<S extends T> List<S> findAll(Example<S> example);
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);
}
- 이와 같이 JPA랑 비슷한걸 확인할 수 있습니다.
spring:
data:
mongodb:
host: host
port: portNumber
database: chat
username: [username]
password: [password]
authentication-database:
- yml에 DB설정하는 것처럼 username과 password를 연결해주고 database를 통해서 DB를 만들어줍니다.