المشروع
كل ما سبق مجمَّعًا في تطبيق جاهز للإنتاج.
مشروع متكامل باستخدام Spring Boot
تناولت الدروس السبعة السابقة كل موضوع على حدة. يجمعها هذا الفصل في تطبيق مكتبة إلكترونية، مع تقسيم الطبقات، والمستودعات، والترقيم الصفحي، وإدارة المعاملات، والاختبارات. الهدف ليس عرض بنية معمارية نموذجية، بل بيان المواضع التي يظهر فيها كل فخ سبق عرضه داخل مشروع حقيقي، وقرار التصميم الذي يُبطل أثره.
يضيف Spring Data JPA فوق JPA آلية تستحق التوقف عندها: فهو يولّد تنفيذ المستودعات انطلاقًا من أسماء الدوال. يكفي أن تكتب findByAuteurNomContainingIgnoreCase لتحصل على الاستعلام المطابق. هذا توفير حقيقي للوقت، وهو في الوقت نفسه فخ حقيقي بالقدر ذاته، لأن اسم الدالة لا يقول شيئًا عن العلاقات التي ستُحمَّل، فنقع في مشكلة N+1 دون أن نكتب سطرًا واحدًا من JPQL.
يقوم التنظيم المعتمد هنا على قاعدة واحدة تنبع من كل ما سبق: لا تتجاوز الكيانات (entities) حدود الطبقة المعاملاتية أبدًا. تعيش الكيانات داخل طبقة الخدمة، ويخرج منها DTO فقط. تزيل هذه القاعدة دفعة واحدة LazyInitializationException، واستعلامات N+1 التي تُطلقها طبقة الويب، وتسرب البيانات الداخلية في استجابات HTTP.
يُختبر المشروع على PostgreSQL حقيقي عبر Testcontainers، لأن H2 لا يحاكي التسلسلات (sequences) ولا القفل ولا سلوك ترحيلات Flyway.
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش