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에 spring.data.mongodb 하위 mongodb 설정 값들을 세팅해줍니다. 자세한 properties에 대하여 알고 싶다면 org.springframework.boot.autoconfiguration.mongo.MongoPropertie s를 참고하시기 바랍니다.
# spring
spring:
data:
mongodb:
uri: mongodb://localhost:27017/test
spring.data.mongodb.uri는 mongodb://[ip 정보]:[port 정보]/[데이터베이스 이름]으로 지정합니다. 빈의 자동 설정 단계에서 MongoAutoConfiguration이 MongoProperties의 설정을 읽어와 MongoClientFactory를 설정하고 MongoClient 빈을 생성해줍니다.
Model 객체 생성
유저의 성(firstName)과 이름(lastName)을 갖는 Customer 도큐먼트를 정의합시다. DB에 저장될 document의 이름은 @Documemt 애노테이션을 통하여 지정해줍니다. MongoDB의 모든 도큐먼트는 반드시 _id 라는 주키를 갖게 됩니다. @Id 애노테이션은 해당 필드에 대해 주키로 지정하겠다는 의미를 가집니다.
@Document(collection = "customer")
public class Customer {
@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 + '\'' +
'}';
}
}
Repository 생성
MongoRepository를 이용해 Customer에 대한 Repository를 생성합니다. naming convention에 맞추어 find메서드를 생성해줍니다.
public interface CustomerRepository extends MongoRepository<Customer, String> {
public List<Customer> findByFirstName(String firstName);
}
Run
CommandLineRunner를 상속하여 repository 기능만을 확인해 보겠습니다. MongoRepository를 상속하여 만든 커스텀한 Repostiory는 @Indexed 애노테이션덕에 모두 빈으로 등록되어있습니다. @Autowired를 통해 CustomerRepository를 주입받습니다.
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private CustomerRepository customerRepository;
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
customerRepository.insert(Arrays.asList(customer1, customer2));
// get
List<Customer> result = customerRepository.findByFirstName("son");
System.out.println(result);
}
}
Spring Data의 Repository는 Naming Convention에 맞게 선언한 메서드에 대해서 Runtime시 동적으로 data access 대한 implementation을 제공합니다. insert와 findByFirstName을 실제로 구현하지 않았지만 삽입, 조회가 잘 동작하는 것을 확인할 수 있습니다.