[JSP]MVC2

이혜원·2024년 9월 18일

JSP

목록 보기
1/2

MVC 패턴

M : Model
V : View
C : Controller

  • Model : 사용자가 원하는 데이터나 정보를 제공.

    애플리케이션의 정보, 데이터를 나타낸다. 이러한 data정보들의 가공을 책임지는 컴포넌트
  • View : 보여지는 화면.

    input text, checkbox 항목 등과 같은 사용자 인터페이스 요소를 나타낸다. 다시 말해 데이터 및 객체의 입력 그리고 보여주는 출력을 담당한다. 데이터를 기반으로 사용자들이 볼 수 있는 화면이다.
  • Controller : 사용자의 요청을 처리하고 그 요청에 따른 흐름을 제어.

    데이터와 사용자 인터페이스 요소들을 잇는 다리 역할을 한다.

MVC1

MVC1 패턴은 View와 Controller를 모두 JSP가 담당하는 형태를 가진다.

  • JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도는 쉽다.
  • 단순한 프로젝트에서는 괜찮겠지만 내용이 복잡하고 거대해지루록 이 패턴은 힘을 잃는다.
    => 유지보수에 문제가 생긴다.

MVC2

MVC2 패턴은 널리 표준으로 사용되는 패턴이다.

  • 요청을 하나의 controller(Servlet)가 먼저 받는다.
    => MVC1 패턴과 다르게 Controller, View가 분리되어 있다.
    => 역할일 분리되어 MVC1 패턴의 단점을 보완할 수 있다.
  • M, V, C 중에서 수정해야 할 부분이 생기면 해당 부분만 수정하면 된다.
    => 유지보수에 큰 이점이 있다.

MVC2 패턴의 간단한 예제코드(DB연동 X)

이름과 이메일을 저장하는 간단한 회원등록
M : Member.java
V : memberForm.jsp / memberResult.jsp
C : MemberController.java

  • Member.java
package member;

public class Member {
	private String name;
	private String email;
	
	public Member(String name, String email) {
		super();
		this.name = name;
		this.email = email;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "이름 : " + name + ", email : " + email;
	}
}
  • memberForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>회원 등록</h2>
	<form action="register" method="post">
		이름 : <input type="text" name="name"> <br>
		이메일 : <input type="text" name="email"> <br>
		
		<input type="submit" value="등록">
	</form>
</body>
</html>
  • memberResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>회원 등록 결과</h2>
	이름 : <%=request.getAttribute("name") %> <br>
	이메일 : <%=request.getAttribute("email") %> <br>
	member : <%=request.getAttribute("member") %>
</body>
</html>
  • MemberController.java
package member;

import java.io.IOException;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/register")
public class MemberController extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		
		Member member = new Member(name, email);
		request.setAttribute("member", member);
		
		request.setAttribute("name", name);
		request.setAttribute("email", email);
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("memberResult.jsp");
		dispatcher.forward(request, response);
		
	}
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher dispatcher = request.getRequestDispatcher("memberForm.jsp");
		dispatcher.forward(request, response);
		
	}
}

Controller 코드 분석하기

MemberController.java

12줄
@WebServlet("/register")

  • "register" URL로 들어오는 요청을 처리 / 해당 Servlet을 호출.

13줄
public class MemberController extends HttpServlet

  • Java Servlet API의 기본 클래스인 HttpServlet을 상속받아 웹 애플리케이션에서 HTTP 요청을 처리하는 서블릿을 만듦.

15줄
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

  • doPost() : POST 요청을 처리하는 메서드.
  • HttpServletRequest : 클라이언트가 서버로 보낸 요청(request)를 캡슐화한 객체.
    - Form에서 전송된 데이터를 읽는다.
  • HttpServletResponse : 서버가 클라이언트에게 보내는 응답(reponse)을 캡슐화한 객체.
  • throws ServletException, IOException : 예외처리.
    - ServletException : servlet과 관련된 일반적인 오류.
    -IOException : 입출력 오류(ex. 네트워크, 읽기 오류 등)

16~17줄
String name = request.getParameter("name");
String email = request.getParameter("email");

  • form 데이터를 가져온다. "name", "email" 해당 name값을 가져온다.

19줄
Member member = new Member(name, email);

  • name과 email 값을 저장하는 member 객체를 생성했다.

20~23줄
request.setAttribute("member", member);

request.setAttribute("name", name);
request.setAttribute("email", email);

  • Member 객체를 request 객체의 속성으로 설정하고 "member"라는 이름으로 해당 속성을 참조할 수 있게 지정하였다.
  • name 변수에 담긴 값을 request 객체에 "name"이라는 이름으로 저장하여 속성을 참조할 수 있게 지정하였다.
  • email 변수에 담긴 값을 request 객체에 "email"이라는 이름으로 저장하여 속성을 참조할 수 있게 지정하였다.

25~26줄
RequestDispatcher dispatcher = request.getRequestDispatcher("memberResult.jsp");
dispatcher.forward(request, response);

  • RequestDispatcher : '요청을 보내주는 인터페이스'로 서버 내에서 다른 리소스(jsp, servlet)로 요청을 전달할때 사용한다.
  • dispatcher : RequestDispatcher 인터페이스를 구현한 객체.
  • forward : 다른 페이지로 이동, 페이지 흐름 제어. request와 reponse에 담긴 값이 유지된채로 페이지를 이동한다. (redirect는 값이 유지되지 않음.)
  • 요청(request)과 응답(response)을 "memberResult.jsp" 페이지로 포워딩한다. 즉, 해당 페이지로 요청을 포워딩하기 위한 dispatcher 객체를 반환한다.

31줄
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

  • doGet() : GET 요청을 처리하는 메서드.

0개의 댓글