สร้าง Microservice + MongoDB ด้วย Spring Boot + Spring Data
ฐานข้อมูลแบบ 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
หลังจากที่ได้ 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 และเราก็ไม่สามารถกำหนดค่าได้เอง
อ้างอิง