Spring Boot 에서 MongoDB Atlas 로 구성한 MongoDB Cluster 에 연결하는 방법을 정리했습니다.
위 MongoDB 접속 경로는 application.yml 파일에서 사용합니다.
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "user")
public class User {
@Id
private String id;
private String name;
}
public interface UserRepository extends MongoRepository<User, String> {
}
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
public String create(String name) {
User user = User.builder()
.name(name)
.build();
return userRepository.save(user).getId();
}
public User read(String id) {
return userRepository.findById(id).orElse(null);
}
public User update(String id, String name) {
User user = userRepository.findById(id).orElse(null);
assert user != null;
user.setName(name);
return userRepository.save(user);
}
public void delete(String id) {
userRepository.deleteById(id);
}
}
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/v1/user")
public class UserController {
private final UserService userService;
@PostMapping("")
public String create(@RequestParam String name) {
return userService.create(name);
}
@GetMapping("")
public User read(String id) {
return userService.read(id);
}
@PutMapping("")
public User update(String id, String name) {
return userService.update(id, name);
}
@DeleteMapping("")
public void delete(String id) {
userService.delete(id);
}
}
@SpringBootApplication
@EnableMongoRepositories // MongoRepository 사용하기 위함
public class MongodbApplication {
public static void main(String[] args) {
SpringApplication.run(MongodbApplication.class, args);
}
}
spring:
data:
mongodb:
uri: mongodb+srv://<username>:<password>@<cluster>.*.mongodb.net/<database>?retryWrites=true&w=majority
문제 상황
- 하지만 이렇게 실행하게 되면 아래 이미지와 같이 DB 경로를 찾지 못하는 에러가 발생합니다.
해결 방법
- application.yml 의 설정만 있으면 application 단과 mongoDB 접속이 가능하므로 DataSourceAutoConfiguration 자체를 bean 생성 과정에서 제외시킵니다.
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableMongoRepositories // MongoRepository 사용하기 위함 public class MongodbApplication { public static void main(String[] args) { SpringApplication.run(MongodbApplication.class, args); } }
@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration {
@Value("${spring.data.mongodb.uri}")
private String uri;
@Value("${spring.data.mongodb.database}")
private String databaseName;
@Override
protected String getDatabaseName() {
return databaseName;
}
@Override
public MongoClient mongoClient() {
ConnectionString connectionString = new ConnectionString(uri);
MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.build();
return MongoClients.create(mongoClientSettings);
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(new SimpleMongoClientDatabaseFactory(mongoClient(), getDatabaseName()));
}
}
@RequiredArgsConstructor
@Service
public class UserService {
private final MongoTemplate mongoTemplate;
public String create(String name) {
User user = User.builder()
.name(name)
.build();
return mongoTemplate.insert(user, "user").getId();
}
public User read(String id) {
Query query = new Query(Criteria.where("id").is(id));
return mongoTemplate.findOne(query, User.class, "user");
}
public User update(String id, String name) {
Query query = new Query(Criteria.where("id").is(id));
Update update = new Update().set("name", name);
return mongoTemplate.findAndModify(query, update, User.class, "user");
}
public void delete(String id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query, User.class, "user");
}
}
MongoDB 가이드를 보고 똑같이 따라했지만 DB Driver 를 찾지 못한다는 에러가 계속 발생했고 stack overflow 검색 결과 같은 문제에서 DataSourceAutoConfiguration 을 제외하라는 답변을 발견했고 해결은 되었지만 왜 이렇게 해야만 하는지 궁금하여 이번 기회에 디버깅했습니다. 확실히 Spring 에서 제공하는 코드들을 한 줄씩 체크하며 따라가보니 코드의 흐름과 데이터베이스에 연결하는 원리를 이해하는데 도움이 된 것 같습니다. 디버깅을 자주 하는 습관을 들여야겠습니다.