# MVC 패턴 - 적용

1. 회원 등록
2. 회원 저장된 것 렌더링
3. 회원 리스트 조회

MVC 패턴의 핵심은 클라이언트 요청이 들어오면 컨트롤러를 거쳐 뷰로 들어가는 것이다!

* 회원등록\
  1\. 뷰 경로 설정\
  2\. **request.getRequestDispatcher(viewPath)**&#xB97C; 이용해서 뷰로 이동(제어권 넘김)할 수 있다!!\
  3\. 서블릿에서 뷰로 진짜 이동 : **dispatcher.forward(req,resp)**

dispatcher.forward() : 다른 서블릿이나 JSP로 이동할 수 있는 기능이다. 서버 내부에서 다시 호출이 발생한다.\
리다이렉트는 실제 클라이언트(웹 브라우저)에 응답이 나갔다가, 클라이언트가 redirect 경로로 다시 요청한다. 따라서 클라이언트가 인지할 수 있고, URL 경로도 실제로 변경된다. 반면에 포워드는 서버 내부에서 일어나는 호출이기 때문에 클라이언트가 전혀 인지하지 못한다.\
/WEB-INF : 이 경로안에 JSP가 있으면 외부에서 직접 JSP를 호출할 수 없다. 우리가 기대하는 것은 항상 컨트롤러를 통해서 JSP를 호출하는 것이다.\
\=>항상 서블릿 컨트롤러를 거쳐서 호출,실행되도록 하기 위함이다!

```java
package hello.servlet.web.servletmvc;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name="mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {//컨트롤러가 된다!

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String viewPath = "/WEB-INF/views/new-form.jsp";
        RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);//컨트롤러에서 뷰로 이동할 때 사용!
        dispatcher.forward(req,resp);//진짜 서블릿에서 뷰로 간다!
    }
}
```

* 회원 정보 저장된 페이지\
  1\. 저장 로직 구현\
  **2. 모델에 데이터 저장(보관) : request가 제공하는 setAttribute() 를 사용하면 request 객체에 데이터를 보관해서 뷰에 전달할 수 있다.**\
  **뷰는 request.getAttribute() 를 사용해서 데이터를 꺼내면 된다!**\
  3\. 뷰로 이동(위와 동일)

```java
package hello.servlet.web.servletmvc;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@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/views/save-result.jsp";
        RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
        dispatcher.forward(req,resp);//진짜 서블릿에서 뷰로 간다!
    }
}

```

* &#x20;회원 리스트 조회\
  1\. 데이터 가져온다.\
  2\. 모델에 담는다.\
  3\. 뷰로 이동

```java
package hello.servlet.web.servletmvc;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet(name="mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.데이터  가져온다.
        List<Member> members = memberRepository.findAll();
        //2.모델에 담는다.
        req.setAttribute("members",members);//(key,value)
        //3.뷰로 간다. - 뷰패쓰 설정하고 RequestDispatcher.forward 로  뷰로 이동!
        String  viewPath = "/WEB-INF/views/members.jsp";
        RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
        dispatcher.forward(req,resp);
    }
}

```

JSP에서 아래와 같이 jspl 문법을 사용하면 ${..}를 이용해서 key, value 값을 가져올 수 있다!

```java
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:forEach var="item" items="${members}">
 <tr>
  <td>${item.id}</td>
  <td>${item.username}</td>
  <td>${item.age}</td>
</tr>
</c:forEach>
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://heunnajo.gitbook.io/mvc/3.-jsp-mvc/mvc-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
