Skip to content

22. نتیجه‌گیری

بیایید خلاصه‌ای از آنچه در این سند انجام داده‌ایم ارائه دهیم. ما دو لایه [DAO] را با استفاده از یکی از دو معماری زیر بررسی کرده‌ایم:

لایه [DAO1] با استفاده از Spring JDBC پیاده‌سازی شد و لایه [DAO2] با استفاده از Spring JPA پیاده‌سازی شد. لایه‌های [DAO1] و [DAO2] همان رابط [IDAO] را پیاده‌سازی کردند که امکان ... را فراهم آورد.یک تست واحد، [JUnitTestDao]، برای تست هر دو لایه، [DAO]، نوشتیم؛

پس از انجام این کار، رابط [IDAO] را به صورت زیر در وب در دسترس قرار دادیم:

  • در [1]، لایه [IDAO] از طریق یک لایه وب [2] که توسط Spring MVC پیاده‌سازی شده بود، در وب ارائه شد. در واقع این رابط [IDAO] است که در معرض دید قرار گرفته است، و ما دو نسخه از سرویس وب را ساخته‌ایم که بسته به اینکه این رابط با استفاده از معماری [DAO-JDBC] یا [DAO-JPA-JDBC] پیاده‌سازی شده باشد، متفاوت هستند؛
  • در [B]، یک کلاینت راه دور از URL که توسط سرویس وب ارائه شده است استفاده می‌کند، که دسترسی به متدهای لایه [IDAO-serveur] را فراهم می‌کند. ما اطمینان حاصل کرده‌ایم که لایه [DAO-Client] و [3]، رابط‌های [IDAO-serveur] و [1] را پیاده‌سازی می‌کنند. این امر به ما امکان داد تا از همان تست [JUnitTestDao]، که قبلاً دو بار استفاده شده بود، مجدداً استفاده کنیم؛
  • در [3]، لایه [DAO-client] با استفاده از Spring RestTemplate پیاده‌سازی شد؛

پس از انجام این کار، ما دسترسی به سرویس وب را ایمن کردیم:

  • در [5]، درخواست کلاینت HTTP از یک لایه احراز هویت که با استفاده از Spring Security پیاده‌سازی شده است، عبور می‌کند؛

با انجام این کار، معماری قبلی را به شکل زیر توسعه داده‌ایم:

  • در [3]، خودِ برنامهٔ کلاینت یک برنامهٔ وب است که توسط وب‌سرور [4] ارائه می‌شود. برنامهٔ کلاینت یک فرم ([5]) را در مرورگر نمایش می‌دهد که برای پرس‌وجو از نقاط پایانی URL سرویس وب امن استفاده می‌شود. دسترسی به سرویس وب امن از طریق HTTP توسط لایه‌ای از [jS] که با جاوااسکریپت پیاده‌سازی شده، تسهیل می‌شود. این معماری از آنچه درخواست‌های بین‌دامنه‌ای نامیده می‌شوند، بهره می‌برد:
    • سرویس وب، URL را در قالب [http://machine1:port1/] بازمی‌گرداند؛
    • برنامه وب کلاینت از یک URL [http://machine2:port2/] دانلود می‌شود. اگر [http://machine2:port2/] با [http://machine1:port1/] (همان ماشین، همان پورت) یکسان نباشد، آنگاه مرورگر کلاینت فراخوانی‌ها به HTTP را از لایه [DAO-client-js] مسدود خواهد کرد. برای حل این مشکل، سرویس وب باید درخواست‌های بین‌دامنه‌ای را مجاز کند؛

پروژه‌های ارائه‌شده با شش پایگاه‌داده زیر آزمایش شده‌اند:

  • MySQL نسخهٔ ۵ Community Edition؛
  • SQL Server 2014 Express;
  • PostgreSQL 9.4;
  • Oracle Express 11g Release 2;
  • IBM DB2 Express-C 10.5;
  • فایربرد 2.5.4;

برای هر یک از این SGBD، چهار لایهٔ مختلف [DAO] توسعه داده شده‌اند:

  • یک لایه پیاده‌سازی‌شده با Spring JDBC;
  • یک لایه پیاده‌سازی‌شده با Spring JPA و ارائه‌دهنده Hibernate JPA؛
  • یک لایه پیاده‌سازی‌شده با Spring JPA و ارائه‌دهنده JPA EclipseLink؛
  • یک لایه پیاده‌سازی‌شده با Spring JPA و ارائه‌دهنده JPA OpenJPA;

در نتیجه، در مجموع بیست‌وچهار پیکربندی مختلف ارائه شد. تلاش زیادی صرف عامل‌زدایی شد:

  • بیشتر کدها تنها یک بار نوشته می‌شوند. این بر اساس دو پروژه پیکربندی Maven است:
    • یکی لایه JDBC را پیکربندی می‌کند؛
    • دیگری لایه JPA را پیکربندی می‌کند؛

پروژه پیکربندی Maven برای لایه JDBC [1] یک SGBD خاص اجازه می‌دهد:

  • وارد کردن آرشیو درایور JDBC;
  • برای تعریف اعتبارنامه‌های دسترسی برای پایگاه داده در حال استفاده و دستورات مختلف SQL که لایه [DAO1] به درایور JDBC ارسال خواهد کرد. اگرچه SQL استاندارد شده است، اما مشکلات قابل حمل بودن به وجود آمده است، عمدتاً به دلیل وجود نام‌های جدول و ستون در پرس‌وجوها که مشخص شد در برخی SGBD کلمات کلیدی ممنوعه هستند. (جدول ROLES برای DB2، ستون PASSWORD برای Firebird). علاوه بر این، اگرچه نام یک ستون معمولاً نسبت به حروف بزرگ و کوچک بی‌تفاوت است، مشکلی در مورد PostgreSQL در خصوص ستون ID در کلید اصلی جدول‌ها به وجود آمد. اصرار داشت که با حروف کوچک id نامگذاری شود؛

سه پروژه پیکربندی Maven برای لایه‌های JPA، [2] و SGBD از یک SGBD خاص اجازه می‌دهند:

  • آرشیو پیاده‌سازی JPA برای وارد شدن؛
  • برای پیکربندی پیاده‌سازی JPA که برای SGBD متصل‌شده‌ی خاص استفاده می‌شود. این به این دلیل است که لایه JPA دستورات SQL را به لایه JDBC ارسال می‌کند. برای عملکرد مؤثر، باید SGBD را بشناسد تا دستورات SQL را که آن تشخیص خواهد داد، برایش ارسال کند. این دستورات ممکن است از SQL، که مالک این SGBD است، و همچنین ویژگی‌های خاص آن (انواع داده‌ها، توالی‌ها، تریگرها، رویه‌ها، تولید خودکار کلیدهای اصلی و غیره) استفاده کنند؛

بدین ترتیب بیست‌وچهار پروژه پیکربندی Maven (۴ پیکربندی × ۶ SGBD) ایجاد شدند که تمام پروژه‌های عملیاتی پایگاه داده دیگر بر اساس آن‌ها شکل گرفتند. در نمودارهای بالا، از آنجایی که لایه‌های [DAO1] و [DAO2] رابط یکسانی را فراهم می‌کنند، ۲۴ پیکربندی دو معماری فوق با استفاده از یک کلاس تست واحد، [JUnitTestDao]، آزمایش شدند. پس از تأیید این معماری‌ها، هیچ مشکل دیگری باقی نماند:

  • پروژه Maven برای انتشار پایگاه داده در وب بر این دو معماری مبتنی است. بنابراین در اینجا نیز ۲۴ پیکربندی ممکن وجود دارد؛
  • پروژه Maven برای ایمن‌سازی دسترسی به سرویس وب نیز بر پروژه قبلی بنا شده است و همچنین ۲۴ پیکربندی ممکن دارد؛
  • در نهایت، پروژه Maven که امکان درخواست‌های بین‌دامنه‌ای به سرویس وب امن را فراهم می‌کند، بر پروژه قبلی بنا شده است و آن نیز ۲۴ پیکربندی ممکن دارد؛

اگرچه این سند تمام قابلیت‌های زبان جاوا یا تمام حوزه‌های کاربرد آن را پوشش نمی‌دهد، اما می‌توان از آن به عنوان یک منبع آموزشی برای این زبان استفاده کرد. خوانندگانی که محتوای این دوره را فرا گرفته باشند، در استفاده از زبان و فریم‌ورک اسپرینگ به سطح «جاوای پیشرفته» خواهند رسید. آنها سپس می‌توانند آموزش جاوا خود را با کتاب‌های زیر ادامه دهند:

  • [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf]، که به بررسی اکوسیستم Spring با معرفی شاخه «برنامه‌نویسی وب» (MVC) ادامه می‌دهد. این کتاب از پایگاه داده‌ای پیچیده‌تر از آنچه در اینجا مورد مطالعه قرار گرفته است، استفاده می‌کند؛
  • [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4]، که یک معماری وب مشتری/سرور را ارائه می‌دهد، جایی که مشتری با استفاده از چارچوب [AngularJS] و سرور با استفاده از [Spring MVC] پیاده‌سازی شده است؛
  • [Introduction à Java EE] [http://tahe.developpez.com/java/javaee]، که از اکوسیستم Spring فاصله گرفته و به سمت معماری وب مبتنی بر JSF (Java Server Faces) و EJB (Enterprise JavaBeans) حرکت می‌کند؛
  • [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa]، که معماری مشتری/سرور را توصیف می‌کند، جایی که مشتری یک تبلت اندروید برنامه‌نویسی‌شده با جاوا است و سرور یک سرویس وب است که با استفاده از Spring MVC پیاده‌سازی شده است؛