반응형

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 필드가 같이 저장된다.

+ Recent posts