인프런의 김영한님의 mvc 기본 1편을 들으면서 정리한 내용
서블릿이나 JSP 만으로 비즈니스 로직과 뷰 렌더링 까지 모두 처리시 너무 많은 역할을 수행하게 되어 유지보수가어려워짐 -> 한 곳에 전부 몰려있어서 몇천 줄의 코드 중에서 지울 경우 이걸 새로 온 사람에게 넘겨 주기가 불가능해짐.
비즈니스 로직 부분에 변경이 발생 -> 해당 코드를 변경
UI 변경 발생 -> 마찬가지로 해당 파일 을 변경해야함
가장 중요한점
그래서 사용하게 된것이 MVC 패턴
String viewPath="/WEB-INF/views/new-form.jsp";
RequestDispatcher requestDispatcher = req.getRequestDispatcher(viewPath);
requestDispatcher.forward(req,resp);
.getRequestDispatcher() ->
dispatcher.forward(request,response)
: 다른 서블릿이나 JSP 로 이동할 수 있는 기능 -> 서버 내부에서 다시 호출 발생
/WEB-INF
<!-- 상대경로 사용, [현재 URL이 속한 계층 경로 + /save] -->
<form action="save" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
action이 절대 경로가 아닌 상대경로로 시작됨
-> 상대 경로를 사용시 폼 전송시 현재 url이 속한 계층 경로 + save가 호출됨.
현재 계층 경로 : /servlet-mvc/members
결과 -> /servlet-mvc/members/save
저장 진행시
HttpServletRequest를 Model로 사용
request 가 제공하는 setAttribute() 를 사용하면 request 객체에 데이터를 보관해서 뷰에 전달이 가능함.
뷰는 request.getAttribute()를 사용해서 데이터를 꺼내면 됨.
@WebServlet(name = "mvcMemberSaveServlet",urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
//model에 데이터 보관
request.setAttribute("member",member);
String viewPath = "/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request,response);
}
}
뷰에서 데이터를 꺼낼때 JSP를 사용시
${} 문법을 제공함 -> request의 attribute에 담긴 데이터를 편리하게 조회가능.
${member.id} -> model에 들어있는 member에 id를 가져옴. -> property 접근법