반응형

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

반응형

| 몽고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/스프링부트


반응형

이 글을 공유하기

댓글

Designed by JB FACTORY