회사에서 MongoDB를 사용하기 때문에 앞으로 NoSQL과 몽고디비에 대해서 학습이 필요할것 같다. 그러기 위해선 어디서든지 MongoDB를 쉽게 띄울 수 있을 셋팅이 필요하다.
MySQL도 docker-compose를 사용했기 때문에 MongoDB역시 docker-compose를 선택하게 되었고, 이를 쉽게 visualize할 mongo-express를 함께 정리해두고자 한다.
version: '3.8'
services:
  mongodb:
    image: mongo
    container_name: mongodb
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ~/mongodb:/data/db
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=1234
      - MONGO_INITDB_DATABASE=stock
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: 1234
      ME_CONFIG_MONGODB_URL: mongodb://root:1234@mongodb:27017
YAML
복사
docker-compose.yml
이것도 한번 설정해두고 잊어버렸으나 다시 하려고하니 은근히 삽질이 필요한것 같다.
다음과 같은 기능들을 제공한다.
•
Connect to multiple databases
•
View/add/delete databases
•
View/add/rename/delete collections
•
View/add/update/delete documents
•
Preview audio/video/image assets inline in collection view
•
Nested and/or large objects are collapsible for easy overview
•
Async on-demand loading of big document properties (>100KB default) to keep collection view fast
•
GridFS support - add/get/delete incredibly large files
•
Use BSON data types in documents
•
Mobile / Responsive - Bootstrap 3 works passably on small screens when you're in a bind
•
Connect and authenticate to individual databases
•
Authenticate as admin to view all databases
•
Database blacklist/whitelist
•
Custom CA and CA validation disabling
•
Supports replica sets
로컬에 datagrip과 같은 client가 이미 설치되어 있다면 굳이 사용할 필요는 없지만 이런것이 없다면 상당히 유용하다. 설치 후 http://localhost:8081/ 로 들어가면 아래와 같은 화면이 나타난다.
여기서 바로 새로운 collection을 만들어 application에 적용할 수 있다.
새로운 collection인 stock이 추가되었다.
간단한 테스트 코드를 실행해 보자
@Test
fun `create and get`() {
    val stock = Stock(
        id = "AAPL",
        name = "Apple Inc",
        low = 100.0,
        high = 250.0,
        open = 120.0,
        close = 220.0,
    )
    runBlocking {
        stockRepository.save(stock)
        stockRepository.findById("AAPL")?.also {
            assertThat(it.name).isEqualTo(stock.name)
        }
    }
}
Kotlin
복사
Apple 주식을 추가했고, 해당 주식이 MongoDB에 올바르게 저장되어 있는지 확인하는 테스트이다.
코드를 실행하였고, 테스트가 통과하였다. 이걸 mongo-exporess 에서 확인하면 아래와 같다.
생성한 Stock collection에 들어가면 내가 생성한 Apple 주식이 저장되어 있음을 확인할 수 있다.
version: '3.8'
services:
  mongodb:
    image: mongo
    container_name: mongodb
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ~/mongodb:/data/db
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=1234
      - MONGO_INITDB_DATABASE=stock
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: 1234
      ME_CONFIG_MONGODB_URL: mongodb://root:1234@mongodb:27017
Kotlin
복사
이 설정에서 주의깊게 볼 사항은 mongodb://root:1234@mongodb:27017 이다.
보면 127.0.0.1 혹은 localhost가 아닌 mongodb라는 이름으로 접속할 수 있다.
이것은 docker network 덕분이며 services 아래 mongodb 라는 container에 접속하는 것이기 때문이다.
이러한 도커의 기능을 알맞게 이용하면 jib를 이용해서도 쉽게 셋팅할 수 있다.





