본문 바로가기
Java, Kotlin, Spring/Spring, Spring Boot

Spring Data - MongoDB

by Wordbe 2021. 1. 21.
728x90

 

Springboot - Spring Data - MongoDB

 

MongoDB 는 json 기반의 다큐먼트 데이터베이스이다.

스프링부트와 연동하여 사용하는 방법을 알아보자.

 

의존성을 추가한다.

pom.xml

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

 

MongoDB 설치, 실행

docker 를 통해 mongodb를 설치하고 실행한다.

$ docker run -p 27017:27017 --name springboot-mongodb -d mongo

스프링부트가 localhost:27017 에 기본으로 mongodb 서버를 연동한다. 따라서 로컬 db 27017:도커 db 27017 를 연결해준다.

mongo 데몬을 실행시킨다.

몽고 도커 컨테이너를 실행시키고, 몽고디비를 실행시키자.

$ docker exec -it springboot-mongodb bash
/# mongo
>
> db
test

> use test
switched to db test

 

테스트

이제 애플리케이션 러너로 몽고디비에 데이터를 넣어보자.

일단 food 객체를 만들어주자

@Getter @Setter
@Document(collection = "foods")
public class Food {

    @Id
    String id;

    String name;

    String color;
}

다큐먼트 기반인 몽고디비는 @Document 어노테이션에 collection 에 객체(key) 이름을 지어주면 된다.

 

템플릿 사용

@SpringBootApplication
public class SpringgothreeApplication {

    @Autowired
    MongoTemplate mongoTemplate;

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

    @Bean
    public ApplicationRunner applicationRunner() {
        return args -> {
            Food food = new Food();
            food.setName("apple");
            food.setColor("red");

            mongoTemplate.insert(food);
            System.out.println(food);
        };
    }
}

몽고디비에서 확인해보자.

> db.foods.find({})
{ "_id" : ObjectId("60077e866f01e07e374ee5d3"), "name" : "apple", "color" : "red", "_class" : "co.wordbe.springgothree.food.Food" }

 

레포지토리 사용

public interface FoodRepository extends MongoRepository<Food, String> {
}
@SpringBootApplication
public class SpringgothreeApplication {

    @Autowired
    FoodRepository foodRepository;

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

    @Bean
    public ApplicationRunner applicationRunner() {
        return args -> {
            Food food = new Food();
            food.setName("strawberry");
            food.setColor("red");
            foodRepository.insert(food);

            System.out.println(food);
        };
    }
}

몽고 DB에 insert가 잘 되었는지 확인해보자.

> db.foods.find({})
{ "_id" : ObjectId("60077e713b05c92c60150336"), "name" : "strawberry", "color" : "red", "_class" : "co.wordbe.springgothree.food.Food" }
{ "_id" : ObjectId("60077e866f01e07e374ee5d3"), "name" : "apple", "color" : "red", "_class" : "co.wordbe.springgothree.food.Food" }

 

테스트코드 (내장형 몽고DB)

테스트용으로 내장형 몽고DB 를 사용할 수 있다. 아래 의존성을 추가한다.

pom.xml

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

슬라이싱 테스트가 가능하다.

...
import static org.assertj.core.api.Assertions.assertThat;

@DataMongoTest
class FoodRepositoryTest {

    @Autowired
    FoodRepository foodRepository;

    @Test
    public void findByName() {
        Food food = new Food();
        food.setName("grape");
        food.setColor("purple");

        foodRepository.save(food);
        Optional<Food> byId = foodRepository.findById(food.getId());
        assertThat(byId).isNotEmpty();
        assertThat(byId.get().getName()).isEqualTo("grape");
    }
}

내장 test 용 db 이기 때문에, 실제 mongdb 서버에 영향을 주지 않는다.

테스트 실행 시 save 메소드로 새로운 food 객체를 집어넣었는데 실제 mongodb에는 반영되지 않은 것을 볼 수 있다.

 

 

 

728x90

'Java, Kotlin, Spring > Spring, Spring Boot' 카테고리의 다른 글

Springboot - Spring REST Client  (0) 2021.01.21
Springboot - Security  (0) 2021.01.21
Spring Data - Redis  (0) 2021.01.21
Spring Data - Neo4j 사용  (0) 2021.01.20
Spinrg data 초기화, migration  (0) 2021.01.20

댓글