코드 그라데이션

MVC 패턴 - 적용 본문

Spring/MVC 1

MVC 패턴 - 적용

완벽한 장면 2023. 9. 23. 13:39

MVC 패턴 - 적용

 

회원 등록
회원 등록 폼 - 컨트롤러

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

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) 
    	throws ServletException, IOException {
        // 그냥 jsp로 가주기만 하면 된다.
        
        String viewPath = "/WEB-INF/views/new-form.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); // 컨트롤러에서 뷰로 이동
        dispatcher.forward(request, response); // 서블릿에서 jsp를 호출하는 코드. 서버끼리 내부에서 호출
    }
}

 

부연설명

viewPath 변수:

- viewPath 변수는 보여줄 JSP 페이지의 경로를 저장.

 이 코드에서는 "/WEB-INF/views/new-form.jsp"라는 JSP 페이지를 사용한다.

 일반적으로 JSP 파일은 WEB-INF 폴더 안에 있으며, 직접 클라이언트에게 노출되지 않는다.

 

.RequestDispatcher 객체:

- RequestDispatcher는 서블릿에서 다른 자원 (이 경우 JSP 페이지) 로 제어를 전달하는데 사용.

   request.getRequestDispatcher(viewPath)는 viewPath에 지정된 JSP 페이지로 제어를 전달하기 위한 RequestDispatcher

   객체를 얻는다.

 

dispatcher.forward(request, response):

- 이 부분은 서블릿에서 JSP 페이지로 제어를 전달하는 역할을 한다.

  forward 메서드를 호출하여 현재 서블릿에서 JSP 페이지로 요청을 전달하고, 이후 JSP 페이지에서 응답을 생성한다.

 


요약하면, 이 서블릿은 "/servlet-mvc/members/new-form" 경로로 들어오는 요청을 처리하고, 

"new-form.jsp"라는 JSP 페이지를 클라이언트에게 보여준다. 

이것은 MVC 아키텍처에서 컨트롤러 역할을 하며, 

사용자 인터페이스 (회원 가입 양식)와 비즈니스 로직을 분리하여 웹 애플리케이션을 구조화하고 

유지보수하기 쉽게 만든다.

 

 


회원 등록 폼 - 뷰
main/webapp/WEB-INF/views/new-form.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- 상대경로 사용, [현재 URL이 속한 계층 경로 + /save]
상대경로 쓴 이유는 경로가 달라도 다른 곳에서 계속 사용하기 위함-->
<form action="save" method="post">
    username: <input type="text" name="username" />
    age:      <input type="text" name="age" />
    <button type="submit">전송</button>
</form>

</body>
</html>

 

 

실행

화면 정상적으로 출력

 


회원 저장

회원 저장 - 컨트롤러
MvcMemberSaveServlet

@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); // request 내부 저장소에 이 데이터가 저장됨.

		// 뷰로 던지고
        String viewPath = "/WEB-INF/views/save-result.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response); // 내부호출.
    }
}

 

부연설명

# 회원 정보 수신 및 저장:
request.getParameter("username")와 request.getParameter("age")를 사용하여 클라이언트로부터 전송된 회원 이름과 나이 정보를 가져온다.
이 정보를 사용하여 Member 객체를 생성하고, memberRepository를 사용하여 회원 정보를 저장함.


# Model에 데이터 보관:
- request.setAttribute("member", member)를 사용하여 "member"라는 이름으로 member 객체를 Model에 저장.

  이렇게 저장된 데이터는 JSP 페이지에서 사용할 수 있다.

 

# JSP 페이지로 제어 전달:
- 마지막으로, viewPath 변수에 저장된 JSP 페이지인 "/WEB-INF/views/save-result.jsp"로 제어를 전달한다.

  이를 통해 클라이언트에게 응답 결과를 보여줄 JSP 페이지로 이동함.

 

요약하면, 이 서블릿은 회원 정보를 입력받아 저장하고, 

저장된 회원 정보를 Model에 저장한 후

"/WEB-INF/views/save-result.jsp" JSP 페이지로 이동하여

결과를 클라이언트에게 보여주는 역할을 수행합니다.

 

이것은 MVC 아키텍처에서 컨트롤러 역할을 하며,

사용자의 입력을 처리하고 모델과 뷰 간의 상호 작용을 조정한다.

 

회원 저장 - 뷰
main/webapp/WEB-INF/views/save-result.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>

 

 

실행해서 확인하면

데이터 입력 후 클릭하면

 

저장 데이터 확인 가능.

 

 


회원 목록 조회

회원 목록 조회 - 컨트롤러
MvcMemberListServlet

@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

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

        List<Member> members = memberRepository.findAll();

        request.setAttribute("members", members);

        String viewPath = "/WEB-INF/views/members.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }
}

 

부연설명

 # 회원 목록 조회:
memberRepository.findAll()을 사용하여 모든 회원의 목록을 가져온다.

이것은 회원 목록을 데이터베이스나 다른 저장소에서 검색하는 것으로 가정.

 

Model에 데이터 보관:
- request.setAttribute("members", members)를 사용하여 "members"라는 이름으로 회원 목록을 Model에 저장한다.

  이렇게 저장된 데이터는 JSP 페이지에서 사용할 수 있다.

 

JSP 페이지로 제어 전달:
- 마지막으로, viewPath 변수에 저장된 JSP 페이지인 "/WEB-INF/views/members.jsp"로 제어를 전달.

  이를 통해 클라이언트에게 회원 목록을 표시할 JSP 페이지로 이동한다.

 

요약하면, 이 서블릿은 회원 목록을 조회하고, 조회된 회원 목록을 Model에 저장한 후 

"/WEB-INF/views/members.jsp" JSP 페이지로 이동하여 결과를 클라이언트에게 보여주는 역할을 수행. 

이것은 MVC 아키텍처에서 컨트롤러 역할을 하며, 사용자의 요청을 처리하고 모델과 뷰 간의 상호 작용을 조정.

 

 

 

회원 목록 조회 - 뷰
main/webapp/WEB-INF/views/members.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/index.html">메인페이지</a>
<table>
    <thead>
    <th>id</th>
    <th>username</th>
    <th>age</th>
    </thead>
    <tbody>
    <c:forEach var="item" items="${members}">
        <tr>
            <td>${item.id}</td>
            <td>${item.username}</td>
            <td>${item.age}</td>
        </tr>
    </c:forEach>
    </tbody>
</table>

</body>
</html>

 

데이터 3개 넣어서 실행하면

3개 들어가 있음.

 

728x90
Comments