สร้าง Microservice + MongoDB ด้วย Spring Boot + Spring Data

Phayao Boonon
4 min readSep 23, 2018

--

ฐานข้อมูลแบบ NoSQL มีข้อดีที่หลากหลายและที่สำคัญคือการเข้าถึงข้อมูลได้เร็วกว่าฐานข้อมูลแบบ SQL หรือ Relational เพราะว่ามีการจัดเก็บข้อมูลเป็นแบบคู่ key และ value ทำให้การเข้าถึงข้อมูลด้วย key นั้นมีประสิทธิภาพที่ดีกว่าการ query ด้วย SQL โดยที่ MongoDB เป็นฐานข้อมูลแบบ NoSQL ที่ได้รับความนิยมอย่างสูงในปัจจุบัน ดังนั้นในบทความนี้จะมาทำ CRUD Microservice ที่ใช้ MongoDB เป็นฐานข้อมูลด้วย Spring Boot และ Spring Data MongoDB

MongoDB คืออะไร

เป็นฐานข้อมูลแบบ NoSQL ตัวหนึ่งที่ได้รับความนิยมมาก เป็นฐานข้อมูล open source แบบ Document Oriented โดยที่เก็บข้อมูลเป็นเอกสารในรูปแบบ JSON มีประสิทธิภาพสูง , มี availability สูง และง่ายต่อการ scale ซึ่งทำงานบนแนวคิดของ collection และ document

Database

Database เป็นที่บรรจุของ collection โดยแต่ละ database จะมีกลุ่มของไฟล์ในระบบไฟล์ของเครื่อง โดยที่ MongoDB server หนึงจะมีหลาย database

Collection

Collection เป็นกลุ่มของ document เปรียบเสมือน Table ในฐานข้อมูล Relational โดยที่ collection จะอยู่ถายใน database เดียว ไม่บังคับใช้ schema และ document ภายใน collection สามารถมี field ที่แตกต่างกันได้ โดยปรกติแล้ว document ใน collection จะมีจุดประสงค์ให้มีความเหมือนกันหรือเกี่ยวข้องกัน

Document

Document เป็นเซตของคู่ key-value โดยที่จะมี dynamic schema หมายความว่า document ที่อยู่ใน collection เดียวกันไม่จำเป็นจะต้องมี field หรือโครงสร้างที่เหมือนกัน โดยที่ field เดียวกันใน document ที่แตกต่างกัน สามารถเก็บข้อมูลที่มีชนิดของข้อมูลที่แตกต่างกันได้

ตัวอย่างของ document

{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2011,1,20,2,15),
like: 0
},
{
user:'user2',
message: 'My second comments',
dateCreated: new Date(2011,1,25,7,45),
like: 5
}
]
}

Spring Data MongoDB

เป็น Spring Data สำหรับฐานข้อมูล MongoDB ซึ่งเป็นส่วนหนึ่งของโครงการ Spring Data ที่บูรณาการกับ MongoDB document database โดยคุณสมบัติหลักคือการโมเดล POJO ให้โต้ตอบกับ MongoDB collection และเขียนการเข้าถึงข้อมูลใน data layer ในรูปแบบของ Responsibility ได้ง่าย

โดยสามารถเพิ่ม dependency ของ Spring Data MongoDB ใน maven ด้วย

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>

แต่ถ้าเป็น Spring Boot สามารถเพิ่มด้วย

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

วางแผนกันก่อน

CRUD Microservice ที่จะสร้างขึ้นเป็น Microservice ที่เก็บข้อมูลของ Customer ดังนั้น จะมี endpoint ที่ดำเนินการกับ customers resource ภายใต้ prefix path เป็น /api ดังนี้

  • GET /api/customers — เรียกดูรายการ Customer ทั้งหมด
  • GET /api/customers/{id} — เรียกดู Customer โดย user id
  • GET /api/customers?name=xxxx — เรียกดูรายการ Customer ด้วยการค้นหาด้วย name
  • POST /api/customers — สร้าง Customer ใหม่
  • PUT /api/customers/{id} — แก้ไข Customer โดย user id
  • DELETE /api/customers/{id} — ลบ Customer โดย user id

โดยแบบออกเป็น 3 Layer คือ Presentation Layer, Service Layer และ Persistence Layer

Use Case เดียวกับ สร้าง CRUD Microservice ด้วย Spring Boot ทำให้บางหัวข้อจะละการอธิบายในลายละเอียดเพราะเหมือนกัน

ติดตั้งและรัน MongoDB

เนื่องจากเราจะใช้งาน MongoDB เราก็จะต้องติดตั้งในเครื่องก่อน ถ้าเป็น MacOS ก็ติดตั้งได้จาก brew ได้เลยด้วยคำสั่ง

$ brew install mongodb

ถ้าเป็น OS อื่นสามารถดูวิธีการติดตั้งได้จาก ที่นี่

หลังจากติดตั้งแล้ว สามารถรัน mongo daemon ได้ด้วยคำสั่ง

$ mongod

ถ้ายังไม่ได้สร้าง path data/db ในเครื่องก็อาจจะรันแล้ว fail ได้ ถ้า fail ก็สร้าง path นี้ขึ้นมาก่อน แล้วลองรันใหม่ก็น่าจะรันได้

สร้าง Spring Boot Project

สามารถใช้ Spring Initializr ในการสร้างโปรเจ็คโดยเลือก dependency เป็น Web MongoDB และ Lombok

สร้าง Customer Data (POJO)

เป็น POJO ที่แทนข้อมูล Customer โดยใช้ @Data เพื่อสร้าง Getter/Setter ให้

src/main/java/com/example/demo/customer/Customer.java

โดยกำหนดให้แต่ละ field ของ Customer ใน document customer มีลักษณะดังนี้

  • id — ตัวแปรค่า id ชนิดข้อมูล String ซึ่งเป็นค่าที่กำหนดให้อัตโนมัติ
  • firstName — ตัวแปร String ที่จะต้องมีค่า
  • lastName — ตัวแปร String ที่จะต้องมีค่า
  • age — ตัวแปร Integer ที่จะต้องมีค่า
  • email — ตัวแปร String ที่จะต้องมีรูปแบบเป็น email

สร้าง Customer Controller

เป็น Controller ที่ mapping ไปกับ request ต่างๆ ด้วย @RestController ใน presentation layer ดังนี้

src/main/java/com/example/demo/customer/CustomerController.java

สร้าง Customer Service

เป็น Service ที่รองรับการ invoke มาจาก Controller เพื่อทำ Business Logic ที่เรียกไปยัง Database เพื่อดำเนินการ CRUD operation ด้วย CustomerRepository ดังนี้

src/main/java/com/example/demo/customer/CustomerService.java

สร้าง Repository

เป็นส่วนของ Persistence layer ที่ติดต่อโดยตรงกับ MongoDB โดยเป็น interface ที่ extend มาจาก MongoRepository ด้วย value (Customer) และ key (String) โดยเพิ่ม method findByFirstName เพื่อค้นหาข้อมูลด้วย FirstName

src/main/java/com/example/demo/customer/CustomerRepository.java

interface MongoRepository จะมี implementation เป็น SimpleMongoRepoitory ที่สร้างการติดต่อและดำเนินการกับ MongoDB ไว้ให้ ง่ายใช่ไหม!!!!

สร้าง Application Config

กำหนด config ของ application อีกนิดหน่อย ไม่เกี่ยวกับฐานข้อมูลแต่เกี่ยวกับกำหนด port และ prefix ของ URI

กำหนด Application Config

ทดลองรัน Application

หลังจากที่ได้ implement ทุกอย่างเรียบร้อยแล้ว ก็รัน Application (Microservice) ด้วยคำส่ัง mvn spring-boot:run ถ้าสำเร็จจะเห็น message Started และต้องแน่ใจว่า mongo deamon รันอยู่

ลองสร้าง Customer ด้วย POST method และ body เป็นข้อมูลของ Customer ที่ไม่ต้องมี id โดย request ไปที่ endpoint http://localhost:9000/api/customers ด้วย Postman และจะเห็นได้ว่า Service response กลับมาเป็นข้อมูลของ Customer ที่ id ที่ถูกกำหนดให้โดย MongoDB เป็นตัวเลขฐานสิบหก 24 ตัวอักษร ในรูปแบบของ String

และใช้ id ในการ request ด้วย GET method จะได้ข้อมูลของ Customer กลับมา ซึ่งสามารถใช้ PUT method ในการแก้ไขข้อมูลและ DELETE method ในการลบข้อมูลใน MongoDB

สรุป

จากการสร้าง CRUD Microservice ติดต่อกับฐานข้อมูล NoSQL อย่าง MongoDB ด้วย Spring Boot และ Spring Data MongoDB นั้น ทำได้ง่ายมาก เพราะว่าในส่วนของ Persistence layer ที่ติดต่อกับ MongoDB โดยตรงไม่ต้องทำอะไรเพิ่มเติมเลยนอกจากเพิ่ม method เฉพาะที่ค้นหาข้อมูลด้วย field firstName โดยที่ Spring Data คอยจัดการให้หมด แต่สิ่งที่แตกต่างออกไปคือ id จะต้องกำหนดให้เป็น String เพราะว่า MongoDB จะกำหนดค่า id ให้เองและจะเป็นตัวเลขฐานสิบหกในรูปแบบ String และเราก็ไม่สามารถกำหนดค่าได้เอง

--

--

Phayao Boonon
Phayao Boonon

Written by Phayao Boonon

Software Engineer 👨🏻‍💻 Stay Hungry Stay Foolish

No responses yet