SpringBoot와 MongoDB를 연결하고 MongoRepository를 사용해보자.
의존성 주입
pom.xml에 spring-boot-starter-data-mongodb를 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
MongoDB 접속 정보 세팅
application.yml에 mongodb connection을 위한 설정 값들을 세팅해줍니다. mongoDB의 기본 Connection String Format은 mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]] 입니다. 로컬 MongoDB 서버로 테스트하고 있기 때문에 아래와 같이 connectionString을 설정해줍니다.
# mongodb
mongodb:
test:
connectionString: mongodb://localhost:27017/test
MongoDB와 연결을 위한 connectionString을 지정했으니 이를 통해 mongoDatabaseFactory와 mongoTemplate 빈을 생성해줍니다.
@Configuration
public class MongoDBConfig {
@Value("${mongodb.test.connectionString}")
private String connectionString;
@Bean
public MongoDatabaseFactory mongoDatabaseFactory() {
return new SimpleMongoClientDatabaseFactory(connectionString);
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoDatabaseFactory());
}
}
Model 객체 생성
유저의 성(firstName)과 이름(lastName)을 갖는 Customer 도큐먼트를 정의합시다. DB에 저장될 document의 이름은 @Documemt 애노테이션을 통하여 지정해줍니다. MongoDB의 모든 도큐먼트는 반드시 _id 라는 주키를 갖게 됩니다. @Id 애노테이션은 해당 필드에 대해 주키로 지정하겠다는 의미를 가집니다.
static final 문자열들은 document에 대한 쿼리에서 필드 이름을 사용하기 위해 선언하였습니다.
@Document(collection = "customer")
public class Customer {
public static final String ID = "id";
public static final String FIRST_NAME = "firstName";
public static final String LAST_NAME = "lastName";
@Id
private String id;
private String firstName;
private String lastName;
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "Customer{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
}
Run
mongoTemplate 기능을 확인해 보겠습니다. MongoTemplate 빈을 @Autowired를 통해 주입받습니다.
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private MongoTemplate mongoTemplate;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
Customer customer1 = new Customer("son", "changwoo");
Customer customer2 = new Customer("son", "jeehoon");
// insert
mongoTemplate.insertAll(Arrays.asList(customer1, customer2), Customer.class);
// get
List<Customer> result = mongoTemplate.find(
Query.query(Criteria.where(Customer.FIRST_NAME).is("son")),
Customer.class);
System.out.println(result);
}
}
Spring Data의 Repository를 상속하여 구현하지는 않았기에 메서드에 대한 findBy** 패턴의 여러 메서드들은 지원되지 않습니다. 하지만 Query와 Criteria를 조합하여 다양한 쿼리를 직접 만들어 실행할 수 있습니다.