[MVC 기본 1] - MVC 패턴

JIWOO YUN·2023년 11월 21일
0

MVC기본 1

목록 보기
1/5
post-custom-banner

인프런의 김영한님의 mvc 기본 1편을 들으면서 정리한 내용


MVC 패턴 (MVC 기본 1 강의를 기반으로 진행됨.)

서블릿이나 JSP 만으로 비즈니스 로직과 뷰 렌더링 까지 모두 처리시 너무 많은 역할을 수행하게 되어 유지보수가어려워짐 -> 한 곳에 전부 몰려있어서 몇천 줄의 코드 중에서 지울 경우 이걸 새로 온 사람에게 넘겨 주기가 불가능해짐.

비즈니스 로직 부분에 변경이 발생 -> 해당 코드를 변경

UI 변경 발생 -> 마찬가지로 해당 파일 을 변경해야함

가장 중요한점

  • 둘 사이에 변경 라이프 사이클이 다르다.
    • UI를 일부 수정하는 일과 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 확률이 높다. -> 하지만 대부분 서로에게는 영향이 없음.
    • 서로 라이프 사이클이 다른 코드를 하나의 코드로 관리하면 유지보수에 좋지 않음

그래서 사용하게 된것이 MVC 패턴

  • 컨트롤러와 뷰 영역으로 서로 역할을 나누어 가진 것 -> 웹 어플리케이션은 보통 이 패턴을 사용함.

컨트롤러

  • HTTP 요청을 받아서 파리미터를 검증 -> 비즈니스 로직을 실행 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담음

모델

  • 뷰에 출력할 데이터를 담아둠. 뷰가 필요한 데이터를 모두 모델에 담아서 전달하기 때문에 뷰는 비즈니스 로직이나 데이터 접근 부분을 몰라도됨 -> 화면 렌더링에 집중할 수있게 됨.

  • 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중 -> HTML을 생성하는 부분

String viewPath="/WEB-INF/views/new-form.jsp";
RequestDispatcher requestDispatcher = req.getRequestDispatcher(viewPath);
requestDispatcher.forward(req,resp);

.getRequestDispatcher() ->

  • 메서드 안에 들어가는 문자열에는 뷰페이지경로.jsp가 들어감.

dispatcher.forward(request,response)

  • 페이지를 이동시키는 메서드 -> 해당 주소에대해 요청하고 응답하라 의미

: 다른 서블릿이나 JSP 로 이동할 수 있는 기능 -> 서버 내부에서 다시 호출 발생

/WEB-INF

  • 이 경로안에 jsp가 있으면 외부에서는 호출이 불가능 -> 우리가 기대하는 것은 항상 컨트롤러를 통해서 JSP 를 호출 하는 것.(WAS 서버 룰로 정해져 있음.)

redirect vs forward

  • 리다이렉트는 실제 클라이언트에 응답이 나갔다가 클라이언트가 redirect 경로로 다시 요청
    • 클라이언트가 인지할 수있고, URL 결로도 실제로 변경
  • 포워드는 서버 내부에서 일어나는 호출 -> 클라이언트가 전혀 인지하지 못함.
<!-- 상대경로 사용, [현재 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 접근법

profile
열심히하자
post-custom-banner

0개의 댓글