본문 바로가기
Dev/Spring Boot

[스프링 부트 개념과 활용] 스프링 데이터 10부

by dev_jsk 2020. 8. 28.
728x90
반응형

MongoDB

문서 기반(Document-Oriented) 저장소를 제공하는 NoSQL Database System

 

특징

 

  • Document-oriented storage : MongoDB는 Database > Collections > Documents 구조로 Document는 Key-Value형태의 BSON(Binary JSON)으로 구성
  • Schemaless : 스키마가 존재하지 않아 필드 추가/삭제가 용이
  • Full Index Support : 다양한 인덱싱을 제공
    • Single Field Indexes : 기본적인 인덱스 타입
    • Compound Indexes : RDBMS의 복합인덱스
    • Multikey Indexes : Array에 매칭되는 값이 하나라도 있으면 인덱스에 추가하는 멀티키 인덱스
    • Geospatial Indexes and Queries : 위치기반 인덱스와 쿼리
    • Text Indexes : String에도 인덱싱이 가능
    • Hashed Index : Btree 인덱스가 아닌 Hash 타입의 인덱스도 사용 가능
  • Replication & High Availability : 간단한 설정만으로도 데이터 복제를 지원하여 가용성 향상
  • Auto-Sharding : 자동으로 데이터를 분산하여 저장하며, 하나의 컬렉션처럼 사용 가능
  • Querying : 다양한 종류의 쿼리문 지원 (필터링, 수집, 정렬, 정규표현식 등)
  • Fast In-Pace Updates : 고성능의 Atomic Operation을 지원
  • MapReduce : MapReduce 함수의 조합을 통해 분산/병렬 시스템 운용 지원
  • GridFS : 분산파일 저장을 자동으로 수행. 실제 파일이 어디에 저장되어 있는지 신경 쓸 필요 없고 복구도 자동 수행

예제

1. 의존성 추가

// pom.xml

// Docker 이용할 MongoDB
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

// 테스트용 내장 MongoDB
<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <scope>test</scope>
</dependency>

2. Account 객체 및 저장소 생성

// Account.java

@Document(collection = "accounts")
public class Account {
    @Id
    private String id;
    private String username;
    private String email;
    
    getter/setter
}

// AccountRepository.java

public interface AccountRepository extends MongoRepository<Account, String> {
	Optional<Account> findByEmail(String email);
}

3. Database 설정

(1) Docker 사용

// Terminal

// 저장소 생성
// 기본 포트 : 27017
$ docker run -p 27017:27017 --name mongo_boot -d mongo

// 저장소 실행
// bash 명령어는 해당 DB 접속하면서 bash 실행
$ docker exec -i -t mongo_boot bash
// Application.java

@SpringBootApplication
public class Application {
	@Autowired
	AccountRepository accountRepository;

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

	@Bean
	public ApplicationRunner applicationRunner() {
		return args -> {
			Account account = new Account();
			account.setEmail("sun7190@naver.com");
			account.setUsername("Jinseo");
			accountRepository.insert(account);

			System.out.println("finish");
		};
	}
}

(2) 내장 MongoDB 사용

// AccountRepositoryTest.java

@RunWith(SpringRunner.class)
@DataMongoTest
public class AccountRepositoryTest {
    @Autowired
    AccountRepository accountRepository;

    @Test
    public void findByEmail() {
        Account account = new Account();
        account.setUsername("jsk");
        account.setEmail("test@test.com");

        accountRepository.save(account);

        Optional<Account> byId = accountRepository.findById(account.getId());
        System.out.println("UserName : " + byId.get().getUsername());
        System.out.println("Email : " + byId.get().getEmail());
        assertThat(byId).isNotEmpty();

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

결과 확인

1. Docker 사용 결과

2. 내장 MongoDB 사용 결과

참고

https://docs.mongodb.com/manual/core/document/

 

Documents — MongoDB Manual

Documents MongoDB stores data records as BSON documents. BSON is a binary representation of JSON documents, though it contains more data types than JSON. For the BSON spec, see bsonspec.org. See also BSON Types. Document Structure MongoDB documents are com

docs.mongodb.com

 

 

728x90
반응형

댓글