Spring MVC 를 왜 사용하는지 알기위해 그 전에 주로 사용했던 Servlet, JSP, MVC 패턴에 대해 정리를 해보려한다.
(김영한님의 스프링 MVC강의를 참고했다.)
자바를 사용해서 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양 이라고하는데 웹 서버의 성능을 향상 시키기 위해 사용되는 자바 클래스의 일종이다.
쉽게 예시를 들어 설명하면
HTML Form으로 데이터를 전송하면 웹 브라우저가 HTTP 메시지를 생성해 서버로 보낸다.
POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencodedusername=kim&age=20
HTTP 메시지는 단순히 String 이기때문에 일일이 다 파싱을 해주어야한다.
그리고 네트워크 연결과 응답 생성등 다양한 일들을 모두 해주어야하는데
만약 서블릿을 사용하지않는다면 아래의 모든 사항을 개발자가 직접 구현해야한다.
- 서버 TCP/IP 연결 대기, 소켓 연결
- HTTP 요청 메시지 파싱해서 읽기
- HTTP method, URL 확인
- Content-Type 확인
- 쿼리 파라미터 사용할수있도록 HTTP 메시지 바디 파싱
- 비즈니스 로직 실행
- HTTP 응답 메시지 생성
- TCP/IP에 응답 전달, 소켓 종료
이렇게 많은 일을 개발자가 반복적으로 하는것을 막기위해 서블릿이 등장했다.
개발자는 비즈니스 로직 부분만 신경쓰면되고 나머지는 서블릿이 처리해줘서 개발자가 HTTP 스펙을 굉장히 편리하게 사용할 수 있게 해줬다.
간단한 내용의 HTML을 보내는데도 굉장히 지져분하다.
@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//content-type
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println(" <div>안녕?</div>");
writer.println("</body>");
writer.println("</html>");
}
}
Servlet과 JSP 각각의 단점을 보완하기위해 MVC 패턴을 사용하게 되었다.
: 컨트롤러와 뷰로 역할을 분리
여기에 컨트롤러의 역할을 분리해 서비스를 추가할수있다.
<그림>
유재형님 안녕하세요. 혹시 괜찮으시다면, 스프링 mvc 이미지 다운로드 받아서 사용해도 될까요?