[Spring 10-3] MVC를 이용한 프로그램 생성(흐름파악)

임승현·2023년 2월 21일

Spring

목록 보기
27/46

※ src/main/java 폴더에 xyz.itwill09.mvc 패키지 생성

🌈서블릿 클래스 생성(DispatcherServlet.java)

📃DispatcherServlet.java

※ xyz.itwill09.mvc 패키지에 DispatcherServlet.java 클래스 생성

package xyz.itwill09.mvc;
//
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//
//컨트롤러(Controller) : 클라이언트의 모든 요청을 받아 URL 주솔르 분석하여 요청 처리 클래스(Model)의 메소드를 호출하여
//	데이터 처리 후 JSP 문서(View)로 스레드를 이동하여 응답되도록 프로그램의 흐름을 제어하는 기능을 제공
//
//컨트롤러 역활을 제공하기 위한 클래스 - 서블릿 클래스
//→ 클라이언트의 모든 요청을 받아 처리하는 단일 진입점의 역할을 수행하는 서블릿 - Front Controller Pattern
//→ web.xml 파일에서 클래스를 서블릿(웹프로그램)으로 등록하고 클라이언트의 모든 요청을 처리할 수 있도록 URL 주소의 패턴을 설정
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	//
	//클라이언트의 요청을 처리하기 위해 자동 호출되는 메소드를 오버라이드 선언
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 클라이언트의 요청 URL 주소를 분석하여 요구사항을 반환받아 저장
		String requestURI=request.getRequestURI();
		String contextPath=request.getContextPath();
		String command=requestURI.substring(contextPath.length());
		//
		//2. 클라이언트의 요구사항을 이용하여 요청 처리 클래스(Model)의 객체를 제공받아 객체의 메소드를 호출하여 클라이언트 요청에 대한 처리 작업
		/*
		//비효율적인 방법
		//인터페이스를 참조변수로 선언하면 인터페이스를 상속받아 모든 자식클래스의 객체 저장 가능
		Controller controller=null;
		//클라이언트의 요구사항을 비교하여 요청 처리 클래스를 객체로 생성
		if(command.equals("/list.itwill")) {
			controller=new ListController();
		} else if(command.equals("/view.itwill")) {
			controller=new ViewController();
		}
		*/
		//효율적인 방법
		//HandlerMapping 클래스로 객체 생성
		//→ 클라이언트의 요구사항과 요청 처리 클래스의 객체가 엔트리로 저장된 Map 객체 사용 가능
		HandlerMapping handlerMapping=new HandlerMapping();
		//HandlerMapping 객체의 메소드를 호출하여 클라이언트의 요구사항을 처리하기 위한 요청 처리 클래스의 객체를 반환받아 저장
		Controller controller=handlerMapping.getController(command);
		//
		//요청 처리 클래스의 메소드 호출하여 요청을 처리하고 JSP 문서의 이름(ViewName)을 반환받아 저장
		String viewName=controller.handleRequest(request, response);
		//
		//3. JSP 문서로 포워드 이동하여 클라이언트에게 처리결과가 응답되도록 처리
		//→ 요청 처리 메소드의 반환값(ViewName)을 이용하여 JSP 문서의 경로를 완성하여 포워드 이동
		//ViewResolver 클래스로 객체 생성
		ViewResolver viewResolver=new ViewResolver();
		String view=viewResolver.getView(viewName);//응답할 JSP 문서의 경로 완성
		request.getRequestDispatcher(view).forward(request, response);
	}
}

🌈VO 클래스 생성(Member.java)

📃Member.java

※ xyz.itwill09.mvc 패키지에 Member.java 클래스 생성

package xyz.itwill09.mvc;
//
import lombok.AllArgsConstructor;
import lombok.Data;
//
//회원정보를 저장하기 위한 클래스 - VO 클래스
@AllArgsConstructor
@Data
public class Member {
	private String id;
	private String name;
	private String address;
}

🌈인터페이스 생성(Controller.java)

📃Controller.java

※ xyz.itwill09.mvc 패키지에 Controller.java 인터페이스 생성

package xyz.itwill09.mvc;
//
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//
//모델 역할을 제공하는 클래스가 반드시 상속 받아야 되는 인터페이스
//→ 모든 모델 클래스에 동일한 메소드가 작성되도록 규칙 제공
//→ 컨트롤러에서 모델 클래스의 요청 처리 메소드 호출을 간편하게 하기 위해 인터페이스 사용
public interface Controller {
	//모든 모델 클래스에서 반드시 작성할 요청 처리 메소드를 추상메소드로 선언
	String handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}

🌈모델 역할의 클래스 생성(ListController.java)

📃ListController.java

※ xyz.itwill09.mvc 패키지에 ListController.java 클래스 생성

package xyz.itwill09.mvc;
//
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//
//모델(Model) : 클라이언트의 요청을 처리하기 위한 기능을 제공
//
//모델 역할을 제공하기 위한 클래스 - 요청 처리 메소드가 선언된 인터페이스를 상속받아 작성
//→ 하나의 클라이언트 요청에 대한 하나의 요청 처리 클래스를 사용하여 클라이언트의 요청 처리 - Command Pattern
//→ 클라이언트가 [/list.itwill]의 URL 주소로 요청한 경우 컨트롤러에 의해 동작될 요청 처리 클래스
public class ListController implements Controller {
	//요청 처리 메소드 : 클라이언트의 요청을 처리하기 위한 명령을 작성한 메소드
	//→ 스레드가 이동되어 응답될 JSP 문서(View)의 이름을 반환
	@Override
	public String handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//요청 처리 명령 - 데이터 처리 : Service 클래스의 메소드 호출
		List<Member> memberList=new ArrayList<Member>();
		memberList.add(new Member("abc", "홍길동", "서울시 강남구"));
		memberList.add(new Member("opq", "임꺽정", "인천시 월미구"));
		memberList.add(new Member("xyz", "전우치", "수원시 팔달구"));
		//
		//요청에 대한 처리 결과를 JSP 문서에 제공하기 위해 request 속성값으로 저장
		request.setAttribute("memberList", memberList);
		//
		//처리 결과를 제공받아 클라이언트에게 응답할 JSP 문서의 이름(ViewName) 반환
		return "member_list";//컨트롤러가 받아서 JSP로 이동하게 해줌
	}
}

🌈모델 역할의 클래스 생성(ViewController.java)

📃ViewController.java

※ xyz.itwill09.mvc 패키지에 ViewController.java 클래스 생성

package xyz.itwill09.mvc;
//
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//
//모델 역할을 제공하기 위한 클래스
//→ 클라이언트가 [/view.itwill]의 URL 주소로 요청한 경우 컨트롤러에 의해 동작될 요청 처리 클래스
public class ViewController implements Controller {
	@Override
	public String handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Member member=new Member("abc", "홍길동", "서울시 강남구");
		//
		request.setAttribute("member", member);
		//
		return "member_view";
	}
}

🌈클래스 생성(HandlerMapping.java)

📃HandlerMapping.java

※ xyz.itwill09.mvc 패키지에 HandlerMapping.java 클래스 생성

package xyz.itwill09.mvc;
//
import java.util.HashMap;
import java.util.Map;
//
//클라이언트의 요구사항과 요청 처리 클래스의 객체를 Map 객체의 엔트리(Entry)로 저장하여 제공하는 기능의 클래스
public class HandlerMapping {
	//Map 객체를 저장하기 위한 필드
	//→ 엔트리의 제네릭으로 맵키는 요구사항을 저장하기 위한 String 클래스로 설정하고 맵값은 요청 처리 클래스의 객체르 저장하기 위해 Controller 인터페이스로 설정
	private Map<String, Controller> mappings;
	//
	//생성자를 이용한 필드 초기화 - Map 객체 생성하여 엔트리 추가
	public HandlerMapping() {
		mappings=new HashMap<String, Controller>();
		mappings.put("/list.itwill", new ListController());
		mappings.put("/view.itwill", new ViewController());
	}
	//
	//클라이언트의 요구사항(MapKey)에 대한 요청 처리 클래스의 객체(MapValue)를 반환하는 메소드
	public Controller getController(String command) {
		return mappings.get(command);
	}
}

🌈클래스 생성(ViewResolver.java)

📃ViewResolver.java

※ xyz.itwill09.mvc 패키지에 ViewResolver.java 클래스 생성

package xyz.itwill09.mvc;
//
//응답 관련 정보를 제공하기 위한 클래스
public class ViewResolver {
	//JSP 문서의 이름(ViewName)을 제공받아 JSP 문서의 경로를 완성하여 반환하는 메소드
	public String getView(String viewName) {
		return "/WEB-INF/mvc"+viewName+".jsp";
	}
}

🌈web.xml 수정

📃web.xml

※ src/main/webapp/WEB-INF 폴더에 있는 web.xml 수정

<!-- servlet : 서블릿 클래스를 서블릿(웹프로그램)으로 등록하기 위한 엘리먼트 -->
<servlet>
	<!-- servlet-name : 서블릿을 구분하기 위한 식별자를 설정하기 위한 엘리먼트 -->
	<servlet-name>mvc</servlet-name>
	<!-- servlet-class : 클라이언트 요청에 의해 객체로 생성되어 실행될 서블릿 클래스을 설정하기 위한 엘리먼트 -->
	<!-- DispatcherServlet 클래스 : 컨트롤러(Controller) 역할을 제공하는 클래스 - Front Controller -->
	<servlet-class>xyz.itwill09.mvc.DispatcherServlet</servlet-class>
</servlet>
<!--                                                                                           -->
<!-- servlet-mapping : 서블릿을 요청하기 위한 URL 주소의 패턴을 등록하기 위한 엘리먼트 -->
<servlet-mapping>
	<!-- servlet-name : 클라이언트 요청에 의해 실행될 서블릿의 식별자를 설정하기 위한 엘리먼트 -->
	<servlet-name>mvc</servlet-name>
	<!-- url-pattern : 서블릿을 실행하기 위한 URL 주소의 패턴을 설정하기 위한 엘리먼트 -->
	<!-- → Front Controller 역할을 제공하는 서블릿은 클라이언트의 모든 요청을 받아 처리되도록 설정 -->
	<url-pattern>*.itwill</url-pattern>
</servlet-mapping>

🌈JSP 문서 생성

📃member_list.jsp

※ src/main/webapp/WEB-INF 폴더에 mvc 폴더 생성
※ mvc 폴더에 member_list.jsp 파일 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 회원목록을 제공받아 출력하는 문서 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
	<h1>회원목록</h1>
	<hr>
	<c:forEach var="member" items="${memberList }">
		<p>아이디 = ${member.id }, 이름 = ${member.name }, 주소 = ${member.address }</p>
	</c:forEach>
</body>
</html>

📃member_view.jsp

※ mvc 폴더에 member_view.jsp 파일 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 회원정보를 제공받아 출력하는 JSP 문서 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
	<h1>회원정보</h1>
	<hr>
	<p>아이디 = ${member.id }, 이름 = ${member.name }, 주소 = ${member.address }</p>
</body>
</html>

0개의 댓글