[Spring Boot #28] 스프링 부트 몽고DB(Mongo DB) 연동하기
- Spring/Spring Boot
- 2019. 1. 11. 13:53
| 몽고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/스프링부트
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot #30] 스프링 부트 시큐리티 커스터마이징 (1) | 2019.01.22 |
---|---|
[Spring Boot #29] 스프링 부트 시큐리티 (0) | 2019.01.12 |
[Spring Boot #27] 스프링 부트 레디스(Redis) 연동하기 (0) | 2019.01.11 |
[Spring Boot #26] Flyway를 이용한 데이터 마이그레이션 (0) | 2019.01.11 |
[Spring Boot #25] 스프링 부트 데이터베이스 초기화 (2) | 2019.01.11 |
이 글을 공유하기