๐Ÿ“—Spring MVC Study [ jsp, servlet์œผ๋กœ MVC ํ”„๋ ˆ์ž„์›Œํฌ ๋งŒ๋“ค๊ธฐ ]

Caruhยท2025๋…„ 3์›” 18์ผ

Spring MVC

๋ชฉ๋ก ๋ณด๊ธฐ
8/17
post-thumbnail

ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ

Front Controller ๋„์ž… ์ „์— ํด๋ผ์ด์–ธํŠธ์—์„œ ํ˜ธ์ถœ์„ ํ• ๋•Œ Controller A, B, C ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅธ Controller์„ ํ˜ธ์ถœํ•ด๋„ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์ด ๋งŽ์•„ ๊ณตํ†ต์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์•„ ๋ถˆํŽธํ•œ ์ ์ด ๋งŽ์•˜๋‹ค. ํ•˜์ง€๋งŒ ๋„์ž… ํ›„ ์–ด๋–ค ๊ฒƒ์ด ์œ ๋ฆฌํ•ด์กŒ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

Front Controller ํŠน์ง•

  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ์„œ๋ธ”๋ฆฟ ํ•˜๋‚˜๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค.
  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์š”์ฒญ์— ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„์„œ ํ˜ธ์ถœ
  • ์ž…๊ตฌ๊ฐ€ ํ•˜๋‚˜, ๊ณตํ†ต ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” Servlet์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์Šคํ”„๋ง ์›น MVC์™€ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ

  • ์Šคํ”„๋ง ์›น MVC์˜ ํ•ต์‹ฌ๋„ ๋ฐ”๋กœ FrontController์ด๋‹ค.
  • ์Šคํ”„๋ง ์›น MVC์˜ DispatcherServlet์ด FrontController ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

์ง€๊ธˆ๋ถ€ํ„ฐ Spring MVC๋ฅผ ํ•™์Šตํ•˜๊ธฐ ์ „ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ „ํ•ด ์™”๋Š”์ง€ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ค‘ ํ•ต์‹ฌ์ ์ธ ๋‚ด์šฉ๋งŒ ์ž‘์„ฑ


v1 ๋ฒ„์ „

@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);์„ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‹คํ–‰

v2 ๋ฒ„์ „

  • ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ๋กœ ์ด๋™ํ•˜๋Š” ๋ถ€๋ถ„์— ์ค‘๋ณต์ด ์žˆ์Œ, ๊น”๋”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋™
 String viewPath = "/WEB-INF/views/new-form.jsp";
 RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
 dispatcher.forward(request, response);

v2 ๋ฒ„์ „์˜ ์ปจํŠธ๋กค๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค

public interface ControllerV2 {
 	MyView process(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException;
}

๊ธฐ์กด์—๋Š” ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ณต์žกํ•œ dispatcher.forward()๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ–ˆ์—ˆ์ง€๋งŒ ์ด์ œ๋Š” ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋‹จ์ˆœํžˆ MyView ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๋ทฐ ์ด๋ฆ„๋งŒ ๋„ฃ๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋˜๊ฒŒ ์ฝ”๋“œ๊ฐ€ ์„ค๊ณ„ ๋จ

๊ฒฐ๋ก  : ๋‹จ์ˆœ ๋ฐ˜๋ณต ๋˜๋Š” ๋ทฐ ๋กœ์ง ๋ถ„๋ฆฌ


v3 ๋ฒ„์ „

์„œ๋ธ”๋ฆฟ ์ข…์†์„ฑ ์ œ๊ฑฐ

  • ์ปจํŠธ๋กค๋Ÿฌ ์ž…์žฅ์—์„œ๋Š” HttpServletRequest HttpServletResponse๊ฐ€ ๊ผญ ํ•„์š”ํ• ๊นŒ?
  • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋Š” ์ž๋ฐ”์˜ 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 ์ด๋ฆ„๊นŒ์ง€ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ

๋ทฐ ๋ฆฌ์กธ๋ฒ„

  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋…ผ๋ฆฌ ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ทฐ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝ
  • ์‹ค์ œ ๋ฌผ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” MyView ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ๋…ผ๋ฆฌ ๋ทฐ ์ด๋ฆ„ : members
  • ๋ฌผ๋ฆฌ ๋ทฐ ๊ฒฝ๋กœ : /WEB-INF/views/members.jsp

view.render(mv.getModel(), request, response)

  • ๋ทฐ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด HTML ํ™”๋ฉด์„ ๋ Œ๋”๋ง
  • ๋ทฐ ๊ฐ์ฒด์˜ render()๋Š” ๋ชจ๋ธ ์ •๋ณด๋„ ํ•จ๊ป˜ ๋ฐ›๋Š”๋‹ค.
  • JSP๋Š” request.getAttribute()๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์„œ request.setAttribute()๋กœ ๋‹ด์•„๋‘”๋‹ค.
  • JSP๋กœ ํฌ์›Œ๋“œ ํ•ด์„œ JSP๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.

v4 ๋ฒ„์ „

  • ๋‹จ์ˆœํ•˜๊ณ  ์‹ค์šฉ์ ์ธ ์ปจํŠธ๋กค๋Ÿฌ

์•ž์„œ ๋งŒ๋“  v3 ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ์˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ทฐ ๊ฒฝ๋กœ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ, ์ž˜ ์„ค๊ณ„๋œ ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ ์ปจํŠธ๋กค๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” ํ•ญ์ƒ ModelView ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์กฐ๊ธˆ์€ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ์ข‹์€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์•„ํ‚คํ…์ฒ˜๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ๊ทธ์™€ ๋”๋ถˆ์–ด ์‹ค์ œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹จ์ˆœํ•˜๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. -> ์‹ค์šฉ์„ฑ๊ณผ ์—ฐ๊ด€

  • ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋Š” v3๊ณผ ๊ฐ™์ง€๋งŒ, ๋Œ€์‹  ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ModelView๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ , ViewName๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

v4 ์ •๋ฆฌ

  • ์ด๋ฒˆ ๋ฒ„์ „์˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ณ  ์‹ค์šฉ์ 
  • ๊ธฐ์กด ๊ตฌ์กฐ์—์„œ ๋ชจ๋ธ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๊ณ , ๋ทฐ์˜ ๋…ผ๋ฆฌ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ž‘์€ ์•„์ด๋””์–ด๋ฅผ ์ ์šฉํ–ˆ์„ ๋ฟ์ธ๋ฐ, ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๋ณด๋ฉด ์ด์ œ ๊ตฐ๋”๋”๊ธฐ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ.
  • ์ค‘์š”ํ•œ ์‚ฌ์‹ค์€ ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฐœ์ „ํ•ด ์˜จ ๊ฒƒ์ด ํ•œ๋ฒˆ์— ์˜จ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ ์ง„์ ์œผ๋กœ ๋ฐœ์ „ํ–ˆ๋‹ค๋Š” ๊ฒƒ.
  • ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๊ณตํ†ต ๊ธฐ๋Šฅ์ด ์ˆ˜๊ณ ๋กœ์›Œ์•ผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํŽธ๋ฆฌํ•ด์ง„๋‹ค.

v5 ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด

ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ

์ค‘๊ฐ„์— ์–ด๋Œ‘ํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ ์ด๋ฆ„์ด ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์–ด๋Œ‘ํ„ฐ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๋•๋ถ„์— ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ

์ปจํŠธ๋กค๋Ÿฌ์˜ ์ด๋ฆ„์„ ๋” ๋„“์€ ๋ฒ”์œ„์ธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ด์ œ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฐœ๋… ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋– ํ•œ ๊ฒƒ์ด๋“  ํ•ด๋‹นํ•˜๋Š” ์ข…๋ฅ˜์˜ ์–ด๋Œ‘ํ„ฐ๋งŒ ์žˆ์œผ๋ฉด ๋‹ค ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์–ด๋Œ‘ํ„ฐ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ?

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๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ๋ผ๋„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.
  • ์ด์ „์—๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‹ค์ œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ–ˆ์ง€๋งŒ ์ด์ œ๋Š” ์ด ์–ด๋Œ‘ํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

Controller V3๋ฅผ ์ง€์›ํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ

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);
 }
  • Controller V3๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋Œ‘ํ„ฐ
  • Object ํƒ€์ž…์ธ ์ด์œ ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์ด ๋“ค์–ด์™€๋„ ๊ทธ ํƒ€์ž…์— ๋งž๊ฒŒ ์ž‘๋™ํ•  ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š”๊ฒŒ ์–ด๋Œ‘ํ„ฐ ํ•ธ๋“ค๋Ÿฌ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
 ControllerV3 controller = (ControllerV3) handler;
 Map<String, String> paramMap = createParamMap(request);
 ModelView mv = controller.process(paramMap);
 return mv;
  • handler๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ V3๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ์— V3 ํ˜•์‹์— ๋งž๋„๋ก ํ˜ธ์ถœํ•œ๋‹ค.
  • supports()๋ฅผ ํ†ตํ•ด ControllerV3๋งŒ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ๋ณ€ํ™˜์€ ๊ฑฑ์ •์—†์ด ์‹คํ–‰ํ•ด๋„ ๋œ๋‹ค.
  • Controller V3๋Š” ModelView๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ModelView๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ -> ํ•ธ๋“ค๋Ÿฌ

Controller -> Handler

  • ์ด์ „์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ง์ ‘ ๋งคํ•‘ํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ์ด์ œ๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ปจํŠธ๋กค๋Ÿฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ง€์›ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด, ์–ด๋–ค ๊ฒƒ์ด๋ผ๋„ URL์— ๋งคํ•‘ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ด๋ฆ„์„ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋” ๋„“์€ ๋ฒ”์œ„์˜ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

V4๋ฅผ ์œ„ํ•œ ์–ด๋Œ‘ํ„ฐ๊นŒ์ง€ ์ถ”๊ฐ€ํ•œ ํ›„ ์ œ์ผ ์ค‘์š”ํ•œ ๋ถ€๋ถ„

์–ด๋Œ‘ํ„ฐ ๋ณ€ํ™˜

ModelView mv = new ModelView(viewName);
mv.setModel(model);

return mv;
  • ์–ด๋Œ‘ํ„ฐ์—์„œ ์ด ๋ถ€๋ถ„์ด ๋‹จ์ˆœํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค.

์–ด๋Œ‘ํ„ฐ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ControllerV4๋Š” ๋ทฐ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋Œ‘ํ„ฐ๋Š” ๋ทฐ์˜ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ModelView๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ๊ผญ ํ•„์š”ํ•œ ์ด์œ ๊ฐ€ ๋‚˜์˜จ๋‹ค.
ControllerV4๋Š” ๋ทฐ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ–ˆ์ง€๋งŒ, ์–ด๋Œ‘ํ„ฐ๋Š” ์ด๊ฒƒ์„ ModelView๋กœ ๋งŒ๋“ค์–ด์„œ ํ˜•์‹์„ ๋งž์ถ”์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งˆ์น˜ 110v ์ „๊ธฐ ์ฝ˜์„ผํŠธ๋ฅผ 220v ์ „๊ธฐ ์ฝ˜์„ผํŠธ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ ๊ณผ ๊ฐ™๋‹ค.

๐Ÿ“ญ Reference

profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€