티스토리 뷰

1번. MVC란 무엇인가?

MVC란 Model, View, Controller의 약자로 웹 애플리케이션을 비즈니스 로직, 프레젠테이션 로직, 데이터로 분리하는 디자인 패턴이다.

유지보수가 쉽고 쉽게 확장 및 테스트를 할 수 있다.

 

 

 

 

2번. MVC 모델 2의 구조와 요청 처리 흐름을 그림으로 표현하고 설명하시오.

 

 

1. 클라이언트가 웹 브라우저를 통해 애플리케이션에 접속하고 요청을 생성한다.

2. 클라이언트의 요청을 컨트롤러로 전달한다.  //1번

3. 컨트롤러는 받은 요청을 처리하기 위해 해당 요청에 맞는 모델을 호출한다.  //2번

4. 모델은 받은 요청을 처리하고 필요한 데이터를 조회하거나 수정한다.  //3번

5. 모델은 처리한 데이터를 컨트롤러로 반환한다.   //4번

6. 컨트롤러는 모델로부터 전달받은 데이터를 뷰에 전달한다.   //5번

7. 뷰는 전달받은 데이터를 사용해 동적인 컨텐츠를 생성하고 클라이언트에게 응답으로 전송한다.   //6번

8. 클라이언트는 받은 응답을 처리해 결과를 화면에 표시한다.

 

 

(컨트롤러는 전처리 or 이동하는 기능을한다. 요청을 생성함. 그렇기때문에 xml에서 전처리하고 클래스를 생성함)

 

 

 

 

3번. MVC 패턴을 구현하는 기법을 예를 들어 설명하시오.

첫번째 web.xml 파일에 서블릿을 작성해야한다.

  <servlet>
  	<servlet-name>controller</servlet-name>
  	<servlet-class>test.gugu_controller</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>controller</servlet-name>
  	<url-pattern>/gugudan</url-pattern>
  </servlet-mapping>

작성시 주의할 점은 name은 통일되어야한다는 점이다.

또한, url-pattern을 주의해야하는데 만약 action이나 href 와 연결되는 것이라면 전송되었을때 url 주소가 어떻게 표기될 것인지 먼저 인지를 해야한다.

 

 

 

두번째 컨트롤러를 생성한다.

package test;


public class gugu_controller extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		RequestDispatcher dispatcher = req.getRequestDispatcher("/gugudan_proccess.jsp");
		dispatcher.forward(req, resp);
	}
}

 

HttpServlet 클래스를 확장하여 생성한다. 

get방식과 post방식에 따라 doGet(), doPost() 메소드를 실행해 요청 작업을 처리한다.

 

 

 

세번째 모델을 생성한다.

 

데이터베이스를 가져오거나, 웹 애플리케이션에 필요한 서비스를 수행하는 간단한 자바 클래스로 자바빈즈를 말한다.

데이터를 담을 멤버 변수인 프로퍼티와 데이터를 가져오거나 저장하는 Getter/Setter() 메소드로 구성된다.

 

 

 

네번째 뷰를 생성한다.

 

웹 브라우저의 요청을 처리한 결과를 사용자에게 보여주는 JSP 페이지이다.

JSP가 제공하는 태그를 사용해 컨트롤러가 전송한 모델 데이터를 웹 브라우저에 출력한다.

view.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%
	String msg = (String)request.getAttrobute("message");
    out.println(msg);
%>

 

 

 

 

 

 

 

 

4번. MVC 모델 2의 패턴 구조를 이용하여 다음 조건에 맞게 JSP 애플리케이션을 만들고 실행 결과를 확인하시오.

 

 

- <servlet> 요소로 서블릿 클래스를 등록한다.

- <servlet-mapping> 요소로 요청 URL 패턴을 설정한다.

 

  <servlet>
  	<servlet-name>controller</servlet-name>
  	<servlet-class>test.gugu_controller</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>controller</servlet-name>
  	<url-pattern>/gugudan</url-pattern>
  </servlet-mapping>

 

주소창 마지막에 gugudan이라고 표기되면 test.gugu_controller로 이동한다.

 

 

gugudan.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<form action="gugudan" method="post">
		<input type="text" name="num">
		<input type="submit" value="전송">
	</form>
</body>
</html>

 

form에서 숫자를 입력하고 submit을 한다.

submit을 할 때 action에 gugudan이 설정되어 있으므로 주소 뒤에 gugudan이라고 표기된다.

위에 servlet에서 설정한 주소와 매핑이 되므로 test.gugu_controller로 이동한다.

 

 

 

gugu_controller.java

package test;

import java.io.IOException;

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

/*@WebServlet("/gugudan_proccess")*/
public class gugu_controller extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		RequestDispatcher dispatcher = req.getRequestDispatcher("/gugudan_proccess.jsp");
		dispatcher.forward(req, resp);
	}
}

 

test.gugu_controller로 이동하여 서블릿 클래스를 생성하고 오버라이딩하여 실행하는데 

doPost 에서 requestdispatcher이라는 명령어를 사용했으므로 gugudan_proccess.jsp로 이동한다.

이동할 시 req, resp를 가지고 이동한다. (뷰 페이지가 이동해도 처음에 요청된 URL을 유지할 수 있다)

 

 

 

 

 

gugudan_proccess.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<%
		int num = Integer.parseInt(request.getParameter("num"));
		
	for(int i=1; i<10; i++){
		int b = num*i;
		out.println(num+"*"+i+"="+b+"<br>");
	}
	%>
</body>
</html>

 

gugudan_proccess.jsp로 이동하여 넘겨받은 숫자와 for문을 사용하여 구구단을 출력할 수 있다.

 

 

결과

 

 

 

 

코드 수정 연산을 controller에서 처리하고 출력을 result.jsp에서 처리

 

 

 

gugu_controller.java

package test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class gugu_controller extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 입력값 가져오기
        int num = Integer.parseInt(req.getParameter("num"));
        List<String> results = new ArrayList<>();

        // 계산 로직
        for (int i = 1; i < 10; i++) {
            int b = num * i;
            results.add(num + "*" + i + "=" + b);
        }

        // 결과를 request attribute에 담아서 전달
        req.setAttribute("results", results);

        // Dispatcher를 통해 결과를 result.jsp로 전송
        RequestDispatcher dispatcher = req.getRequestDispatcher("/result.jsp");
        dispatcher.forward(req, resp);
    }
}

 

 

 

result.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>곱셈 결과</title>
</head>
<body>
    <%@ page import="java.util.List" %>
    <%@ page import="java.util.ArrayList" %>
    <%-- 결과 가져오기 --%>
    <% List<String> results = (List<String>) request.getAttribute("results"); %>

    <%-- 결과 출력 --%>
    <h2>구구단 결과</h2>
    <%
        if (results != null) {
            for (String result : results) {
                out.println(result + "<br>");
            }
        } else {
            out.println("결과가 없습니다.");
        }
    %>
</body>
</html>

 

 

결과

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday