ทำไมคุณควรใช้ DTO ใน REST API ของคุณ
DTOย่อมาจากD ATA T ransfer O bject
รูปแบบนี้ถูกสร้างขึ้นด้วยวัตถุประสงค์ที่กำหนดไว้เป็นอย่างดี: การถ่ายโอนข้อมูลเพื่อการเชื่อมต่อระยะไกลเช่นเดียวกับบริการเว็บ รูปแบบนี้เหมาะมากกับ REST API และ DTOs จะให้ความยืดหยุ่นมากขึ้นในระยะยาว
โมเดลที่แสดงถึงโดเมนของแอปพลิเคชันของคุณและโมเดลที่แสดงถึงข้อมูลที่จัดการโดย API ของคุณคือ (หรืออย่างน้อยควรจะเป็น) ข้อกังวลที่แตกต่างกันและควรแยกออกจากกัน คุณไม่ต้องการแยกลูกค้า API ของคุณเมื่อคุณเพิ่มลบหรือเปลี่ยนชื่อเขตข้อมูลจากรูปแบบโดเมนแอปพลิเคชัน
ในขณะที่เลเยอร์บริการของคุณทำงานกับแบบจำลองโดเมน / การคงอยู่ตัวควบคุม API ของคุณควรทำงานกับแบบจำลองชุดอื่น เมื่อโมเดลโดเมน / การคงอยู่ของคุณพัฒนาขึ้นเพื่อรองรับความต้องการทางธุรกิจใหม่ตัวอย่างเช่นคุณอาจต้องการสร้างโมเดล API รุ่นใหม่เพื่อรองรับการเปลี่ยนแปลงเหล่านี้ คุณอาจต้องการเลิกใช้ API รุ่นเก่าของคุณเนื่องจากมีการเปิดตัวเวอร์ชันใหม่ และเป็นไปได้อย่างสมบูรณ์แบบที่จะบรรลุเมื่อสิ่งต่าง ๆ ถูกแยกออก
เพียงกล่าวถึงประโยชน์เล็กน้อยของการเปิดเผย DTOs แทนที่จะเป็นแบบจำลองการคงอยู่:
Decouple persistence models จากโมเดล API
DTO สามารถปรับให้เหมาะกับความต้องการของคุณและเป็นสิ่งที่ยอดเยี่ยมเมื่อเปิดเผยชุดของคุณลักษณะของเอนทิตีที่มีอยู่ของคุณเท่านั้น คุณไม่จำเป็นต้องมีคำอธิบายประกอบเช่น@XmlTransient
และ@JsonIgnore
เพื่อหลีกเลี่ยงการทำให้เป็นอนุกรมของคุณลักษณะบางอย่าง
ด้วยการใช้ DTO คุณจะหลีกเลี่ยงคำอธิบายประกอบในหน่วยงานที่มีอยู่ของคุณนั่นคือหน่วยงานด้านการคงอยู่ของคุณจะไม่ได้รับการเปิดเผยข้อมูลที่เกี่ยวข้อง
คุณจะสามารถควบคุมคุณสมบัติทั้งหมดที่คุณได้รับเมื่อสร้างหรืออัปเดตทรัพยากร
หากคุณใช้Swaggerคุณสามารถใช้@ApiModel
และเพิ่มความคิดเห็น@ApiModelProperty
เพื่อจัดทำเอกสารโมเดล API ของคุณโดยไม่ทำให้เอนทิตีการคงอยู่ของคุณ
คุณสามารถมี DTO ที่แตกต่างกันสำหรับ API แต่ละเวอร์ชันของคุณ
คุณจะมีความยืดหยุ่นมากขึ้นเมื่อทำแผนที่ความสัมพันธ์
คุณสามารถมี DTO ที่แตกต่างกันสำหรับประเภทสื่อที่แตกต่างกัน
DTOs ของคุณสามารถมีรายชื่อของการเชื่อมโยงสำหรับHATEOAS นั่นคือประเภทของสิ่งที่ไม่ควรถูกเพิ่มเข้าไปในวัตถุคงอยู่ เมื่อใช้Spring HATEOASคุณสามารถขยายคลาส DTO ของคุณRepresentationModel
(ซึ่งรู้จักกันในชื่อเดิมResourceSupport
) หรือล้อมรอบด้วยEntityModel
(เคยเป็นที่รู้จักResource<T>
)
การจัดการกับรหัสสำเร็จรูป
คุณไม่จำเป็นต้องแมปเอนทิตีการคงอยู่ของคุณกับDTOและในทางกลับกันด้วยตนเอง มีกรอบการแมปมากมายที่คุณสามารถใช้เพื่อทำมัน ตัวอย่างเช่นดูที่MapStructซึ่งเป็นคำอธิบายประกอบและทำงานเป็น Maven Annotation Processor มันทำงานได้ดีทั้งในแอพพลิเคชั่น CDI และ Spring
นอกจากนี้คุณยังอาจต้องการที่จะต้องพิจารณาลอมบอกเพื่อสร้าง getters, setters, equals()
, hashcode()
และtoString()
วิธีการสำหรับคุณ
ที่เกี่ยวข้อง:เพื่อให้ชื่อที่ดีขึ้นสำหรับคลาส DTO ของคุณอ้างอิงคำตอบนี้