Spring Boot에서 MongoDB Atlas 연결하기 ( Mysql + MongoDB )

murphytklee·2023년 5월 31일
1
post-thumbnail

MongoDB Atlas에서 Cluster 생성 후 Connect → Drivers → Java로 맞춘다음 uri 를 복사한다.

password만 Replace라고 나와있지만 아래처럼

mongodb+srv://<**UserName**>:<**password**>@<Cluster>.ergif.mongodb.net/<databaseName>?retryWrites=true&w=majority

? 앞에 데이터베이스 까지 적어줘야한다.

build.gradle


implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'

Application.yml

spring:
	data:
    mongodb:
      uri: mongodb+srv://UserName:password@cluster.ergif.mongodb.net/database?retryWrites=true&w=majority

Application

@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 설정을 해줘야 한다.


Document


@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

@Repository
public interface ChatRepository extends MongoRepository<Chat, String> {

    List<Chat> findByRoomId(String roomId);
}

Spring Data MongoDB 를 지원하기 때문에 어느정도 메서드 쿼리를 사용할 수 있다.

@query 어노테이션을 사용할 수 있으며 MongoDB Json 쿼리를 직접 작성할 수 있다. 공식문서


Config

@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를 따로 설치해서 사용하는 것과 어떤 차이가 있는지 알아보면 좋을 것 같다.

0개의 댓글