/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
1. V5 ๊ตฌ์กฐ
- ๋ง์ฝ ์ด๋ค ๊ฐ๋ฐ์๋ V3 ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐํ๊ณ ์ถ๊ณ , ์ด๋ค ๊ฐ๋ฐ์๋ V4 ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ๋ ๊น?
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐํ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ ํ๊ฐ์ง ๋ฐฉ์์ ์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค๋ง ์ฌ์ฉํ ์ ์๋ค.
private Map<String, ControllerV4> controllerMap = new HashMap<>();
(์ด๋ฐ์์ผ๋ก Map์ Controller๋ฅผ ์ ํด์ ๋ฃ์ด๋จ๊ธฐ ๋๋ฌธ)
ControllerV3๊ณผ V4๋ ์์ ํ ๋ค๋ฅธ ์ธํฐํ์ด์ค์ด๋ค. ๋ฐ๋ผ์ ํธํ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ง์น V3์ 110V์ด๊ณ , V4๋ 220V ์ ๊ธฐ ์ฝ์ผํธ ๊ฐ์ ๊ฒ์ด๋ค.
์ด๋ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก ์ด๋ํฐ์ด๋ค.
์ด๋ํฐ ํจํด์ ์ฌ์ฉํด์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ๋ค์ํ ๋ฐฉ์์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ณ๊ฒฝํด๋ณด์.
- ํธ๋ค๋ฌ ์ด๋ํฐ : ์ค๊ฐ์ ์ด๋ํฐ ์ญํ ์ ํ๋ ์ด๋ํฐ๊ฐ ์ถ๊ฐ๋์๋ค. ์ฌ๊ธฐ์ ์ด๋ํฐ ์ญํ ์ ํด์ฃผ๋ ๋๋ถ์ ๋ค์ํ ์ข ๋ฅ์ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ ์ ์๋ค.
- ํธ๋ค๋ฌ : ์ปจํธ๋กค๋ฌ์ ์ด๋ฆ์ ๋ ๋์ ๋ฒ์์ธ ํธ๋ค๋ฌ๋ก ๋ณ๊ฒฝํ๋ค. ์ด์ ์ด๋ํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ผญ ์ปจํธ๋กค๋ฌ์ ๊ฐ๋ ๋ฟ ์๋๋ผ ์ด๋ ํ ๊ฒ์ด๋ ํด๋นํ๋ ์ข ๋ฅ์ ์ด๋ํฐ๋ง ์์ผ๋ฉด ๋ค ์ฒ๋ฆฌํ ์ ์๋ค.
2. ๊ตฌํ
MyHandlerAdapter
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๋ฅผ ๋ฐํํด์ผ ํ๋ค.
- ์ค์ ์ปจํธ๋กค๋ฌ๊ฐ ModleView๋ฅผ ๋ฐํํ์ง ๋ชปํ๋ฉด, ์ด๋ํฐ๊ฐ ModelView๋ฅผ ์ง์ ์์ฑํด์๋ผ๋ ๋ฐํํด์ผ ํ๋ค.
- ์ด์ ์๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ์ค์ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ์ง๋ง, ์ด์ ๋ ์ด ์ด๋ํฐ๋ฅผ ํตํด ์ค์ ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๋ค.
ControllerV3HandlerAdapter, ControllerV4HandlerAdapter
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) throws ServletException, IOException {
ControllerV3 controller = (ControllerV3) handler;
Map<String, String> paramMap = createParamMap(request);
ModelView mv = controller.process(paramMap);
return mv;
}
private static 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 class ControllerV4HandlerAdapter implements MyHandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof ControllerV4);
}
@Override
public ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
ControllerV4 controller = (ControllerV4) handler;
Map<String, String> paramMap = createParamMap(request);
HashMap<String, Object> model = new HashMap<>();
String viewName = controller.process(paramMap, model);
ModelView mv = new ModelView(viewName);
mv.setModel(model);
return mv;
}
private static 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;
}
}
- supports( )๋ฅผ ํตํด ControllerV3, ConrollerV4๋ง ์ง์ํ๊ธฐ๋๋ฌธ์
ControllerV3 controller = (ControllerV3) handler;
ControllerV4 controller = (ControllerV4) handler;
์ด๋ถ๋ถ์ ํ์ ๋ณํ์ ๊ฑฑ์ ์์ด ์คํํด๋ ๋๋ค.
- ControllerV3์ ModelView๋ฅผ ๋ฐํํ๋ฏ๋ก ๊ทธ๋๋ก ๋ฐํํ๋ฉด ๋๊ณ , V4๋ ์๋ ๋ทฐ์ ์ด๋ฆ์ ๋ฐํํ๋ ์ด๋ํฐ๋ ์ด๊ฒ์ ModelView๋ก ๋ง๋ค์ด์ ํ์์ ๋ง์ถ์ด ๋ฐํํ๋ค. ๋ง์น 110v ์ ๊ธฐ ์ฝ์ผํธ๋ฅผ 220v ์ ๊ธฐ ์ฝ์ผํธ๋ก ๋ณํํ๋ฏ์ด
FrontControllerServletV5
@WebServlet(name="frontControllerServletV5", urlPatterns = "/front-controller/v5/*")
public class FrontControllerServletV5 extends HttpServlet {
private final Map<String, Object> handlerMappingMap = new HashMap<>();
private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>();
public FrontControllerServletV5() {
initHandlerMappingMap(); //ํธ๋ค๋ฌ ๋งคํ ์ด๊ธฐํ
initHandlerAdapters(); //์ด๋ํฐ ๋งคํ ์ด๊ธฐํ
}
private void initHandlerMappingMap() {
handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3());
handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3());
handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3());
handlerMappingMap.put("/front-controller/v5/v4/members/new-form", new MemberFormControllerV4());
handlerMappingMap.put("/front-controller/v5/v4/members/save", new MemberSaveControllerV4());
handlerMappingMap.put("/front-controller/v5/v4/members", new MemberListControllerV4());
}
private void initHandlerAdapters() {
handlerAdapters.add(new ControllerV3HandlerAdapter());
handlerAdapters.add(new ControllerV4HandlerAdapter());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object handler = getHandler(request);
if(handler == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
MyHandlerAdapter adapter = getHandlerAdapter(handler);
ModelView mv = adapter.handle(request, response, handler);
String viewName = mv.getViewName();
MyView view = viewResolver(viewName);
view.render(mv.getModel(), request, response);
}
private MyHandlerAdapter getHandlerAdapter(Object handler) {
for (MyHandlerAdapter adapter : handlerAdapters) {
if(adapter.supports(handler)){
return adapter;
}
}
throw new IllegalArgumentException("handler adapter not found. handler = " + handler);
}
private Object getHandler(HttpServletRequest request) {
String requestURI = request.getRequestURI();
return handlerMappingMap.get(requestURI);
}
private static MyView viewResolver(String viewName) {
return new MyView("/WEB-INF/views/" + viewName + ".jsp");
}
}
- FrontControllerServletV5() ์์ฑ์๋ ํธ๋ค๋ฌ ๋งคํ๊ณผ ์ด๋ํฐ๋ฅผ ์ด๊ธฐํ(๋ฑ๋ก)ํ๋ค.
- ๋งคํ ์ ๋ณด
// ์ด์ ๋ฒ์
private Map<String, ControllerV4> controllerMap = new HashMap<>();
// V5๋ฒ์
private final Map<String, Object> handlerMappingMap = new HashMap<>();
๋งคํ์ ๋ณด์ ๊ฐ์ด ControllerV3, ControllerV4๊ฐ์ ์ธํฐํ์ด์ค์์ ์๋ฌด๊ฐ์ด๋ ๋ฐ์ ์ ์๋ Object๋ก ๋ณ๊ฒฝ๋์๋ค.
- getHandler( )๋ฅผ ํตํด ํธ๋ค๋ฌ ๋งคํ ์ ๋ณด์ธ handlerMappingMap์์ URL์ ๋งคํ๋ ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ) ๊ฐ์ฒด๋ฅผ ์ฐพ์ ๋ฐํํ๋ค.
- getHandlerAdapter( )๋ฅผ ํตํด handler๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ด๋ํฐ๋ฅผ ์ฐพ๊ณ , handler๊ฐ V3, V4 ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๋ฉด ControllerV3HandlerAdapter , V4๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
- ์ด๋ํฐ์ handle(request, response, handler) ๋ฉ์๋๋ฅผ ํตํด ์ค์ ์ด๋ํฐ๊ฐ ํธ์ถ๋๋ค.
3. ์ ๋ฆฌ
์ง๊ธ๊น์ง V1 ~ V5๋ก ํ๋ ์์ํฌ๋ฅผ ๋ฐ์ ์์ผ์๋ค.
- V1 : ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ๋์
(๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ์ต๋ํ ์ ์งํ๋ฉด์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ฅผ ๋์ )
- V2 : View ๋ถ๋ฅ
(๋จ์ ๋ฐ๋ณต๋๋ ๋ทฐ ๋ก์ง ๋ถ๋ฆฌ)
- V3 : Model ์ถ๊ฐ
(์๋ธ๋ฆฟ ์ข ์์ฑ ์ ๊ฑฐ, ๋ทฐ ์ด๋ฆ ์ค๋ณต ์ ๊ฑฐ)
-V4 : ๋จ์ํ๊ณ ์ค์ฉ์ ์ธ ์ปจํธ๋กค๋ฌ
(V3๊ณผ ๊ฑฐ์ ๋น์ทํ์ง๋ง ๊ตฌํ ์ ์ฅ์์ ModelView๋ฅผ ์ง์ ์์ฑํด์ ๋ฐํํ์ง ์๋๋ก ํธ๋ฆฌํ ์ธํฐํ์ด์ค ์ ๊ณต)
- V5 : ์ ์ฐํ ์ปจํธ๋กค๋ฌ
(์ด๋ํฐ๋ฅผ ๋์ ํ์ฌ ํ๋ ์์ํฌ๋ฅผ ์ ์ฐํ๊ณ ํ์ฅ์ฑ ์๊ฒ ์ค๊ณ)
์ฌ๊ธฐ์ ๋ ๋ฐ์ ์ํค๋ฉด ์ข๊ฒ ์ง๋ง ์คํ๋ง MVC์ ํต์ฌ ๊ตฌ์กฐ๋ฅผ ํ์ ํ๋๋ฐ ํ์ํ ๋ถ๋ถ์ ๋ชจ๋ ๋ง๋ค์ด ๋ณด์๋ค.
์ฌ๊ธฐ๊น์ง ์์ฑํ ์ฝ๋๋ ์คํ๋ง MVC ํ๋ ์์ํฌ์ ํต์ฌ ์ฝ๋์ ์ถ์ฝ๋ฒ์ ์ด๊ณ ๊ตฌ์กฐ๋ ๊ฑฐ์ ๊ฐ๋ค.
๋ค์ ์๊ฐ์๋ ์คํ๋ง MVC์ ๋ํด ๊ณต๋ถํด ๋ณด์!