반응형
0. Atlas
MongoDB Atlas에서 Cluster 생성 후 Connect → Drivers → Java로 맞춘다음 uri 를 복사한다.
password만 Replace라고 나와있지만 아래처럼
uri
mongodb+srv://<**UserName**>:<**password**>@<Cluster>.ergif.mongodb.net/<databaseName>?retryWrites=true&w=majority
<>안에 있는 항목인 UserName, password, databaseName을 적어준다.
1. build.gradle
gradle
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
2. Application.yml
yml
spring:
data:
mongodb:
uri: mongodb+srv://UserName:password@cluster.ergif.mongodb.net/database?retryWrites=true&w=majority
3. Application.java
java
@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 설정을 해줘야 한다.
4. Document
java
@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();
}
}
MongoDB는 Document 모델의 NoSQL DataBase다. 따라서 @Entity 대신 @Document를 사용한다.
Id또한 String으로하는 이유는 @Id 로 PK를 설정하면 자동으로 중복되지 않은 ObjectId를 생성하며 String 값이기 때문이다.
MessageType 은 Enum 클래스이며 Enum, Long, Date, List 모두 잘 들어간다.
5. Repository
java
@Repository
public interface ChatRepository extends MongoRepository<Chat, String> {
List<Chat> findByRoomId(String roomId);
}
Spring Data MongoDB 를 지원하기 때문에 어느정도 메서드 쿼리를 사용할 수 있다.
@query 어노테이션을 사용할 수 있으며 MongoDB Json 쿼리를 직접 작성할 수 있다. 공식문서
6. Config
java
@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 필드가 같이 저장된다.
'DataBase' 카테고리의 다른 글
[Database] Index, 인덱스란? (구조, 종류, 동작 원리, 장단점 및 주의 사항) (1) | 2025.04.17 |
---|---|
[Oracle] ROW_NUMBER() OVER(PARTITION BY) (0) | 2025.04.11 |
[Database] PL/SQL 이란? Procedure와 Java 프로그래밍의 차이와 생각 (0) | 2025.04.08 |
[Database] 채팅 시스템 NoSQL 특성 및 비교 분석(CAP, PACELC) (1) | 2025.02.07 |