์คํ๋ง์ ๊ณต๋ถํด๋๊ฐ๋ฉด์ ์ด๋ ธํ ์ด์ ์ ์ต์ํ์ง๋ง ๊ตฌ์ฒด์ ์ธ ์๋ ๋ฐฉ์์ ๋ํด์๋ ์ ๋ชฐ๋๋ค.
์ด๋ฒ์ CS์คํฐ๋์์ Dispatcher Servlet
์ฃผ์ ๋ฅผ ๋ฐํํ๊ธฐ๋ก ๊ฒฐ์ ๋์๋ค. ๊ด๋ จํด์ ์ฐพ์๋ดค๋๋ฐ ์ต์ํ ๋ด์ฉ๋ค(์คํ์
๋นโฆ)๋ ์์๊ณ ๋ชฐ๋๊ฑฐ๋ ์๋ชป ์๊ณ ์๋ ๋ถ๋ถ(Filter์ Interceptor์ ์๋ ์์น)๋ค๋ ์์๋ค.
์๋ฐ ์๋ธ๋ฆฟ(Java Servlet)์ย ์๋ฐ๋ฅผ ์ฌ์ฉํ์ฌ ์นํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ์๋ฒ์ธก ํ๋ก๊ทธ๋จ ํน์ ๊ทธ ์ฌ์์ ๋งํ๋ฉฐ, ํํ "์๋ธ๋ฆฟ"์ด๋ผ ๋ถ๋ฆฐ๋ค. ์๋ฐ ์๋ธ๋ฆฟ์ ์น ์๋ฒ์ ์ฑ๋ฅ์ ํฅ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๋ฐ ํด๋์ค์ ์ผ์ข ์ด๋ค.
(โฆ)
์๋ฐ ์๋ธ๋ฆฟ์ย `์๋ฐ EEย ์ฌ์์ ์ผ๋ถ๋ถ`์ผ๋ก, ์ฃผ๋ก ์ด ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ์ผํ๋ชฐ์ด๋ ์จ๋ผ์ธ ๋ฑ ํน ๋ฑ์ ๋ค์ํ ์น ์์คํ ์ด ๊ตฌํ๋๊ณ ์๋ค.
https://ko.wikipedia.org/wiki/์๋ฐ_์๋ธ๋ฆฟ
์ฆ, ์๋ธ๋ฆฟ(Servlet)์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์น ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ด๋ค.
์๋ฐ ๊ธฐ์ ๋ก ์ดํ์ ๋ง๋ค ๋ ํ์ํ ์คํ(๊ตฌ์ฑ์์, api, ๋ฐํ์ ์ปจํ ์ด๋, ์๋น์ค ๋ฑ์ ๋ํ ํ์ค ์ฌ์)๋ค์ ์งํฉ์ด๋ค.
์ด์ ์๋ย J2EE๋ผ ๋ถ๋ฆฌ์์ผ๋ ๋ฒ์ 5.0 ์ดํ๋กย Java EE๋ก ๊ฐ์นญ๋์๋ค.
https://ko.wikipedia.org/wiki/์์นด๋ฅดํ_EE
JSP(Java Server Page), Java Servlet
, EJB(Enterprise JavaBeans) ๋ฑ์ ๊ตฌ์ฑ์์๋ก ๊ตฌ์ฑ๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ด๋ฐ ๊ตฌ์ฑ์์๋ค๋ก ๋๊ท๋ชจ ๋ถ์ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ถํ ์๋ ์๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฐ Java EE ์์ฉ ํ๋ก๊ทธ๋จ์ JAR ํ์ผ๋ก ๋ณํํด ์ธ์คํด์ค๋ก ๋ฐฐํฌํ๊ฒ ๋๋ค~
public class DispatcherServlet extends FrameworkServlet {
}
public abstract class FrameworkServlet extends HttpServletBean {
}
public abstract class HttpServletBean extends HttpServlet {
}
๋์คํจ์ฒ ์๋ธ๋ฆฟ๋ย Servlet์ด๋ค.
Dispatcher์ ๋ป์ ๊ธํ์๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋จ์ด ์๋ฏธ ๊ทธ๋๋ก ๊ฐ์ฅ ๋จผ์ ์์ฒญ์ ๋จผ์ ๋ฐ๊ณ , ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ํจ์, ์ฆ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์์ ์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ HttpServlet
์ ์์ํ๋ค.
(DispatcherServlet
-> FrameworkServlet
-> HttpServletBean
-> HttpServlet
์์ ๊ตฌ์กฐ)
๊ณผ๊ฑฐ์๋ ๋ชจ๋ ์๋ธ๋ฆฟ์ URL ๋งคํ์ ์ํด web.xml์ ๋ฑ๋กํด์ผ ํ์ง๋ง, ์ด์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์๋ค!
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์คํ๋ง MVC์ ์ค์ ์๋ธ๋ฆฟ์ด๋ฉฐ ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ค๋ ๋ชจ๋ ์์ฒญ์ ํธ๋ค๋งํ๊ณ ๊ณตํต์์ ์ ์ฒ๋ฆฌํด์ค๋ค.
์ค์ ์์ (๋น์ฆ๋์ค ๋ก์ง, ์์ธ์ฒ๋ฆฌ ๋ฑ)์ ์์ ์ปดํฌ๋ํธ๋ฅผ ํตํด ์ํ๋๋ค.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋งจ ์์์ ๋ชจ๋ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํด์ฃผ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์๋ฏธํ๋ค.
์ด๋ฌํ ํจํด์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ(Front Controller
) ํจํด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ณด๋ค ์์ธํ ์ค๋ช
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ํตํด ์ป์ ์ ์๋ ์ฅ์ ์ด ๋ ์๋ค. ์ ์ ์์๊ณผ ๋์ ์์์ ๋ฐ๋ก ์ฒ๋ฆฌํ ์ ์๋ค๋ ์ ์ด๋ค. (์๋ธ๋ฆฟ์ด๊ธฐ ๋๋ฌธ์ด๋ค)
๋์คํจ์ฒ ์๋ธ๋ฆฟ์์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ๋ฅผ ๋จผ์ ์ฐพ๊ณ , ์ปจํธ๋กค๋ฌ๊ฐ ์์๋ 2์ฐจ๋ก ์ค์ ๋ ์ ์ ์์์ ํ์ํ๋ค.
์ด๋ฅผ ํตํด ํจ์จ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง๋ค!
๋ชจ๋ ์๋ธ๋ฆฟ์ด ๊ทธ๋ ๋ฏ, ๋์คํจ์ณ ์๋ธ๋ฆฟ๋ ์๋ฐ๋ web.xml์ ํตํด ๋ฑ๋ก ๋ฐ ์ด๊ธฐํ ๋์ด์ผ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
ํฐ์บฃ ๋ฑ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ํตํด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์๋ ๋ฐฉ๋ฒ์ผ๋ก ์์์ ์ธ ์ค์ ๋ ๊ฐ๋ฅํ๋ค.
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
// Load Spring web application configuration
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
// Create and register the DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
Java
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app>
web.xml
Servlet Container
์๋ธ๋ฆฟ์ ์ค์ค๋ก ๋์ํ์ง ์๋๋ค. ๋ณดํต ์๋ธ๋ฆฟ์ ๊ด๋ฆฌํ ์๋ธ๋ฆฟ ์ปจํ ์ด๋(ํฐ์บฃ ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ฑ๊ธํค์ธ ์๋ธ๋ฆฟ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค. ๋ํ ์น์๋ฒ์ ์์ผ์ผ๋ก ํต์ ํ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๊ณ ์๋ต์ ๋ณด๋ด์ค๋ค. ๋ฉํฐ์ฐ๋ ๋ ์ฒ๋ฆฌ๋ ์ง์ํ๋ค.
WebApplicationContext
๋์คํจ์ณ ์๋ธ๋ฆฟ์
Servlet WebApplicationContext
์ ์์ฑํ๊ณ Root WebApplicationContext
์ ์์ฑํ๋ค.์๋ธ๋ฆฟ WebApplicationContext
์์๋ ServletContext
์ ์ฐ๊ด๋ Servlet ๋งํฌ
๋ค์ด ์๋ค.
Controller
, ViewResolver
, HandlerMapping
๋ฑ์ด ์ด ์์ ์๋ค. RequestContextUtils
์ ์ ์ ๋ฉ์๋๋ค์ ์ฌ์ฉํด ์ดํ๋ฆฌ์ผ์ด์
์ด WebApplicationContext
๋ฅผ ์กฐํํ ์ ์๋ค.
Root WebApplicationContext
๊ฐ ์๋ ๊ฒฝ์ฐ, infra bean
์ด ์ด ์์ ๋ค์ด๊ฐ๋ค. Repository
, Service
๋น ๋ฑ์ด ์ธํ๋ผ ๋น์ด๋ค.
WebApplicationContext
์ค์ ์ java
๋ web.xml
์ ํตํด ํ ์ ์๋ค.
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { App1Config.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/app1/*" };
}
}
Java
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app1-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app1</servlet-name>
<url-pattern>/app1/*</url-pattern>
</servlet-mapping>
</web-app>
web.xml
Special Bean
)์๊น ๋งํ๋ฏ, ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ ์ปดํฌ๋ํธ์ ์ค์ ์์
์ ๋งก๊ธด๋ค. ์ด๋ฐ ์์ ์ปดํฌ๋ํธ๋ฅผ ์คํ์
๋น(Special Bean
)์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
์คํ์ ๋น์ ํ๋ ์์ํฌ ๊ณ์ฝ์ ๊ตฌํํ๋ ์คํ๋ง ๊ด๋ฆฌ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์๋ฏธํ๋ค. ์ฝ๊ฒ ๋งํ๋ฉด ์คํ๋ง์์ ์ ๊ณตํ๋ ์ฃผ์ ๋น๋ค์ด๋ค. ์คํ์ ๋น๋ค๋ง๋ค ์ ๊ณต๋๋ ์ผ๋ฐ์ ์ธ ์ค์ ๋ค์ด ์์ง๋ง ์ฌ์ฉ์(์ฆ, ํ๋ก๊ทธ๋๋จธ)๊ฐ ์์๋ก ์ฌ์ ์ํ๊ฑฐ๋ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
๋ค์์ ๋์คํจ์ณ ์๋ธ๋ฆฟ์์ ์ฌ์ฉํ๋ ์คํ์ ๋น๋ค์ด๋ค.
handlerMapping
: ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋คhandlerAdapter
: ์์ฒญ์ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌํ๋คhandlerExceptionResolver
: ์์ฒญ์ ๋ํ ์์ธ ๋ฐ์(ํธ๋ค๋ฌ ๋งคํ ๋์ค, ์ปจํธ๋กค๋ฌ ์คํ ๋์ค) ์ ์ฒ๋ฆฌํด์ค๋คviewResolver
: ๋ฆฌํด๊ฐ์ ๋ํ ๋ทฐ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ค. string
์ผ๋ก ๋ทฐ ์ด๋ฆ์ ์ ๋ฌ๋ฐ์์ ๋ ์ด๋ฅผ modelAndView
๋ฑ์ ๊ฐ์ฒด๋ก ๋ฐํํ๋ค.LocaleResolver
: Locale
์ ๊ฒฐ์ ํ๋ค. ์ฐธ๊ณ ๋ก Locale
์ ์ ์ ์ ์ธ์ด,์ง์ญ,์ถ๋ ฅํ์ ๋ฑ์ ์ ์ํ๋ ๋ฌธ์์ด์ด๋ค.MultipartResolver
: ๋ฉํฐํํธ ํ์ผ ์
๋ก๋๋ฅผ ์ฒ๋ฆฌํด์ค๋ค. ์ฐธ๊ณ ๋ก ๋ฉํฐํํธ๋ HTTP ์๋ต์ ๋ฐ๋๋ฅผ ์ฌ๋ฌ ํํธ๋ก ๋๋ ์ ๋ณด๋ด์ค ๋์ ํ์ผ ํ์์ ์๋ฏธํ๋ค.๊ฐ๋ต ๋ฒ์
์์ธ ๋ฒ์
๋์คํจ์ณ ์๋ธ๋ฆฟ์ ๋ค์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
์ด๋ filter
๋ฅผ ๊ฒฝ์ ํ ์ ์๋คใ
filter๋ ๋์ค์ ์ ๋ฆฌํด๋๊ฐ ์์ โฆ
Servlet WebApplicationContext
์์์ HandlerMapping
์ ํตํด ์์ฒญ์ ์์ํ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ฒ์ํด ์ฐพ๋๋ค.HandlerAdapter
๋ฅผ ์ฐพ๋๋ค.Interceptor
preHandle
์ด ์คํ๋๋ค.HandlerAdapter
๊ฐ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ(HttpRequest
)์ ์์ํ๋คArgument Resolver
๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํด ์ปจํธ๋กค๋ฌ๋ก ๋ณด๋ธ๋ค.Root WebApplicationContext
์ Service
, Repository
โฆ ๋ฑ์ ํธ์ถํด๊ฐ๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.Response Entity
)์ด ๋ฆฌํด๋๋ค.Interceptor
postHandle
์ด ์คํ๋๋ค.ViewResolver
์ ์ ๋ฌํ๋ค.ViewResolver
๊ฐ View๋ฅผ ๊ฒ์ํ๊ณ ์ฐพ์ View
์ ์๋ต์ ์ ๋ฌํ๋ค.Interceptor
afterCompletion
์ด ์คํ๋๋ค.View
๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ํด๋ผ์ด์ธํธ(ํ๋ก ํธ ์๋ฒ)๋ก ๋ฐํํด์ค๋ค!๊ฐ ๊ณผ์ ๋ค์ ์ฝ๋์ ํจ๊ป ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด tecoble ๊ธ์ ์ฐธ๊ณ ํ์.
ํด๋น ๊ฐ๋
์ ๊ณต๋ถํ ํ, ์ฐ์ํํ
ํฌ์ฝ์ค ๋ ๋ฒจ4 ๋ฏธ์
์์ ์ง์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๊ตฌํํด๋ณด์๋ค.
1๋จ๊ณ : ๊ธฐ๋ณธ ์๋ธ๋ฆฟ ๊ณจ๊ฒฉ ๊ตฌํ
2๋จ๊ณ : ๋ ๊ฑฐ์ ์ปจํธ๋กค๋ฌ ๋ง์ด๊ทธ๋ ์ด์
3๋จ๊ณ : ์ด๋
ธํ
์ด์
๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝ, ๋ทฐ ์ฒ๋ฆฌ
์ค์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ๊ณผ ์ ํํ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค๊ณ ๋ณผ ์๋ ์๊ฒ ์ง๋ง, ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ต๋ํ ๋ฐ์ํ๋ ค ๋
ธ๋ ฅํ๋ค.
15.2 The DispatcherServlet
What is Dispatcher Servlet in Spring? - GeeksforGeeks
Web on Servlet Stack
์๋ฐ ์๋ธ๋ฆฟ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
Servlet ๊ณผ ServletContainer
DispatcherServlet - Part 1
DispatcherServlet - Part 2
Spring ArgumentResolver์ Interceptor
Front Controller Design Pattern - GeeksforGeeks
[Spring] Dispatcher-Servlet(๋์คํจ์ฒ ์๋ธ๋ฆฟ)์ด๋? ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๊ฐ๋
๊ณผ ๋์ ๊ณผ์
Spring์์ Handler Interceptor ๊ฐ๋
๋ฐ ๊ตฌํํด๋ณด๊ธฐ
Spring MVC - DispatcherServlet ๋์ ์๋ฆฌ
์ฐ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋(ํฐ์บฃ ๋ฑ)์ ํตํด ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ด๋ฆฌ๋ฉ๋๋ค. ์ด๋ฌํ, ์ฑ๊ธํค ๋น์ธ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ก, ํด๋ผ์ด์ธํธ ์์ฒญ๋ค์ ๋ฐ์ต๋๋ค.
์ดํ ํธ๋ค๋ฌ ๋งคํ์ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ(ํธ๋ค๋ฌ)๋ฅผ ์ฐพ๊ณ , ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ํตํด ์น์ดํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ ์์์ ๊ฒ์๋ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ์ ๋ฌํฉ๋๋ค.
์ดํ ์น์ดํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ฅผ ํตํด ์๋น์ค, DB ๋น๋ค์ด ํธ์ถ๋๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง์ด ์ํ๋ฉ๋๋ค. ์ปจํธ๋กค๋ฌ์ ๋ฆฌํด๊ฐ ์ญ์ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ํตํด ๋ทฐ๋ฆฌ์กธ๋ฒ์ ์ ๋ฌ๋๊ณ , ์์์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ํ ModelAndView ๋ฑ์ด ๋ฐํ๋ฉ๋๋ค. ํด๋น ๊ฐ์ฒด๋ ๋ทฐ๋ก ์ ๋ฌ๋๊ณ ์.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์ต์ข
์ ์ผ๋ก ๋ทฐ์์ ์ ๋ฌ๋ฐ์ ๋ฆฌํด๊ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํด์ค๋๋ค.
์ด๋ ๋ฏ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ/์๋ต์ ๋ํ ์ ์ฒ๋ฆฌ ๋ฐ, ์ปจํธ๋กค๋ฌ ๋งคํ ๋ฑ ๊ณตํต ๋ก์ง์ ์ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํด๋ผ์ด์ธํธ์ ๋ค์ํ ์์ฒญ๋ง๋ค ์๋ธ๋ฆฟ์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค๊ณ ํ๋ฉด ๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์์ ํจ์จ์ด ๋จ์ด์ง ์ ๋ฐ์ ์์ต๋๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ ์์ฒญ์ ์ ์ ํ ๊ณณ์ผ๋ก ์์ํด์ค์ผ๋ก์จ ๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์์ ํจ์จ์ฑ์ด ์ฆ๊ฐํ๊ณ ๋ชจ๋ ์์ฒญ์ ๋ํด ๊ณตํต ๊ธฐ๋ฅ์ ํ ๊ณณ์์ ์บก์ํํ ์ ์์ต๋๋ค.
Spring์์๋ DispatcherServlet์ด ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ์ฌ์ฉํ ์์ ๋๋ค. DispatcherServlet์ด Bean์ผ๋ก ๋ฑ๋ก๋์ด package๋ฅผ scanํ๊ณ @Controller, @RestController ์ ๋ ธํ ์ด์ ์ ํ์ธํ์ฌ ์ด๋ ํ ์์ฒญ์ด ๋ค์ด์์ ๋ ์ ์ ํ Handler Method์ ์์ํด์ค๋๋ค.
DispatcherServlet ๊ตฌ๊ธ๋งํ๋ฉด์ ๋ณธ ๊ธ์ค์ ๊ฐ์ฅ ํธํ๋ฉด์๋ ์์ฐจ๊ฒ ์ ๋ณด๋ฅผ ์ป์ ๊ธ ๊ฐ๋ค์ฉ ์ ๋ณด๊ณ ๊ฐ๋๋ค~