You are currently viewing إحتراف إطار سبرينغ بالدارجة – Spring Framework B’Darija

إحتراف إطار سبرينغ بالدارجة – Spring Framework B’Darija

كيفاش تقدر تولي مبرمج محترف بإطار العمل ديال Spring Boot ؟

سلام الإخوان.. من بعد ماسولني واحد الصديق باش خاصو يبدي الا بغا يتعلم سبرينغ فريم وورك قررت ندير هاد المنشور باش نشارك معكم التجربة ديالي المتواضعة فهاد الفريموورك وباش كاع الناس تستافد.

أولا شنو هو سبرينغ بوت Spring Boot؟

قبل منجاوب على هاد السؤال، لي سمع بسبرينغ سابقا واش عمرو تساءل واش كاين شي فرق بين سبرينغ وسبرينغ بوت؟ سبرينغ وسبرينغ بوت هما زوج حوايج مختالفين ولكن فنفس اللحضة متكاملين، نقدرو نقولو سبرينغ بوت مكمل لسبرينغ.

إذن شنو هو الفرق بين سبرينغ وسبرينغ بوت؟

بعجالة سبرينغ هو إطار العمل.

سبرينغ بوت هي أدات كتسرع لينا العمل بسبرينغ بشكل كبير بزاف.. مثلا حنا نقدرو نحدو الاسم ديال artifact لي غادي نصمموه وسبرينغ البوت يدير لينا كاع الإعدادات الضرورية، مثلا غادي يوجد لينا للإطار ديال سبرينغ بنفسو، غادي يحمل ويوجد لدينا السيرفر (سبرينغ داخل فيه كاين سيرفر لي يقدر يكون tomcat ولا jetty، الخ) زائد غادي يدير لينا إعدادات ضرورية فواحد XML file خاص بال beans لي ضروريين ومن بعد خاصنا نعتامدو على هاد file باش نزيدو فيه beans أخرين لي غادي نكونوهم يدويا. بمعنى آخر سبرينغ بوت كيوجد لينا دوك الاعدادات لي ضروريين وكيتعاودو ديما.

متقلقوش ملي تقراو شي مصطلح جديد غادي نحاول نشرحهم أن شاء الله ما أمكن.

المهم دابا فهمنا شنو هو سبرينغ بوت دابا غادي نوليو لسبرينغ، شنو هو؟

سبرينغ هو إطار عمل خاص بجافا EE وغادي يساعدنا باش نطورو مواقع وتطبيقات الويب صوا غادي برمجة موقع ويب بالواجهة ديالو ولا غي API وهاد API من بعد غادي يستهلكها شي تطبيق مصنوع ب angular ولا react ولا vue ولا أي إطار عمل آخر خاص بالواجهات.

بصح شنو لي كيميز سبرينغ؟

سبرينغ كيخدم بفلسفة inversion Of control ولا بالعربية عكس التحكم. هاد الفلسفة كتقول لينا بلي الفريموورك بنفسو هو لي كيتحكم فدورة حياة واحد petition ديال شي user وباش يطبق هاد الفلسفة سبرينغ كيعتمد فهاد الحالة على Dependency Injection ولي بالعربية هي حقن التبعية.

💡 للإشارة الا فهمتو مزيان كيفاش تخدمو بحقن التبعية غادي تكونو تعلمو الأساسي فسبرينغ.

شنو هو Dependency Injection؟

باش نفهمو هاد المصطلح التقني خاص نفهمو كل كلمة كتكون بها ماشي المعنى اللغوي وانما المعنى الإصلاحي فإيطار سبرينغ.

قناة Coding.ma

ال Dependency ولي كتعني التبعية هي ملي شي object1 ديال جافا كيعتامد على object2 آخر أو بمعنى آخر لا أقل ولا أكثر هاد object2 هو attribute ديال object1 ولكن ماشي كاع attribute كنديرو ليهم Dependency Injection غي شي وحدين (من بعد نشرحو هادشي)

الكلمة الثانية هي Injection ولي كتعني الحقن.. كيفاش الحقن ديال التبعات؟

تخيلو معي مثلا خاصنا واحد Object لي من خلالو نقدرو نتحكمو فقاعدة البيانات وObject آخر خاص باش نتحكمو فال Cache memory دابا هاد Objects خاصنا نديكلاريو عليهم فclass قبل منخدمو بهم وأكثر من ذلك خاص ندير ليهم instance يعني:

ClassObject obj = new ClassObject()

وتخيلو معي الا حتاجينا واحد الكائن بحال هادو فبزاف ديال classes خاصنا ديما تبقاو ديما نديرو instance ؟؟؟ ربما غادي تقولو معليش شنو فيها؟ لا فيها..

ملي كيكون مشروع كبير بزاف رآه كل instance جديدة كتسهلك الذاكرة العشوائية لي هي RAM

وتخيلو أنا بقيت غي واحد instance ديال واحد object نخدمو ف10 ديال classes مختالفين.. نقدرو نحلو المشكل بشكل تقليدي ولكن الخدمة غادي تكون صعيبة وغادي تعقد بزاف.

إذن شنو هو الحل؟

الحل هو حقن التبعية.. سبرينغ عندو واحد الإطار وهمي ولا نقدو نقولو واحد لبلاصة لي سميتها container فهاد لبلاصة حنا نقدو نحطو ل beans ديالنا لي غادي نحتاجهم.

شنو هو Bean؟

ال Bean هو لا أقل ولا اكتر واحد instance ديال واحد object ولي غادي نحتاجوه بزاف المرات فبزاف classes.

إذن الفلسفة ديال Dependency Injection هي كالتالي:

حنا بغينا واحد instance غادي اولا نديروه فال container ديال Spring وفأي وقت ولا فأي بلاص (كلاس) حتاجيناه غادي نطلبو Spring باش يعطيه لينا ونخدمو به.

مغيكون عندنا لا مشكل ديال استهلاك الذاكرة العشوائية لا تعقيد فالكود.

غيبقا ليكم تفهمو كيفاش نقدرو نحطو هاد الbeans فال container و كيفاش نقدرو نجبدوه باش نستعملوه فالمشروع ديالنا.. ولكن هادو مسائل تقنية تقدرو تعلموهم بشكل بسيط ملي تفهمو هاد الفلسفة.. التطبيق ديالها ساهل ساهل بزاف.

اوكي دابا فهمنا شنو هو سبرينغ والفلسفة باش خدام، ولكن فمشروع حقيقي شنو كنحتاجو كاع؟

الأدوات والمهارات الأساسية للعمل بسبرينغ

فمشروع حقيقي غادي نحتاجو بزاف الأدوات والمكتبات.. كاين بعض المكتبات كيكونو تابعين لسبرينغ وكاين وحدين أخرين ديال جافا بصفة عامة.

لكن قبل كل شيء خاص على الأقل تكونو ضابطين النسخة 8 من جافا حيت فيها بزاف ديال المسائل لي غادي نحتاجوها فالخدمة ديالنا بحال streams, lambdas, predicates, الخ.

انا شخصيا مكنتش ضابط جافا 8 ولكن مع الوقت بقيت خدام وأي حاجة مفهمتهاش كنمشي نتعلمها ومكتخدش لي الوقت بزاف.

كذلك خاصنا نعرفو نتعاملو مع XML files لي خاصين بالاعدادات.. وممكن نشير إلى أن هاد النوع ديال الإعدادات قديمة وبلي دابا الإعدادات نقدرو نديرهم بجافا مباشرة بمساعدة annotations ولكن واخا هكك خاص تعلمو ليهم حيت تقدرو تلاقاو مع مشاريع قديمة نوعا ولي مزال مداروش ليهم upgrade

كذلك خاص تعرفو تخدمو ب Maven ولا Gradle على حسب المشروع.

شنو الدور ديال Maven ؟ هي واحد الأدات قوية لي كتساعدنا فإدارة المشروع لي غادي نخدمو عليه وأتمتة بعض المهام بحال التحميل الأوتوماتيكي ديال Dependencies وال compilation وال testing الخ..

فواحد ال file لي سميتو POM.xml غادي نديرو فيه الوصف ديال المشروع كامل.. يعني غادي نديرو فيه كاع المكتبات لي غادي نحتاجهم فيه ومختلف Modules لي غادي يكونو المشروع ديالنا.

تقدرو تقولو بلي هاد pom.xml هو بحال package.json لي كنخدمو به فجافاسكريبت وnode.js

ذكرت ليكم Modules شنو هما؟ المشروع لي كتخدم عليه يقدر كامل يكون module وهاد الموديل يقدر يعتمد عليه موديل واحد آخر وال modules لي خدام عليه بنفسو يقدر يكون متكون ب modules وحدين أخرين.

الmodule هو عبارة على classes لي غادي تبرمجهم وfiles خاصين بالاعدادات ولي كيكونو لينا artifact باش هاد الmodules يقدرو يتواصلو بيناتهم خاصنا نديرو الوصف كلو فال pom.xml file.

شنو كنقصد بالتواصل بين مختلف modules ؟ القصد ديالي هو إلا بغيت نعيط على واحد الكلاس لي كاينة ف module1 فواحد module2 الا بغينا تكون عندنا هاد الإمكانية خاصنا فال pom.xml نوصفو بلي module2 راه كيحتاج ولا كيعتمد على module1 وأي خطأ يقدر يوقع فشي كلاس كاينة ف module1 تقدر تأدي فعمدم compilation ديال module2 ويقدر المشروع كامل.

حتى موضوع خاص بالتبعية وخاص تكونو فاهمينو مزيان الا بغيتو تقدرو تبرمجو بspring بشكل إحترافي. وكنركز على هاد النقطة بلي Maven مهم بزاف باش تفهمو كيف كيخدم. في حالة مخدمتوش ب Maven غادي تخدمو بأداة مشابهة عندها نفس الدور.

كذلك خاص تعلمو تستعملو annotations.

الannotations ساهلين بزاف وكيساعدو فالخدمة بزاف بزاف وما هم لا أقل ولا اكتر:

@AnnotationName

مثلا بغينا نقولو بلي واحد الكلاس بلي هي component ولا Bean غادي نحتاجوه فسبرينغ غادي فوق الكلاس نديرو :

Component@
public class DataBaseAccess{
}

Hibernate والـ JPA وقواعد البيانات والـ

كذلك مثلا الا بغيتو تخدمو بقواعد البيانات خاص تعلمو ل JPA ولي هي java persistence API ولي كتخدم بلغة JPQL وال Hibernate لي خاصة بال mapping ديال بين واحد table فقاعدة البيانات وواحد object model لي هي POJO Class .

الpojo class هي واحد الكلاس عادية فيها غي attributes وال getters و setters ومعندهاش methodes ولا functions وضيفيين.

علاش غادي نخدمو بhibernate ؟ حيت خاص نحولو table ديال SQL لجافا object باش نقدرو نتحكمو فيه ونستهلكوه بشكل بسيط جدا.

التحكم في الذاكرة العشوائية بالـ Hazelcast

كذلك باش نقدرو نكونو شي ميموار كاش لي نقدرو نخزنو فيها بيانات مؤقتة نقدرو نعتامدو على hazelcast. فاش غادي تنفعنا هاد الذاكرة المؤقتة؟

تخيلو معي المستخدم ممكن ليه يعيط على API ديال باش يحصل على واحد json array list لي كبيرة بزاف، حنا الباكند ديالنا خاصو يعيط على database ويرجع داكشي لي بغا المستخدم وكما كتعرفو الكونيكسيون لقاعدة البيانات والحصول على البيانات منها عملية كتستهلك الموارد ديال السيرفر بزاف وتخيل ماشي غي مستخدم واحد لي غادي يدير petition وانما 10000 فنهار غادي نتقلو بزاف على قاعدة البيانات. ولكن كما كتعرفو الذاكرة العشوائية لي هي RAM أسرع من الذاكرة العادية ديال قاعدة البيانات. إذن لي كنديرو هو كنبرمجو واحد job باش كاع البيانات لي كاينين فقاعدة البيانات ندوزوهم لواحد الذاكرة سريعة فRAM بمساعدة مكتبة بحال hazelcast. والهزيلكاست ماشي في مكتبة عادية وانما service كامل.

كذلك باش نبرمجو job events نقدرو نعتامدو على مكتبة quarts باش مثلا الا تسجل واحد الشخص جديد نسجلو المعلومات ديالو بشكل عادي فقاعدة البيانات ومن بعدها نديرو واحد job باش يخزنها فram أو نقدرو مثلا من ساعة لساعة نعيطو على قاعدة البيانات وندوز كاع المعلومات لي دخلو جداد وتسجلوهم ذاكرة الhazelcast

اختبار الوحدات أو Unit Testing والاختبارات الوظيفية

كذلك خاص نتعلمو ل JUnit لي هي مكتبة خاص بunit testing

كذلك نقدرو نتعلمو ل Cucumber لي هي مكتبة خاصة ب functional testing

الا كنا غادي نصاوبو شي API بسبرينغ خاصنا شي أداة بحال Postman لي نقدرو نجربوها فيه.

كذلك خاص ضروري ضروري تعلمو ل debbug بأي أداة

والا بغيتو تمشيو بعيد تعلمو كيفاش كتخدم JVM ديال جافا و garbage collector الخ

الديف أوبس DevOps

متنساوش تعلمو كذلك DevOps وكيفاش تقدر تخدم بشكل سلس ففريق العمل لي كيعتد على هاد المنهجية.

بلا متنساو Git لي حاجة لا استغناء عنها.. هي ماشي اختيارية وانما من المسلمات تعلمو ليها.

كذلك خاص تعلمو لبعض design patterns لي ضروريين بحال mvc.

البداية كـ Junior Developer

وللإشارة عالم الجافا عالم كبير، ويقدر فالعمل ديالك مغاديش دير كاع داكشي لي تعلمت.. يقدر مثلا يعطيوك دير غي Unit testing ويقدر دير غي functional testing بالكوكمبر. مثلا الا كان مشروع كبير وديجا مبني مزيان الإنسان يبدي بال functional testing باش يفهم كيفاش مصمم المشروع وكيفاش خدام وال modules لي متكون به.

أنا شخصيا فأول تجربة ديالي بديت بال functional testing بالcucumber وداكشي ساعندي بزاف باش نفهم المشروع كيف داير حيت كان مشروع كبير بزاف وماشي ساهل تفهمو الا بديت تبرمج ال features من الأول.

من بعد شهرين عاد بديت كنقيس backend نيشان.

نتمنى نكون توفقت فالشرح ولأي سؤال مرحبا.

أضف تعليقاً