상세 컨텐츠

본문 제목

[Spring] Web MVC 방식

Backend/Spring

by hyeminyy 2023. 12. 10. 21:38

본문

728x90

 

MVC 구조와 서블릿 / JSP

 

 

브라우저의 요청은 해당 주소를 처리하는 서블릿에 전달되고 서블릿 내부에서는 응답에 필요한 재료 데이터들을 준비한다. 서블릿은 준비한 데이터들을 JSP로 전달하고 JSP에서는 EL을 이용해서 최종적인 결과 데이터를 생성한다.

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

 

웹 MVC라는 구조는 'Model - View - Controller'의 역할을 분리해서 처리하는 구조로 데이터는 컨트롤러에서 결과는 뷰에서 처리한다. 여기서 서블릿이 컨트롤러 역할이고, JSP가 뷰 역할이라고 할 수 있다.

컨트롤러 역할을 하는 서블릿은 JSP에 필요한 데이터를 가공하는 역할을 하는데 이때 필요한 데이터를 제공하는 객체를 모델이라고 한다.

 

MVC구조 예시

 - 브라우저의 호풀은 반드시 컨트롤러 역할을 하는 서블릿을 호출하도록 구성한다.

 - JSP는 브라우저에서 직접 호출하지 않도록 하고 Controller를 통해서만 JSP에 접근하도록 구성한다.

 

GET입력 화면의 설계

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

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

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

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

 

브라우저의 호출은 '/input' 이고 컨트롤러는 InputController, 뷰는 input.jsp가 된다.

 

POST처리의 설계

 - input.jsp의 <form> 태그의 action을 'calcResult'와 같이 변경하고 이에 해당하는 CalcResultServlet 서블릿을 컨트롤러로 작성한다.

 - CalcResultServlet은 <form>으로 전달되는 num1, num2 데이터를 읽어내서 결과 데이터를 만들어낸다.

 - 만들어진 결과를 calcResult.jsp와 같이 JSP로 전달해야 하고 JSP에서는 결과 데이터를 출력한다.

 

 

컨트롤러에서 뷰 호출

InputController는 @WebServlet으로 urlPatterns 속성을 지정해서 처리해야 하는 경로를 지정한다.

부모 클래스인 HttpServlet의 doGet()을 재정의(오버라이드, 부모 클래스의 메소드를 하위 클래스에서 다시 작성)하고 GET방식으로 들어오는 요청에 대해서만 처리하도록 구성한다.

 

InputController의 경우 가장 핵심적인 코드는 RequestDispatcher라는 존재를 이용해서 forward()를 실행하는 부분이다.

RequestDispatcher라는 존재는 말 그대로 서블릿에 전달된 여청을 다른 쪽으로 전달 혹은 배포 하는 역할을 하는 객체이다.

RequestDispatcher를 이용하면 InputController는 '/WEB-INF/calc/input.jsp' 목적지로 가는 중간 경유지이다.

 

 

 

POST 방식을 통한 처리 요청

사용자가 데이터 처리는 POST 방식으로 전송할 것이므로 이것을 처리하는 컨트롤러를 생성한다.

 

서블릿은 doPost()라는 메소드를 오버라이드해서 POST 방식으로 들어오는 요청을 처리할 수 있기 때문에 기존의 Controller에서 doPost()를 추가하거나 새로운 서블릿을 생성해서 doPost()를 작성하면 된다.

 

@WebServlet(name="AController", urlPatterns="/webapp/A")
public class AController extends HttpServlet{
	
    @Override
    protected coid doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
    	//내용
    	}
    }
}

AController.java

 

 - urlPatterns 속성값이 'webapp/A'로 지정되어있다. -> 브라우저의 경로를 수정해야한다.

 - doPost()를 오버라이드 -> 브라우저에서POST 방식으로 호출하는 경우에만 호출이 가능하다.

 

<form action = "/webapp/A" method ="post">
 	<input type="number" name="num1">
    <input type="number" name="num2">
    <button type="submit">Send</button>
</form>

 

브라우저를 통해 Send 버튼을 누르면 POST 방식으로 AController의 doPost()가 실행되는 결과가 나온다.

 

 

 

728x90

관련글 더보기