백엔드/JSP

웹 프로그래밍의 시작 (2)

두개의 문 2023. 6. 16. 09:22
MVC  구조 

 

- MVC 구조 : Model - View - Controller의 역할을 분리해서 처리하는 구조 

· 서블릿/JSP의 장단점을 고려해 MVC 구조에 따라 데이터는 Controller에서, 결과는 View에서 처리

  → 즉, 서블릿이 Controller 역할이고 JSP가 View 역할! 

· 필요한 데이터를 제공하는 객체 : Model 

 

① 브라우저의 요청은 해당 주소를 처리하는 서블릿에 전달

② 서블릿 내부 : 응답에 필요한 재료 데이터를 준비함

③ 서블릿은 준비한 데이터들을 JSP로 전달함 

④ JSP에서는 EL을 이용해서 최종적인 결과 데이터를 HTML 구조로 생성함 

⑤ JSP를 이용해 생성된 결과 화면은 톰캣을 통해서 브라우저로 전송됨 

 

 


MVC 구조로 계산기를 다시 설계해보자
- 브라우저의 호출은 반드시 컨트롤러 역할을 하는 서블릿을 호출하도록 구성
JSP는 브라우저에서 직접 호출하지 않도록 하고, Controller를 통해서만 JSP에 접근하도록 구성

 

▷ GET 입력화면 설계

 - 브라우저는 /input과 같이 특정한 주소를 호출

 - /input에 맞는 서블릿을 InputController로 작성, GET 방식일 때만 동작하도록 작성 

  → doGet( ) 메서드만 남기기

 - InputController의 화면 처리는 input.jsp를 이용하도록 처리 

 - input.jsp에는 HTML 코드를 이용해 브라우저에서 볼 수 있는 결과 생성 

 

 

* 서블릿 구현 클래스인 InputController 생성

package org.zerock.w1.calc;

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;

/**
 * Servlet implementation class InputController
 */

// 클라이언트가 서버창에 '/calc/input' url 입력 시, 
// 톰캣이 '/calc/input' url에 해당하는 inputController의 이름을 가진 InputController 서블릿을 찾아 실행시킴 
@WebServlet(name="inputController", urlPatterns="/calc/input")
public class InputController extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 콘솔창에 로그 출력
		// : 어떤 클래스에서 어떤 정보가 넘어왔다를 남기자.
		System.out.println("InputController...doGet...");
		
		// 서블릿을 통한 보안구역 간접 호출
		RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/calc/input.jsp");
		
		dispatcher.forward(request, response);
		
	}

}

 

❶ @WebServlet( ) : 경로를 입력할 때 Tomcat 서버가 알아서 찾아 실행해줌

 → 서블릿 맵핑 (각각의 서블릿이 담당하는 URL을 맵핑 → 서블릿 이름은 실제 서블릿 구현 클래스 객체와 연결되어 있음 )

 - 속성
   1) name : 서블릿의 이름을 설정하는 속성

   2) urlPatterns : 서블릿의 URL 목록을 설정하는 속성 

   3) value : urlPatterns과 동일한 용도 

 - 웹 브라우저에서 요청 → WAS(서블릿 컨테이너인 tomcat) → 서블릿 맵핑한 것을 토대로 해당 서블릿을 찾아 실행시킴 

     

 

❷ 

input.jsp를 WEB-INF 폴더 내로 옮김  

= 브라우저에서 jsp로 직접 호출 불가능하다는 의미 

→ 외부에서 직접 바로 접근하지 못하므로 InputController 객체를 통해 즉 내부 서블릿을 통해 간접적으로 접근하자. 

 

 

❸ RequestDispatcher를 이용한 요청 배포 
 - 웹 요청 발생 → 그 요청에 대한 요청객체와 응답객체는 한 쌍으로 존재 

 - InputController의 경우, RequestDispatcher 객체를 이용해 서블릿에 전달된 요청을 다른 쪽으로 전달 혹은 배포함

 - RequestDispatcher 객체는 객체 생성 시, 호출할 jsp 파일 또는 서블릿을 등록

RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/calc/input.jsp");

 

 이 객체에 한 쌍의 요청객체와 응답객체를 넘겨주면, 아까 등록된 호출객체가 실행한 결과(HTML 또는 문서)를 응답객체를 통해 웹 브라우저로 돌려줌 

dispatcher.forward(request, response);

 

 

서버에서 실행해보자. 

 

콘솔화면에서 출력된 로그 확인 가능

→ 중간에 InputController라는 서블릿이 실행되었음을 알 수 있음 

 

 

▷ POST 입력화면 설계

 - input.jsp의 <form> 태그의 action을 '/calcResult'로 변경, CalcResultServlet 서블릿을 컨트롤러로 작성

 - doPost( ) 메서드 오버라이드 

 - 쿼리 스트링으로 전달되는 num1, num2 파라미터를 request.getParameter( ) 메서드를 이용해 처리함 

 

 

* WEB-INF/calc/input.jsp

 

 

* 서블릿 구현 클래스인 CalcController 생성 

 

 

 

실행해보자.

 

 

'SEND' 버튼을 누르면, CalcController의 doPost( ) 메서드가 실행되는 결과를 볼 수 있음 

 

 

 

▷ sendRedirect( ) 

- POST 방식의 처리는 양식의 데이터를 받아 처리하는 것이 주목적

- GET 방식과 달리 가능하면 최대한 빨리 다른 페이지를 보이도록 브라우저 화면을 이동시켜야 함

- POST 방식을 통해 처리가 끝난 후, HttpServletResponse의 sendRedirect( ) 메서드를 이용

   : 페이지를 이동시키는 메서드로, url로 주어진 페이지로 제어가 이동함 

 

 

 

서버에서 실행해보자.

응답헤더에 'Location'이 포함될 경우, 브라우저의 주소창을 Location으로 지정된 곳으로 변경하고, 해당 주소를 호출하게 됨 (GET 방식)

현재 index에 해당하는 컨트롤러가 존재하지 않으므로 404에러 발생 

 

 

 


PRG 패턴 ( Post - Redirect - Get )

- PRG 패턴은 웹 MVC 구조에서 가장 흔하게 사용하는 패턴으로, POST 방식과 Redirect를 결합해서 사용

- PRG 패턴

① 사용자는 컨트롤러에 원하는 작업을 POST 방식으로 처리하기를 요청

② POST 방식을 컨트롤러에서 처리하고 브라우저는 다른 경로로 이동(GET)하라는 응답(Redirect)

③ 브라우저는 GET 방식으로 이동 

→ POST 방식의 처리 후에 바로 다른 주소로 브라우저가 이동하기 때문에 반복적으로 POST 호출이 되는 상황을 막을 수 있음

     또한, 사용자 입장에서도 처리가 끝나고 다시 처음 단계로 돌아간다는 느낌을 주게 됨 

'백엔드 > JSP' 카테고리의 다른 글

JSP : JSTL  (0) 2023.06.19
웹 프로그래밍의 시작 (3)  (0) 2023.06.18
웹 프로그래밍의 시작 (1)  (0) 2023.06.14
JSP Servlet 기초 (8) : Session  (0) 2023.06.13
JSP Servlet 기초 (7) : 쿠키를 이용한 로그인  (0) 2023.06.13