


Front Controller ๋์ ์ ์ ํด๋ผ์ด์ธํธ์์ ํธ์ถ์ ํ ๋ Controller A, B, C ์ด๋ ๊ฒ ๋ค๋ฅธ Controller์ ํธ์ถํด๋ ๊ณตํต์ ์ธ ๋ถ๋ถ์ด ๋ง์ ๊ณตํต์ฒ๋ฆฌ๊ฐ ๋์ง ์์ ๋ถํธํ ์ ์ด ๋ง์๋ค. ํ์ง๋ง ๋์ ํ ์ด๋ค ๊ฒ์ด ์ ๋ฆฌํด์ก๋์ง ํ์ธํด๋ณด์.
์ง๊ธ๋ถํฐ Spring MVC๋ฅผ ํ์ตํ๊ธฐ ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ฐ์ ํด ์๋์ง ๊ณต๋ถํ ๊ฒ ์ค ํต์ฌ์ ์ธ ๋ด์ฉ๋ง ์์ฑ

@WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {
private Map<String, ControllerV1> controllerMap = new HashMap<>();
public FrontControllerServletV1() {
controllerMap.put("/front-controller/v1/members/new-form", new
MemberFormControllerV1());
controllerMap.put("/front-controller/v1/members/save", new
MemberSaveControllerV1());
controllerMap.put("/front-controller/v1/members", new
MemberListControllerV1());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("FrontControllerServletV1.service");
String requestURI = request.getRequestURI();
ControllerV1 controller = controllerMap.get(requestURI);
if (controller == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
controller.process(request, response);
}
}
urlPatterns
urlPatterns = "/front-controller/v1/*"์ด๋ฐ์์ผ๋ก Servlet์ urlPattern์ ์ค์ ํ ๊ฒฝ์ฐ/front-controller/v1๋ฅผ ํฌํจํ ํ์ ๋ชจ๋ ์์ฒญ์ ์ด ์๋ธ๋ฆฟ์์ ๋ฐ์๋ค์ด๊ฒ ๋๋ค.- ์ฆ ๋ค๋ฅธ ํ์ ์์ฒญ์ ๋ถ๋ ์ ๋ ๋ฌด์กฐ๊ฑด ์ด ์๋ธ๋ฆฟ์ ๊ฑฐ์น๊ฒ ๋๋ค๋ ๊ฒ.
controllerMap
- key : ๋งคํ URL
- value : ํธ์ถ๋ ์ปจํธ๋กค๋ฌ
service()
- ๋จผ์
requestURL๋ฅผ ์กฐํํด์ ์ค์ ํธ์ถํ ์ปจํธ๋กค๋ฌ๋ฅผcontrollerMap์์ ์ฐพ๋๋ค. ๋ง์ฝ ์๋ค๋ฉด 404(SC_NOT_FOUND) ์ํ ์ฝ๋๋ฅผ ๋ฐํํ๋ค.- ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๊ณ
controlle.process(request. response);์ ํธ์ถํ์ฌ ํด๋น ์ปจํธ๋กค๋ฌ๋ฅผ ์คํ

String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
public interface ControllerV2 {
MyView process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
๊ธฐ์กด์๋ ๊ฐ ์ปจํธ๋กค๋ฌ์์ ๋ณต์กํ
dispatcher.forward()๋ฅผ ์ง์ ์์ฑํ์์ง๋ง ์ด์ ๋ ํธ์ถํ์ง ์์๋ ๋๋ค. ๋จ์ํ MyView ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฑฐ๊ธฐ์ ๋ทฐ ์ด๋ฆ๋ง ๋ฃ๊ณ ๋ฐํํ๋ฉด ๋๊ฒ ์ฝ๋๊ฐ ์ค๊ณ ๋จ
๊ฒฐ๋ก : ๋จ์ ๋ฐ๋ณต ๋๋ ๋ทฐ ๋ก์ง ๋ถ๋ฆฌ
์๋ธ๋ฆฟ ์ข ์์ฑ ์ ๊ฑฐ
- ์ปจํธ๋กค๋ฌ ์ ์ฅ์์๋
HttpServletRequestHttpServletResponse๊ฐ ๊ผญ ํ์ํ ๊น?- ์์ฒญ ํ๋ผ๋ฏธํฐ ์ ๋ณด๋ ์๋ฐ์ Map์ผ๋ก ๋์ ๋๊ธฐ๋๋ก ํ๋ฉด ์ง๊ธ ๊ตฌ์กฐ์์๋ ์ปจํธ๋กค๋ฌ๊ฐ ์๋ธ๋ฆฟ ๊ธฐ์ ์ ๋ชฐ๋ผ๋ ๋์ํ ์ ์๋ค.
- request ๊ฐ์ฒด๋ฅผ Model๋ก ์ฌ์ฉํ๋ ๋์ ์ ๋ณ๋์ Model ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ฉด ๋๋ค.
- ์ฐ๋ฆฌ๊ฐ ๊ตฌํํ๋ ์ปจํธ๋กค๋ฌ๊ฐ ์๋ธ๋ฆฟ ๊ธฐ์ ์ ์ ํ ์ฌ์ฉํ์ง ์๋๋ก ๋ณ๊ฒฝํด๋ณด์.
๋ทฐ ์ด๋ฆ ์ค๋ณต ์ ๊ฑฐ
- ์ปจํธ๋กค๋ฌ์์ ์ง์ ํ๋ ๋ทฐ ์ด๋ฆ์ ์ค๋ณต์ด ์๋ ๊ฒ์ ํ์ธ
- ์ปจํธ๋กค๋ฌ๋ ๋ทฐ์ ๋ ผ๋ฆฌ ์ด๋ฆ์ ๋ฐํํ๊ณ , ์ค์ ๋ฌผ๋ฆฌ ์์น์ ์ด๋ฆ์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ๋๋ก ๋จ์ํ ํ์.
- ์ด๋ ๊ฒ ํด๋ ๊ฒฝ์ฐ ํฅํ ๋ทฐ ํด๋ ์์น๊ฐ ํจ๊ป ์ด๋ํด๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ง ๊ณ ์น๋ฉด ๋๋ค.
/WEB-INF/views/new-form.jsp-> new-form/WEB-INF/views/save-result.jsp-> save-result/WEB-INF/views/members.jsp-> members

์ง๊ธ๊น์ง ์ปจํธ๋กค๋ฌ์์ ์๋ธ๋ฆฟ์ ์ข ์์ ์ธ HttpServletRequest๋ฅผ ์ฌ์ฉ, ๊ทธ๋ฆฌ๊ณ Model๋
request.setAttribute๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๋ทฐ์ ์ ๋ฌํ์์. ์๋ธ๋ฆฟ์ ์ข ์์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด Model์ ์ง์ ๋ง๋ค๊ณ , ์ถ๊ฐ๋ก View ์ด๋ฆ๊น์ง ์ ๋ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ
members/WEB-INF/views/members.jsp
view.render(mv.getModel(), request, response)
- ๋ทฐ ๊ฐ์ฒด๋ฅผ ํตํด HTML ํ๋ฉด์ ๋ ๋๋ง
- ๋ทฐ ๊ฐ์ฒด์
render()๋ ๋ชจ๋ธ ์ ๋ณด๋ ํจ๊ป ๋ฐ๋๋ค.- JSP๋
request.getAttribute()๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์request.setAttribute()๋ก ๋ด์๋๋ค.- JSP๋ก ํฌ์๋ ํด์ JSP๋ฅผ ๋ ๋๋ง ํ๋ค.
์์ ๋ง๋ v3 ์ปจํธ๋กค๋ฌ๋ ์๋ธ๋ฆฟ์ ์ข ์์ฑ์ ์ ๊ฑฐํ๊ณ ๋ทฐ ๊ฒฝ๋ก์ ์ค๋ณต์ ์ ๊ฑฐํ๋ ๋ฑ, ์ ์ค๊ณ๋ ์ปจํธ๋กค๋ฌ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ค์ ์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฐ๋ฐ์ ์ ์ฅ์์๋ ํญ์ ModelView ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฐํํด์ผ ํ๋ ๋ถ๋ถ์ด ์กฐ๊ธ์ ๋ฒ๊ฑฐ๋กญ๋ค. ์ข์ ํ๋ ์์ํฌ๋ ์ํคํ ์ฒ๋ ์ค์ํ์ง๋ง, ๊ทธ์ ๋๋ถ์ด ์ค์ ๊ฐ๋ฐํ๋ ๊ฐ๋ฐ์๊ฐ ๋จ์ํ๊ณ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค. ->
์ค์ฉ์ฑ๊ณผ ์ฐ๊ด

v4 ์ ๋ฆฌ
- ์ด๋ฒ ๋ฒ์ ์ ์ปจํธ๋กค๋ฌ๋ ๋งค์ฐ ๋จ์ํ๊ณ ์ค์ฉ์
- ๊ธฐ์กด ๊ตฌ์กฐ์์ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๊ณ , ๋ทฐ์ ๋ ผ๋ฆฌ ์ด๋ฆ์ ๋ฐํํ๋ค๋ ์์ ์์ด๋์ด๋ฅผ ์ ์ฉํ์ ๋ฟ์ธ๋ฐ, ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํ๋ ๊ฐ๋ฐ์ ์ ์ฅ์์ ๋ณด๋ฉด ์ด์ ๊ตฐ๋๋๊ธฐ ์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์.
- ์ค์ํ ์ฌ์ค์ ์ฌ๊ธฐ๊น์ง ๋ฐ์ ํด ์จ ๊ฒ์ด ํ๋ฒ์ ์จ ๊ฒ์ด ์๋๋ผ ํ๋ ์์ํฌ๊ฐ ์ ์ง์ ์ผ๋ก ๋ฐ์ ํ๋ค๋ ๊ฒ.
- ํ๋ ์์ํฌ๋ ๊ณตํต ๊ธฐ๋ฅ์ด ์๊ณ ๋ก์์ผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๊ฐ ํธ๋ฆฌํด์ง๋ค.

์ค๊ฐ์ ์ด๋ํฐ ์ญํ ์ ํ๋ ์ด๋ํฐ๊ฐ ์ถ๊ฐ๋์๋๋ฐ ์ด๋ฆ์ด ํธ๋ค๋ฌ ์ด๋ํฐ์ด๋ค. ์ฌ๊ธฐ์ ์ด๋ํฐ ์ญํ ์ ํด์ฃผ๋ ๋๋ถ์ ๋ค์ํ ์ข ๋ฅ์ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ ์ ์๋ค.
์ปจํธ๋กค๋ฌ์ ์ด๋ฆ์ ๋ ๋์ ๋ฒ์์ธ ํธ๋ค๋ฌ๋ก ๋ณ๊ฒฝํ๋ค. ๊ทธ ์ด์ ๋ ์ด์ ์ด๋ํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ผญ ์ปจํธ๋กค๋ฌ์ ๊ฐ๋ ๋ฟ๋ง ์๋๋ผ ์ด๋ ํ ๊ฒ์ด๋ ํด๋นํ๋ ์ข ๋ฅ์ ์ด๋ํฐ๋ง ์์ผ๋ฉด ๋ค ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ํฐ๋ ์ด๋ป๊ฒ ๊ตฌํํด์ผ ํ ๊น?
public interface MyHandlerAdapter {
boolean supports(Object handler);
ModelView handle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws ServletException, IOException;
}
boolean supports(Object handler)
- handler๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋งํ๋ค.
- ์ด๋ํฐ๊ฐ ํด๋น ์ปจํธ๋กค๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋์ง ํ๋จํ๋ ๋ฉ์๋๋ค.
ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler
- ์ด๋ํฐ๋ ์ค์ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ก ModelView๋ฅผ ๋ฐํํด์ผ ํ๋ค.
- ์ค์ ์ปจํธ๋กค๋ฌ๊ฐ ModelView๋ฅผ ๋ฐํํ์ง ๋ชปํ๋ฉด, ์ด๋ํฐ๊ฐ ModelView๋ฅผ ์ง์ ์์ฑํด์๋ผ๋ ๋ฐํํด์ผํ๋ค.
- ์ด์ ์๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ์ค์ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ์ง๋ง ์ด์ ๋ ์ด ์ด๋ํฐ๋ฅผ ํตํด์ ์ค์ ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๋ค.
public class ControllerV3HandlerAdapter implements MyHandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof ControllerV3);
}
@Override
public ModelView handle(HttpServletRequest request, HttpServletResponse
response, Object handler) {
ControllerV3 controller = (ControllerV3) handler;
Map<String, String> paramMap = createParamMap(request);
ModelView mv = controller.process(paramMap);
return mv;
}
private Map<String, String> createParamMap(HttpServletRequest request) {
Map<String, String> paramMap = new HashMap<>();
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> paramMap.put(paramName,
request.getParameter(paramName)));
return paramMap;
}
}
์ด์ ์ด ์ด๋ํฐ๋ฅผ ๋ถ์ํด๋ณด์.
public boolean supports(Object handler) {
return (handler instanceof ControllerV3);
}
ControllerV3 controller = (ControllerV3) handler;
Map<String, String> paramMap = createParamMap(request);
ModelView mv = controller.process(paramMap);
return mv;
Controller -> Handler
- ์ด์ ์๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ง์ ๋งคํํด์ ์ฌ์ฉํ๋ค.
- ๊ทธ๋ฐ๋ฐ ์ด์ ๋ ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ปจํธ๋กค๋ฌ ๋ฟ๋ง ์๋๋ผ ์ด๋ํฐ๊ฐ ์ง์ํ๊ธฐ๋ง ํ๋ฉด, ์ด๋ค ๊ฒ์ด๋ผ๋ URL์ ๋งคํํด์ ์ฌ์ฉํ ์ ์๋ค.
- ๊ทธ๋์ ์ด๋ฆ์ ์ปจํธ๋กค๋ฌ์์ ๋ ๋์ ๋ฒ์์ ํธ๋ค๋ฌ๋ก ๋ณ๊ฒฝํ๋ค.
ModelView mv = new ModelView(viewName);
mv.setModel(model);
return mv;
์ด๋ํฐ๊ฐ ํธ์ถํ๋
ControllerV4๋ ๋ทฐ์ ์ด๋ฆ์ ๋ฐํํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ํฐ๋ ๋ทฐ์ ์ด๋ฆ์ด ์๋๋ผModelView๋ฅผ ๋ง๋ค์ด์ ๋ฐํํด์ผ ํ๋ค. ์ฌ๊ธฐ์ ์ด๋ํฐ๊ฐ ๊ผญ ํ์ํ ์ด์ ๊ฐ ๋์จ๋ค.
ControllerV4๋ ๋ทฐ์ ์ด๋ฆ์ ๋ฐํํ์ง๋ง, ์ด๋ํฐ๋ ์ด๊ฒ์ ModelView๋ก ๋ง๋ค์ด์ ํ์์ ๋ง์ถ์ด ๋ฐํํ๋ค. ๋ง์น 110v ์ ๊ธฐ ์ฝ์ผํธ๋ฅผ 220v ์ ๊ธฐ ์ฝ์ผํธ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ ๊ณผ ๊ฐ๋ค.