MongoDB Atlas에서 Cluster 생성 후 Connect → Drivers → Java로 맞춘다음 uri 를 복사한다.
password만 Replace라고 나와있지만 아래처럼
mongodb+srv://<**UserName**>:<**password**>@<Cluster>.ergif.mongodb.net/<databaseName>?retryWrites=true&w=majority
? 앞에 데이터베이스 까지 적어줘야한다.
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
spring:
data:
mongodb:
uri: mongodb+srv://UserName:password@cluster.ergif.mongodb.net/database?retryWrites=true&w=majority
@SpringBootApplication
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = {
"com.challenge.chat.domain.chat.repository.mysql",
"com.challenge.chat.domain.member.repository"
})
@EnableMongoRepositories(basePackages = "com.challenge.chat.domain.chat.repository.mongo")
public class ChatApplication {
public static void main(String[] args) {
SpringApplication.run(ChatApplication.class, args);
}
}
만약 database를 여러개 사용할 경우 위와 같이
@EnableJpaRepositories에 basePackages 설정과
@EnableMongoRepositories에 basePackages 설정을 해줘야 한다.
@Getter
@Document(collection = "chat")
@NoArgsConstructor
public class Chat {
@Id
private String id;
private MessageType type;
private String sender;
private String userId;
private String roomId;
private String message;
private String date;
public Chat(ChatDto chatDto, MessageType messageType) {
this.type = messageType;
this.sender = chatDto.getSender();
this.userId = chatDto.getUserId();
this.roomId = chatDto.getRoomId();
this.message = chatDto.getMessage();
this.date = chatDto.getDate();
}
}
Document 경우 Id또한 String으로하는 이유는 @Id 로 PK를 설정하면 아래 사진과 같이 자동으로 중복되지 않은 ObjectId를 생성
MessageType 은 Enum 클래스이다. Enum, Long, Date, List 모두 잘 들어간다.
@Repository
public interface ChatRepository extends MongoRepository<Chat, String> {
List<Chat> findByRoomId(String roomId);
}
Spring Data MongoDB 를 지원하기 때문에 어느정도 메서드 쿼리를 사용할 수 있다.
@query 어노테이션을 사용할 수 있으며 MongoDB Json 쿼리를 직접 작성할 수 있다. 공식문서
@Configuration
public class MongoConfig {
// MongoDB 에 "_class" 들어가지 않게 설정
@Autowired
private MongoMappingContext mongoMappingContext;
@Bean
public MappingMongoConverter mappingMongoConverter(
MongoDatabaseFactory mongoDatabaseFactory,
MongoMappingContext mongoMappingContext
) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
return converter;
}
}
꼭 필요한 설정은 아니지만 위와 같이 설정을 해주지 않으면 _class 가 같이 저장된다.
MongoDB Atlas 를 사용한 이유는 Cloud 환경이라서 모니터링이나 접근이 쉽고 ubuntu나 Docker환경에서 따로 설치해주지 않고 연동이 쉽기 때문이다. 하지만 Atlas에서 DB를 생성할 때 무료버전은 512Mb로 제한이 있고 MongoDB를 따로 설치해서 사용하는 것과 어떤 차이가 있는지 알아보면 좋을 것 같다.