Spring in Action Chapter 1 Section 2 | کتاب spring in action فصل اول قسمت دوم
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
- 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..."باشد
- وضعیت response برابر
نمونه تست:
@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 استفاده میشود.
