ทำ REST Service ด้วย Spark Java + Spring

Spark Java & Spring Framework

โดยปกติผมจะเริ่มทำ Service ด้วยการใช้ Spring Boot เลย เพราะมันง่ายมาก ไม่ต้อง Setup อะไรเยอะแยะ สามารถใช้ทำ Rest ได้เลย แต่มันติดนิดนึงตรงที่ Spring ค่อนข้าง Startup ช้า ไม่ค่อยทันใจเวลาแก้โค้ดเล็กๆน้อยๆ แล้วต้องมารอ Startup

ก็ได้ไปลองเล่น Micro Framework ดู ปรากฎว่าติดใจ Spark Java (http://sparkjava.com/) มันเรียบง่าย ไม่ต้อง Setup อะไรเยอะ Start เร็วอีกต่างหาก “แต่” มันไม่ค่อยมีอะไรมาให้เหมือนเราใช้ Spring (เช่น Dependency Injection หรือ IoC)

ผมก้เลยคิดว่าถ้าจับ Spark กับ Spring มารวมกัน ก้น่าจะเกิดเรื่องดีๆได้

เริ่มจาก Gradle หลักๆเลยนะ
1. Spark Java — อันนี้คือทีเด็ด
2. Spring Context — ทำเรื่อง Dependency Injection (IoC)
3. Spring Data JPA — จัดการ Database ในแบบ JPA
4. Jackson Databind — เปลี่ยน Object เป็น JSON

compile group: 'com.sparkjava', name:'spark-core', version:'2.6.0'
compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
compile group: 'org.springframework', name: 'spring-context', version: '4.3.10.RELEASE'
compile group: 'org.springframework.data', name: 'spring-data-jpa', version: '1.11.6.RELEASE'
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.10.Final'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.0'
runtime('org.mariadb.jdbc:mariadb-java-client:2.0.1')

ในส่วนของ Main ก้ Setup Spring กับ สร้าง Spark Bean เอาไว้ครับ

ต่อมาก้ลองมาทำ Controller ดู ซึ่งการจะสร้าง Mapping ใน Spark นี่ง่ายมากๆ

ลอง Start ละยิง Postman ดู ผลลัพธ์ออกมาน่าพอใจ :)

ต่อมาเราจะมาลองต่อ Database และทำ Rest Service กันละ ซึ่งเราจะให้พระเอก Spring Data Jpa มาช่วยเราหน่อย เริ่มจาก Config เล็กๆน้อย โดยผมจะแยกเอาไว้ใน ไฟล์ application.properties ใน resources โฟลเดอร์

database.driver-class-name=org.mariadb.jdbc.Driver
database.username=#username
database.password=#password
database.url=jdbc:mysql://localhost:3306/people
database.hibernate.dialect=org.hibernate.dialect.MariaDB53Dialect
database.hibernate.hbm2ddl.auto=update

Config Spring นิดนึงให้มันรู้ว่าไฟล์ Properties ของเราอยู่ไหน ( ผมสร้าง Bean ObjectMapper ไว้ด้วยเลยเพราะรู้ว่าต้องได้ใช้ )

ต่อกันที่ Config เรื่อง Database อีกนิดหน่อยโดยสิ่งที่ทำทั้งหมดเพื่อใช้ร่วมกับ Spring Data JPA ครับ จะเป็นเรื่องของ Entity Manager กับ Transaction Manager

สังเกตุว่าจะมี Annotation EnableJpaRepositories กับ EnableTransactionManagement ต้องเขียนไว้ให้ Spring ได้รู้ว่าช่วยเราทำเรื่อง Jpa กับ Transaction หน่อยนะ โดยเราจะกำหนด Bean ที่ Spring ต้องการเอาไว้

สร้าง POJO ไว้เป็น Entity ด้วย

สร้าง Repository ไว้ติดต่อกับ Database

สร้าง Service มาอีกชั้นเพื่อคุยกับ เป็นคั่นกลางระหว่าง Controller กับ Repository

ปรับ Controller อีกนิดหน่อย นิดเดียวหน่ะ

ถึงเวลาลองละ โดยเราจะยิง /people/add ละตามด้วย /people/all นะครับ มาดูกัน

เรื่มต้นจาก ยิง Add 2 คน

ตามด้วย All เพื่อเช็คว่ามามั้ยยยย

ผลลัพธ์ออกมาน่าพอใจครับ ยิ่งไปกว่านั้น Spark ใช้เวลาเริ่มต้นแค่เพียง 2.8 วินาที เท่านั้นเองเปรียบเทียบกับ Spring Boot ที่ประมาณ 10 วินาที

[Thread-1] INFO org.eclipse.jetty.server.Server - Started @2808ms

Source code : https://github.com/orankhu/spark-spring

ถ้าชอบอย่าลืมกด ปรบมือ ให้ด้วยนะครับ ถ้ามีอะไรดีๆแนะนำ คอนเม้นต์เลยครับ ขอบคุณคร้าบบ

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.