[Spring Boot #28] 스프링 부트 몽고DB(Mongo DB) 연동하기

2021. 3. 25. 01:29 Spring Framework/Spring boot2

| 몽고DB란?

 

  • 몽고DB는 데이터 객체들이 컬렉션 내부에서 독립된 문서로 저장되는, 문서 모델 기반(Document-Based)으로 하는 NoSQL 데이터베이스입니다.
  • 컬렉션이라는 것은 몽고DB에서 용도가 같거나 유사한 문서들을 그룹으로 묶는 것을 말합니다. 그리고 이 컬렉션들은 기존 SQL의 데이터베이스의 테이블처럼 비슷하게 동작합니다.
  • 몽고DB의 문서 모델은 JSON 기반 포맷입니다. 따라서 유여하게 데이터를 즐의하고 조작할 수 있습니다.

 

| 스프링 부트 몽고DB 연동하기

 

의존성 설정

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>

 

몽고DB 도커 실행하기

docker run -p 27017:27017 --name mongo_boot -d mongo

 

몽고DB 구동 여부 확인

docker exec -i -t mongo_boot bash
root@d26475076d57:/# mongo

 

프로젝트 구조

├── pom.xml
├── spring-boot-mongodb.iml
└── src
├── main
│   ├── java
│   │   └── com
│   │       └── tutorial
│   │           └── springbootmongodb
│   │               ├── Account.java
│   │               ├── AppRunner.java
│   │               └── SpringBootMongodbApplication.java

 

소스코드

@SpringBootApplication
public class SpringBootMongodbApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMongodbApplication.class, args);
    }

}
@Document(collection = "accounts")
public class Account {

    @Id
    private String id;

    private String username;

    private String email;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

 

@Document는 이 클래스가 몽고DB에서 문서로서 매핑될 것을 의미합니다. @Document 인수 안의 collection은 데이터베이스 테이블로서의 역할을 합니다.

 

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    MongoTemplate mongoTemplate;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Account account = new Account();
        account.setEmail("aaa@bbb");
        account.setUsername("aaa");

        mongoTemplate.insert(account);
    }
}

MongoTemplate 스프링 빈을 통해서 몽고DB에 손쉽게 접근할 수 있습니다. MongoTemplate를 통해 몽고DB에서 지원하는 여러 API들을 추상화된 형태로 사용할 수 있습니다.

 

결과 화면

> db
test
> use test
switched to db test
> db.accounts.find({})
{ "_id" : ObjectId("5c381b1f3a64ae2e182c98da"), "username" : "aaa", "email" : "aaa@bbb", "_class" : "com.tutorial.springbootmongodb.Account" }

 

| MongoRepository 인터페이스로 몽고DB 접근하기 

 

다음과 같이 MongoRepository 인터페이스를 추가합니다.

public interface AccountRepository extends MongoRepository<Account, String> {
}
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── tutorial
│   │   │           └── springbootmongodb
│   │   │               ├── Account.java
│   │   │               ├── AccountRepository.java
│   │   │               ├── AppRunner.java
│   │   │               └── SpringBootMongodbApplication.java

 

아래와 같이 AccountRepository 인터페이스에 스프링 부트에서 자동적으로 관련 스프링 빈을 주입시킵니다. 따라서 AccountRepository를 통해서 몽고DB에 접근하여 관련된 모든 처리를 할 수 있습니다.

@Component
public class AppRunner implements ApplicationRunner {
//
//    @Autowired
//    MongoTemplate mongoTemplate;

    @Autowired
    AccountRepository accountRepository;

    @Override
    public void run(ApplicationArguments args) throws Exception {
//        Account account = new Account();
//        account.setEmail("aaa@bbb");
//        account.setUsername("aaa");
//
//        mongoTemplate.insert(account);

        Account account = new Account();
        account.setEmail("eng.kimbs@gmail.com");
        account.setUsername("saelobi");
        accountRepository.insert(account);
    }
}

 

결과 화면

> db.accounts.find({})
{ "_id" : ObjectId("5c381b1f3a64ae2e182c98da"), "username" : "aaa", "email" : "aaa@bbb", "_class" : "com.tutorial.springbootmongodb.Account" }
{ "_id" : ObjectId("5c381e803a64ae2f90a6eac8"), "username" : "saelobi", "email" : "eng.kimbs@gmail.com", "_class" : "com.tutorial.springbootmongodb.Account" }

 

| 테스트형 내장형 몽고DB 

 

의존성 추가

<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <scope>test</scope>
</dependency>

 

소스 코드 변경

public interface AccountRepository extends MongoRepository<Account, String> {

    Optional<Account> findByEmail(String email);
}

 

다음과 같이 테스트 코드를 추가합니다.

│   └── test
│       └── java
│           └── com
│               └── tutorial
│                   └── springbootmongodb
│                       └── SpringBootMongodbApplicationTests.java
@RunWith(SpringRunner.class)
@DataMongoTest
public class SpringBootMongodbApplicationTests {

    @Autowired
    AccountRepository accountRepository;

    @Test
    public void findByEmail() {
        Account account = new Account();
        account.setUsername("saelobi");
        account.setEmail("eng.kimbs@gmail.com");

        accountRepository.save(account);

        Optional<Account> byId = accountRepository.findById(account.getId());
        assertThat(byId).isNotEmpty();
        Optional<Account> byEmail = accountRepository.findByEmail(account.getEmail());
        assertThat(byEmail).isNotEmpty();
        assertThat(byEmail.get().getUsername()).isEqualTo("saelobi");
    }
}

 

@DataMongoTest는 몽고DB 테스트를 위한 모든 스프링 빈을 테스트 시 추가합니다. 또한 테스트 때 내장 몽고DB에 대한 의존성을 메이븐에 추가하였기에 자동적으로 테스트 시, 내장 몽고 DB가 사용됩니다.

 

 

고자료 : https://www.inflearn.com/course/스프링부트



출처: https://engkimbs.tistory.com/797?category=767865 [새로비]