๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Spring

[์ธํ”„๋Ÿฐ - ์Šคํ”„๋ง MVC 1ํŽธ] model ์ถ”๊ฐ€ - v3

by YeonBu 2024. 7. 30.
728x90

 

 

/* ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

   ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */

 

 

 

์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  ๊ฐ•์˜ | ๊น€์˜ํ•œ - ์ธํ”„๋Ÿฐ

๊น€์˜ํ•œ | ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์›น ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต

www.inflearn.com

 

 

 

1. V3์˜ ๊ตฌ์กฐ

 

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

: ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋Š” ์ž๋ฐ”์˜ 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

 

 

 

 

2. ๊ตฌํ˜„

 

- ์ง€๊ธˆ๊นŒ์ง€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์„œ๋ธ”๋ฆฟ์— ์ข…์†์ ์ธ HttpServletRequest๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Model๋„ request.setAttribute() ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ทฐ์— ์ „๋‹ฌํ–ˆ๋‹ค.

- ์„œ๋ธ”๋ฆฟ์˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด Model์„ ์ง์ ‘ ๋งŒ๋“ค๊ณ  ์ถ”๊ฐ€๋กœ View ์ด๋ฆ„๊นŒ์ง€ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

 

 

ModelView

public class ModelView {

    private String viewName;
    private Map<String, Object> model = new HashMap<>();

    public ModelView(String viewName) {
        this.viewName = viewName;
    }

    public String getViewName() {
        return viewName;
    }

    public void setViewName(String viewName) {
        this.viewName = viewName;
    }

    public Map<String, Object> getModel() {
        return model;
    }

    public void setModel(Map<String, Object> model) {
        this.model = model;
    }
}

 

- ๋ทฐ์˜ ์ด๋ฆ„๊ณผ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ํ•„์š”ํ•œ model ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

- model์€ ๋‹จ์ˆœํžˆ map์œผ๋กœ ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ key, value ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

ControllerV3

public interface ControllerV3 {

    ModelView process(Map<String, String> paramMap);
    
}

 

- V3์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ ๊ธฐ์ˆ ์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค(๋”ฐ๋ผ์„œ ๊ตฌํ˜„์ด ๋งค์šฐ ๋‹จ์ˆœํ•ด์ง€๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์‰ฌ์›Œ์ง„๋‹ค)

- HttpServletRequest๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ”„๋ก ํŠธ์—์„œ pramMap์— ๋‹ด์•„ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

- ์‘๋‹ต ๊ฒฐ๊ณผ๋กœ ๋ทฐ ์ด๋ฆ„๊ณผ ๋ทฐ์— ์ „๋‹ฌํ•  Model ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ModelView ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

 

 

MemberFormControllerV3 - ํšŒ์› ๋“ฑ๋ก ํผ

public class MemberFormControllerV3 implements ControllerV3 {

    @Override
    public ModelView process(Map<String, String> paramMap) {
        return new ModelView("new-form");
    }

}

 

- ModelView๋ฅผ ์ƒ์„ฑํ•  ๋•Œ 'new-form'์ด๋ผ๋Š” view์˜ ๋…ผ๋ฆฌ์  ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.

- ์‹ค์ œ ๋ฌผ๋ฆฌ์  ์ด๋ฆ„์€ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

 

MemberSaveControllerV3 - ํšŒ์› ์ €์žฅ

public class MemberSaveControllerV3 implements ControllerV3 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    public ModelView process(Map<String, String> paramMap) {
        String username = paramMap.get("username");
        int age = Integer.parseInt(paramMap.get("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        ModelView mv = new ModelView("save-result");
        mv.getModel().put("member", member);
        return mv;
    }

}

 

- ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋Š” map์— ๋‹ด๊ฒจ์žˆ์œผ๋ฏ€๋กœ map์—์„œ ํ•„์š”ํ•œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ๋œ๋‹ค.

- ๋ชจ๋ธ์€ ๋‹จ์ˆœํ•œ map์ด๋ฏ€๋กœ ๋ชจ๋ธ์— ๋ทฐ์—์„œ ํ•„์š”ํ•œ member ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

MemberListControllerV3 - ํšŒ์› ๋ชฉ๋ก

public class MemberListControllerV3 implements ControllerV3 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    public ModelView process(Map<String, String> paramMap) {
        List<Member> members = memberRepository.findAll();
        ModelView mv = new ModelView("members");
        mv.getModel().put("members", members);

        return mv;
    }

}

 

 

 

FrontControllerServletV3

@WebServlet(name = "frontControllerServletV3", urlPatterns = "/front-controller/v3/*")
public class FrontControllerServletV3 extends HttpServlet {

    private Map<String, ControllerV3> controllerMap = new HashMap<>();

    public FrontControllerServletV3() {
        controllerMap.put("/front-controller/v3/members/new-form", new MemberFormControllerV3());
        controllerMap.put("/front-controller/v3/members/save", new MemberSaveControllerV3());
        controllerMap.put("/front-controller/v3/members", new MemberListControllerV3());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String requestURI = request.getRequestURI();

        ControllerV3 controller = controllerMap.get(requestURI);

        if(controller == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        //paramMap
        Map<String, String> paramMap = createParamMap(request);
        ModelView mv = controller.process(paramMap);
        String viewName = mv.getViewName();

        MyView view = viewResolver(viewName);
        view.render(mv.getModel(), request, response);

    }

    private static MyView viewResolver(String viewName) {
        
        return new MyView("/WEB-INF/views/" + viewName + ".jsp");
        
    }

    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;
        
    }
}

 

 MyView(์ถ”๊ฐ€)

public void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    modelToRequestAttribute(model, request);
    RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
    dispatcher.forward(request,response);
}

private static void modelToRequestAttribute(Map<String, Object> model, HttpServletRequest request) {
    model.forEach((key, value) -> request.setAttribute(key, value));
}

 

- createParamMap ๋ฉ”์„œ๋“œ๋Š” HttpServletRequest์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ๊บผ๋‚ด์„œ Map์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. 

 ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น Map(paramMap)์„ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœํ•œ๋‹ค.

- viewResolver ๋ฉ”์„œ๋“œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋…ผ๋ฆฌ ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ทฐ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

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

 : ๋ทฐ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด HTML ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•œ๋‹ค

 : ๋ทฐ ๊ฐ์ฒด์˜ render()๋Š” ๋ชจ๋ธ ์ •๋ณด๋„ ํ•จ๊ป˜ ๋ฐ›๋Š”๋‹ค

 : JSP ๋Š” request.getAttribute()๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด ๋‹ด์•„๋‘”๋‹ค.

 : JSP๋กœ ํฌ์›Œ๋“œํ•ด์„œ JSP๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

 

 

๋‹ค์Œ V4๋ฒ„์ „์—์„œ๋Š” V3๋ฅผ ์กฐ๊ธˆ ๋ณ€๊ฒฝํ•ด์„œ ๊ฐœ๋ฐœ์ž๋“ค์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•ด๋ณด์ž.

๋ฐ˜์‘ํ˜•