스프링 MVC 구조와 동작 순서

출처 - 김영한님의 스프링 MVC 1편

  1. 핸들러 조회
    • 핸들러 매핑을 통해 요청 URL에 매칭되는 핸들러(컨트롤러)를 조회
    • @RequestMapping 으로 등록한 핸들러를 조회
  2. 핸들러 어댑터 조회
    • 핸들러를 실행할 수 있는 핸들러 어댑터를 조회
    • @Controller 로 등록한 빈 객체가 어댑터에 해당
  3. 핸들러 어댑터 실행
  4. 핸들러 호출
  5. ModelAndView 반환
  6. viewResolver 호출
  7. View 반환
    • viewResolver 에서는 ModelAndView 객체에 담겨있는 View 정보를 통해 해당 View를 찾아 반환한다.
  8. View 생성
    • 반환된 View에 ModelAndView 객체 안에 있는 Model 데이터를 적용하여 렌더링한다.
  9. HTML 응답
    • 생성된 HTML 문서를 반환한다.

 

DispatcherServlet

  • 스프링 MVC 에서 프론트 컨트롤러의 역할을 담당하는 서블릿
  • 기존의 하나의 URL 요청을 담당하던 Servlet 과는 달리 모든 요청을 받아서 처리하며 각각 다른 URL 요청에 따른 처리는 컨트롤러에 위임하여 처리한다.

'Spring > Spring MVC' 카테고리의 다른 글

MVC 패턴  (0) 2022.08.21
Servlet & Servlet Container  (0) 2022.08.03

MVC 패턴

  • 애플리케이션을 Model-View-Controller 로 구분하여 설계하는 디자인 패턴
  • 역할에 맞게 모듈을 분리함으로서 유지보수 및 확장이 용이하다.

 

MVC 패턴 사용 이전과 이후의 비교

MVC 패턴 사용 이전

@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        int age = Integer.parseInt(req.getParameter("age"));

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

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();
        writer.write("<html>\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "</head>\n" +
                "<body>\n" +
                "성공\n" +
                "<ul>\n" +
                "    <li>id="+member.getId()+"</li>\n" +
                "    <li>username="+member.getUsername()+"</li>\n" +
                "    <li>age="+member.getAge()+"</li>\n" +
                "</ul>\n" +
                "<a href=\"/index.html\">메인</a>\n" +
                "</body>\n" +
                "</html>");
    }
}
  • 컨트롤러에서 조회한 데이터를 통해 View 를 만드를 로직까지 포함하고 있다. 하나의 모듈에서 여러 역할을 수행하게되면 그만큼 코드가 많아지고 코드를 변경해야할 때 변경 부분을 찾기가 힘들어지는 등 유지보수 및 관리가 힘들어진다.

 

MVC 패턴 사용 이후

/*
	비즈니스 로직을 실행하는 컨트롤러의 역할을 담당하는 서블릿
*/
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        int age = Integer.parseInt(req.getParameter("age"));

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

        // Model에 데이터를 보관
        req.setAttribute("member", member);

        String viewPath = "/WEB-INF/view/save-result.jsp";
        RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
        dispatcher.forward(req, resp);
    }
}


/*
	View 의 역할을 담당하는 JSP
*/
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
성공
<ul>
    <li>id=${member.id}</li>
    <li>username=${member.username}</li>
    <li>age=${member.age}</li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
  • MVC 패턴을 통해 컨트롤러와 View 의 로직을 분리하면 코드 변경시 변경 사항을 담당하는 모듈의 코드만 변경하면 된다. 즉, 변경 포인트가 명확해진다.

'Spring > Spring MVC' 카테고리의 다른 글

스프링 MVC 구조 & DispatcherServlet  (0) 2022.08.21
Servlet & Servlet Container  (0) 2022.08.03

Servlet

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) {
        // ... 처리 로직
    }
}
  • 자바를 사용하여 클라이언트의 요청에 따라 웹페이지를 동적으로 생성하는 서버 측 기술
  • HTTP 정보를 편리하게 사용할 수 있게 해준다.
    • HttpServletRequest - HTTP 요청 정보를 편리하게 사용할 수 있는 객체
    • HttpServletResponse - HTTP 응답 정보를 편리하게 제공할 수 있는 객체

 

Servlet Container

  • 서블릿을 지원하는 WAS
  • 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리
  • 서블릿 객체는 싱글톤으로 관리되며 애플리케이션이 로딩되는 시점에 미리 만들어두고 재활용한다. 때문에 동일한 리소스 요청에 대해서 동일한 서블릿 객체로 처리하므로 가급적 무상태성을 유지해야한다.
  • 동시 요청을 처리하기 위한 멀티 쓰레드 처리를 지원

'Spring > Spring MVC' 카테고리의 다른 글

스프링 MVC 구조 & DispatcherServlet  (0) 2022.08.21
MVC 패턴  (0) 2022.08.21

+ Recent posts