Spring Data มีอะไรบ้าง?
ข้อมูล (Data) เป็นสิ่งที่สำคัญมากในโลกของซอฟต์แวร์ การเก็บข้อมูลมีวิวัฒนาการอย่างรวดเร็วในช่วงทศวรรษที่ผ่านมา หลังจากความเสถียรของฐานข้อมูล relational (SQL) ในช่วงที่ผ่านมา ก็ได้มีฐานข้อมูลแบบ nonrelational (NSQL) เพิ่มจำนวนมากขึ้น ด้วยจำนวนของระบบจัดเก็บข้อมูลที่หลากหลายนั้น framework คุยกับระบบจัดเก็บข้อมูลเหล่านี้จึงมีความสำคัญมาก ในโลกของ Java มี JPA ที่ทำให้คุยกับฐานข้อมูล relational ได้ง่าย แต่ Spring ต้องการใช้วิธีเดียวกันนี้กับระบบจัดเก็บข้อมูลที่หลากหลายทั้ง relational และ nonrelational ดังนั้น Spring Data จึงถูกสร้างมาเพื่อให้วิธีเดียวกันในการติดต่อกับระบบจัดเก็บข้อมูลทุกแบบ มาดูกันว่า Spring Data เตรียมเครื่องมือสำหรับติดต่อกับระบบจัดเก็บข้อมูลแบบใดบ้าง
Spring Data
ในแต่ละระบบจัดเก็บข้อมูลมีวิธีที่การเชื่อมต่อ และการเข้าถึง/แก้ไขข้อมูล ที่แตกต่างกันไป Spring Data จึงมีเป้าหมายที่ใช้ model ของข้อมูลที่สอดคล้องกันในการเข้าถึงข้อมูลของระบบจัดเก็บข้อมูลที่แตกต่างกัน
Spring Data มีคุณสมบัติหลักๆ ดังนี้
- ง่ายต่อการผสมหลายระบบจัดเก็บข้อมูลผ่าน repository ที่หลากหลาย
- มีความสามารถในการ parse และสร้าง query ด้วยชื่อ method ของ repository
- มีฟังก์ชันพื้นฐานของ CRUD opration
- มีพื้นฐานสนับสนุนการตรวจสอบ ตัวอย่างเช่น created by และ changed by user
- เข้ากันได้เป็นอย่างดีกับ Spring framework
- เข้ากันได้กับ Spring MVC ที่จะ expose REST controller ผ่าน Spring Data Rest
Main Modules
ภายใต้ร่มเงาของโครงการ Spring Data มีโมดูลหลักที่ active และอยู่บน release train ดังนี้
- Spring Data Commons — โมดูลพื้นฐานของ Spring Data โดยที่จะอยู่ในโมดูลอื่นทุกๆ โมดูล สำหรับแชร์ infrastructure ของ Spring Data
- Spring Data JDBC — โมดูล repository สำหรับ JDBC ที่เป็นมาตรฐานของ database access ด้วย SQL
- Spring Data JPA — โมดูล repository สำหรับ JPA ที่เป็นมาตรฐานของ ORM (Object Relational Mapping)
- Spring Data KeyValue — Map based repository และ SPI ที่ทำให้สร้าง Spring Data module สำหรับ key-value store ได้ง่าย
- Spring Data LDAP — โมดูล repository สำหรับ Spring LDAP
- Spring Data MongoDB — โมดูลสำหรับเชื่อมต่อกับ MongoDB ฐานข้อมูล document-based (NoSQL) ได้อย่างง่าย
- Spring Data Redis — โมดูลสำหรับเชื่อมต่อและตั้งค่า Radis ฐานข้อมูล key-value (NoSQL) ได้อย่างง่าย
- Spring Data REST — โมดูลที่ทำให้สามารถเข้าถึง Spring Data repository ได้ด้วย RESTful resource
- Spring Data for Apache Cassandra — โมดูลสำหรับเชื่อมต่อและตั้งค่า Cassandra ทำได้ง่าย สำหรับระบบฐานข้อมล NoSQL ขนาดใหญ่
- Spring Data for Apache Geode — โมดูลสำหรับเชื่อมต่อและตั้งค่า Apache Geode สำหรับระบบฐานข้อมูล high consistency
- Spring Data for Apache Solr — โมดูลสำหรับเชื่อมต่อและตั้งค่า Apache Solr สำหรับ search oriented application
- Spring Data for Pivotal GemFire — โมดูลสำหรับเชื่อมต่อและตั้งค่า Pivotal GemFire ซึ่งเป็น NoSQL ของ Pivotal เอง (ผู้พัฒนา Spring framework)
- Spring Data Courchbase (community module) — โมดูลสำหรับเชื่อมต่อและตั้งค่า Courchbase ฐานข้อมูล multi-model document-oriented (NoSQL)
- Spring Data Elasticsearch (community module) — โมดูลสำหรับเชื่อมต่อและตั้งค่า Elasticsearch ที่เป็น search engine (full-text search)
- Spring Data Neo4j (community module)— โมดูลสำหรับเชื่อมต่อและตั้งค่า Neo4j ฐานข้อมูลแบบกราฟ (NoSQL)
นอกจากนี้ยังมีโมดูลที่เป็น Community Module อื่นอีกเพื่อรองรับระบบจัดเก็บข้อมูลอื่นๆ ดังนี้
- Spring Data Aerospike
- Spring Data ArangoDb
- Spring Data Azure Cosmo DB
- Spring Data DynamoDB
- Spring Data Hazelcast
- Spring Data Jest
- Spring Data Vault
โมดูลที่เกี่ยวข้องกับ Spring Data แต่ไม่นับเป็น Spring Data ดังนี้
- Spring Data JDBC Extensions —โมดูลส่วนขยายความสามารถของ JDBC (ไม่มีการพัฒนาต่อแล้ว)
- Spring for Apache Hadoop — โมดูลสำหรับ Apache Hadoop โดยที่จะทำให้การตั้งค่าและการใช้งาน API สำหรับ HDFS, MapReduce, Pig และ Hive ทำได้ง่าย (จะหมดอายุในปี 2019)
- Spring Content — โมดูลที่เชื่อมต่อ contact กับ Spring Data Entities และเก็บข้อมูลใน File-system, S3, Database หรือ Mongo’s GridFS (ไม่ใช้โมดูลของ Spring เป็นของ Paul Warren)
Spring Data Commons
เป็นโมดูลพื้นฐานของ Spring Data ที่มี abstraction พื้นฐานของ Spring Data โมดูลอื่นๆ โดยที่จะใช้ Spring Data JPA เป็นตัวอย่าง
Interface (abstraction) ที่สำคัญของ Spring Data Commons ดังนี้
Repository<T, ID>
CrudRepository<T,ID> extends Repository<T,ID>
PagingAndSortingRepository<T,ID> extends CrudRepository<T,ID>
Repository
เป็น interface หลักของ Spring Data โดยที่เป็น marker interface
CrudRepository
กำหนดการดำเนินการพื้นฐานสำหรับฐานข้อมูล Create, Read, Update, Delete ซึ่งมี method ที่สำคัญดังนี้
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
Iterable<T> findAllById(Iterable<ID> ids);
void deleteById(ID id);
void delete(T entity);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
boolean existsById(ID id);
long count();
}
PagingAndSortingRepository
กำหนด method ที่ทำให้สามารถแบ่ง ResultSet ออกเป็นหน้าๆ พร้อมทั้งเรียงลำดับผลลัพธ์ด้วย
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
Spring Data JPA
จะมี implementation ของ Spring Data Common interface โดยมี JpaRepository เป็น interface เฉพาะของ JPA ซึ่ง extend PagingAndSortingRepository และ QueryByExampleExecutor
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
....
}
และมี SimpleJpaRepository เป็น implementation อย่างง่ายของ JpaRepository