Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

Spring in Action Chapter 1 Section 2 | کتاب spring in action فصل اول قسمت دوم

📖توضیحات درس

🎥 این ویدیو قسمت صد و دوم از بوت‌کمپ رایگان جاوا است. 📚 در این جلسه از مسیر Spring in Action وارد بخش مهمی از فصل اول کتاب می‌شویم و قسمت‌های ۱.۳ و ۱.۴ را بررسی می‌کنیم. در این ویدیو یاد می‌گیریم چطور یک Spring Application را به‌صورت اصولی بسازیم، درخواست‌های وب را هندل کنیم، View تعریف کنیم، Controller را تست کنیم و در نهایت با ابزارهای مهمی مثل Spring Boot DevTools تجربه توسعه را سریع‌تر و راحت‌تر کنیم. این جلسه یکی از مهم‌ترین قدم‌ها برای ورود عملی به دنیای Spring و Spring Boot است، چون از اینجا به بعد فقط با مفاهیم تئوری طرف نیستیم و وارد پیاده‌سازی واقعی یک برنامه Spring می‌شویم. همچنین در پایان، نگاهی کلی به Spring landscape می‌اندازیم تا جایگاه Spring Boot، Spring MVC و سایر اجزای مهم این اکوسیستم را بهتر درک کنیم. در طول ویدیو با این موارد آشنا می‌شویم: 🧩 ساخت یک Spring Application و درک جریان کلی اجرای آن 🌐 هندل کردن Web Requestها در Spring MVC 🪟 تعریف View و ارتباط آن با Controller 🧪 تست کردن Controller و بررسی رفتار آن در عمل ▶️ اجرای برنامه و مشاهده نتیجه نهایی ⚡ آشنایی با Spring Boot DevTools برای توسعه سریع‌تر 🗺️ مرور کلی Spring landscape و شناخت جایگاه اجزای مختلف Spring 🧠 در پایان هم یک جمع‌بندی کاربردی از مباحث فصل اول خواهیم داشت تا تصویر کامل‌تری از مسیر یادگیری Spring in Action به دست بیاورید. اگر در حال یادگیری Spring هستید، درک درست این بخش‌ها برای ساخت اپلیکیشن‌های وب واقعی، ساختارمند و قابل نگهداری کاملاً ضروری است. آیدی گروه پرسش و پاسخمون داخل تلگرام: programmingByFarzadAfi@ 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi وب سایت: https://farzadafi.ir هر سوالی داشته باشید میتونید داخل این گروه بپرسید تا خودم یا مربی هایی که در گروه حضور دارن کمکتون کنیم :) بوت کمپ رایگان جاوا آموزش جاوا پروژه محور
01:00:26🎯رایگان

📄جزوه

مفاهیم کلیدی

  • Spring MVC

بخش web framework در Spring است که برای پردازش requestهای HTTP و تولید response استفاده می‌شود. در معماری آن، controller درخواست را دریافت می‌کند، در صورت نیاز model را آماده می‌کند و خروجی را به view می‌سپارد.

  • Controller

یک class در Spring MVC که مسئول handling کردن requestها است. در applicationهای browser-based معمولاً request را گرفته و نام view مناسب را برمی‌گرداند.

  • @Controller

annotationای که یک class را به عنوان web controller معرفی می‌کند. همچنین باعث می‌شود Spring آن را در component scanning پیدا کرده و به عنوان Bean ثبت کند.

  • @GetMapping

annotationای برای mapping کردن requestهای HTTP از نوع GET به یک method.
مثلاً @GetMapping("/") یعنی این method درخواست مسیر / را مدیریت می‌کند.

  • Logical View Name

رشته‌ای که controller برمی‌گرداند و نام منطقی view را مشخص می‌کند.
مثلاً برگرداندن "home" به این معناست که Spring باید view مربوط به home را resolve کند.

  • View Template

فایلی که ظاهر خروجی HTML را مشخص می‌کند. در این متن از Thymeleaf برای ساخت view استفاده شده است.

  • Thymeleaf

یک template engine برای Spring که فایل‌های HTML را با قابلیت‌های dynamic ترکیب می‌کند.
در اینجا از آن برای رندر کردن صفحه خانه استفاده شده است.

  • View Resolution

فرآیندی که در آن Spring بر اساس نام منطقی view، فایل واقعی template را پیدا می‌کند.
مثلاً نام "home" معمولاً به مسیر templates/home.html نگاشت می‌شود.

  • Context-relative Path

مسیری که نسبت به root application تعریف می‌شود.
در Thymeleaf، عبارت @{/images/TacoCloud.png} به مسیر image نسبت به context application اشاره می‌کند.

  • Static Resources

فایل‌هایی مثل image، CSS و JavaScript که مستقیماً به browser سرو می‌شوند. در Spring Boot معمولاً در مسیر src/main/resources/static قرار می‌گیرند.

  • MockMvc

ابزاری برای تست لایه web در Spring بدون نیاز به اجرای server واقعی. با آن می‌توان request شبیه‌سازی کرد و روی status، view و content assertion نوشت.

  • @WebMvcTest

annotation مخصوص تست لایه MVC که فقط اجزای مرتبط با web layer را بالا می‌آورد، نه کل application را.
این کار تست را سریع‌تر و متمرکزتر می‌کند.

  • Web Layer Test

نوعی تست که فقط رفتار controller، mappingها، view و خروجی HTTP را بررسی می‌کند، بدون اینکه کل context یا dependencyهای غیرضروری load شوند.

  • HTTP 200 OK

کد وضعیت موفق برای response HTTP. در تست controller معمولاً بررسی می‌شود که request با موفقیت پاسخ داده شده باشد.

  • Spring Boot Dashboard

قابلیتی در Spring Tool Suite برای اجرای، توقف و restart کردن applicationهای Spring Boot از داخل IDE.

  • Embedded Tomcat

در Spring Boot، server وب مانند Tomcat داخل خود application قرار می‌گیرد و نیاز به deploy جداگانه روی application server نیست.

  • Spring Boot DevTools

مجموعه‌ای از ابزارهای توسعه که فرایند برنامه‌نویسی را سریع‌تر می‌کند؛ مثل restart خودکار application، refresh خودکار browser و غیرفعال کردن cache templateها.

  • Automatic Restart

قابلیت DevTools که با تغییر در کد یا فایل‌های تنظیماتی، application را به‌طور خودکار restart می‌کند تا نتیجه تغییرات سریع دیده شود.

  • Class Loader Separation

در DevTools، کد پروژه و dependencyها در class loaderهای جداگانه بارگذاری می‌شوند. به همین دلیل تغییرات کد سریع‌تر reload می‌شوند، ولی تغییر dependencyها نیاز به restart کامل دارد.

  • Template Cache Disable

در زمان توسعه، DevTools cache مربوط به template engineها را غیرفعال می‌کند تا تغییرات در فایل‌های template بدون restart کامل قابل مشاهده باشند.

  • LiveReload

قابلیتی که با کمک plugin مرورگر، پس از تغییر فایل‌های front-end مثل template، image یا stylesheet، browser را به صورت خودکار refresh می‌کند.

  • H2 Console

اگر از دیتابیس H2 استفاده شود، DevTools یک console داخلی برای مشاهده و بررسی داده‌ها در browser فراهم می‌کند.

  • Starter Dependencies

dependencyهای آماده‌ای که مجموعه‌ای از libraryهای سازگار را به پروژه اضافه می‌کنند.
مثلاً starterهای web و thymeleaf باعث اضافه شدن Spring MVC، embedded Tomcat و Thymeleaf می‌شوند.

  • Autoconfiguration

ویژگی مهم Spring Boot که با توجه به dependencyهای موجود، بخش‌های موردنیاز application را به‌صورت خودکار configure می‌کند.
در این سناریو، MVC، Tomcat و view resolver بدون configuration دستی فعال شدند.

  • View Resolver

کامپوننتی که نام منطقی view را به فایل template واقعی تبدیل می‌کند. در اینجا Thymeleaf view resolver این کار را انجام می‌دهد.

  • Frameworkless Framework

ایده‌ای در مورد Spring که می‌گوید توسعه‌دهنده بیشتر روی business logic تمرکز می‌کند و کمترین درگیری را با کدهای framework-specific دارد.

  • Spring Data

بخشی از ecosystem Spring برای کار با data repositoryها. امکان تعریف repositoryها به صورت interface را فراهم می‌کند و با دیتابیس‌های مختلف مثل JDBC، JPA، Mongo و Neo4j کار می‌کند.

  • Spring Security

فریم‌ورک امنیتی Spring برای پیاده‌سازی authentication، authorization و امنیت APIها.

  • Spring Integration

برای real-time integration بین سیستم‌ها یا اجزای application استفاده می‌شود؛ یعنی داده‌ها هنگام رسیدن پردازش می‌شوند.

  • Spring Batch

برای پردازش batch داده‌ها استفاده می‌شود؛ یعنی داده‌ها جمع می‌شوند و بعد در یک زمان یا trigger مشخص پردازش می‌شوند.

  • Spring Cloud

مجموعه‌ای از پروژه‌ها برای ساخت applicationهای cloud-native و microservices با Spring.

  • Microservices

سبک معماری که در آن application به چند service مستقل و قابل deploy جداگانه تقسیم می‌شود.

  • Spring Native

پروژه‌ای برای تبدیل applicationهای Spring Boot به executable بومی با استفاده از GraalVM native-image، با startup سریع‌تر و مصرف منابع کمتر.


موارد مصاحبه ای

  • Controller در Spring MVC چیست؟

یک class است که requestهای HTTP را دریافت و مدیریت می‌کند و معمولاً نام view یا داده response را برمی‌گرداند.

  • @Controller چه کاری انجام می‌دهد؟

یک class را به عنوان controller معرفی می‌کند و باعث می‌شود Spring آن را در component scanning پیدا و register کند.

  • تفاوت @SpringBootTest و @WebMvcTest چیست؟

@SpringBootTest کل application context را بالا می‌آورد، اما @WebMvcTest فقط web layer را برای تست controllerها load می‌کند.

  • MockMvc چه کاربردی دارد؟

برای تست request/response در Spring MVC بدون اجرای server واقعی استفاده می‌شود.

  • @GetMapping("/") یعنی چه؟

یعنی این method درخواست‌های HTTP GET روی مسیر / را مدیریت می‌کند.

  • وقتی یک controller مقدار "home" را برمی‌گرداند چه اتفاقی می‌افتد؟

Spring آن را به عنوان نام منطقی view در نظر می‌گیرد و با کمک view resolver فایل template متناظر را پیدا می‌کند.

  • چرا Thymeleaf در Spring Boot به‌خوبی کار می‌کند؟

چون با وجود dependency مربوطه در classpath، Spring Boot به‌صورت خودکار view resolver و تنظیمات لازم را فراهم می‌کند.

  • Static resourceها در Spring Boot کجا قرار می‌گیرند؟

معمولاً در مسیر src/main/resources/static.

  • مزیت Embedded Tomcat چیست؟

نیازی به deploy جداگانه روی server خارجی نیست و application همراه با server خودش اجرا می‌شود.

  • Spring Boot DevTools چه مزیتی دارد؟

سرعت توسعه را بالا می‌برد؛ با restart خودکار، refresh خودکار browser و غیرفعال کردن cache templateها.

  • چرا تغییر dependencyها با DevTools همیشه فوری اعمال نمی‌شود؟

چون dependencyها در class loader جداگانه بارگذاری می‌شوند و برای اعمال تغییر آن‌ها نیاز به restart کامل application است.

  • Autoconfiguration در این سناریو چه کارهایی انجام داده است؟

فعال‌سازی Spring MVC، تنظیم embedded Tomcat و پیکربندی Thymeleaf view resolver.

  • Spring Data چه مزیت مهمی دارد؟

کاهش boilerplate در data access و امکان تعریف repositoryها به شکل interface.

  • Spring Security چه مسائل اصلی را پوشش می‌دهد؟

authentication، authorization و امنیت API.

  • تفاوت Spring Integration و Spring Batch چیست؟

Spring Integration برای پردازش real-time است، اما Spring Batch برای پردازش دسته‌ای داده‌ها استفاده می‌شود.


سناریو کاربردی

در این سناریو یک صفحه خانگی ساده برای application ساخته می‌شود:

  • یک controller با نام HomeController تعریف می‌شود.
  • با @GetMapping("/") درخواست‌های مسیر root مدیریت می‌شوند.
  • method مربوطه فقط رشته "home" را برمی‌گرداند.
  • Spring این نام را به template فایل home.html نگاشت می‌کند.
  • فایل template در مسیر src/main/resources/templates/home.html قرار می‌گیرد.
  • image صفحه در مسیر src/main/resources/static/images/TacoCloud.png ذخیره می‌شود.

نمونه controller:

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "home";
    }
}

برای تست این رفتار:

  • با @WebMvcTest(HomeController.class) فقط لایه web بالا می‌آید.
  • با MockMvc یک request از نوع GET به / ارسال می‌شود.
  • انتظار می‌رود:
    • وضعیت response برابر 200 باشد
    • نام view برابر home باشد
    • محتوای HTML شامل "Welcome to..." باشد

نمونه تست:

@WebMvcTest(HomeController.class)
public class HomeControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testHomePage() throws Exception {
        mockMvc.perform(get("/"))
            .andExpect(status().isOk())
            .andExpect(view().name("home"))
            .andExpect(content().string(containsString("Welcome to...")));
    }
}

این سناریو یک الگوی پایه و بسیار مهم را نشان می‌دهد:

  • request وارد controller می‌شود
  • controller نام view را برمی‌گرداند
  • template engine خروجی HTML را تولید می‌کند
  • تست web layer بدون اجرای server واقعی قابل انجام است

بیشتر بدانید

  • نکته مهم درباره @Controller

از نظر ثبت شدن در context، annotationهایی مثل @Component، @Service و @Repository هم می‌توانند مشابه عمل کنند؛ ولی @Controller از نظر معنایی دقیق‌تر است.

  • نکته مسیر template

اگر نام view برابر home باشد، معمولاً template متناظر در templates/home.html جستجو می‌شود.

  • نکته مسیر image

برای قابل‌دسترسی بودن فایل‌های ثابت از browser، آن‌ها را در پوشه static قرار دهید، نه templates.

  • مزیت تست با MockMvc

بدون بالا آوردن server واقعی می‌توانید routing، status code، view name و content را تست کنید.

  • نکته DevTools

برای تغییرات مربوط به کد Java و templateها عالی است، اما تغییر در dependencyها معمولاً نیاز به restart کامل دارد.

  • مزیت LiveReload

اگر plugin مرورگر نصب باشد، بعد از تغییر template یا resourceهای front-end، browser خودکار refresh می‌شود و چرخه توسعه سریع‌تر می‌شود.

  • نکته cache template

در production، cache برای performance مفید است؛ ولی در development بهتر است غیرفعال باشد تا تغییرات سریع دیده شوند.

  • نکته Tomcat در Spring Boot

وجود embedded Tomcat یعنی application self-contained است و مثل یک executable web app اجرا می‌شود.

  • نکته معماری

این مثال نشان می‌دهد Spring Boot باعث می‌شود با حداقل کد framework-specific، یک feature واقعی پیاده‌سازی شود.

  • مرور سریع landscape Spring

برای web از Spring MVC، برای data از Spring Data، برای security از Spring Security، برای integration از Spring Integration و Spring Batch، و برای microservices از Spring Cloud استفاده می‌شود.