| 웹페이지의 탄생과 발전 과정
인터넷에 처음 웹이 생겨났을 때는 단순히 정보를 전달하기 위함이었습니다
그렇기 때문에 정적인 데이터만 담고 있어도 역할을 하기에 충분했죠
하지만 오늘 날, 웹 페이지는 단순히 정적인 정보만 담고 있지 않고
수많은 동적 데이터를 갖고 있으며 하루에도 수십 번씩 변화하는 데이터를 담고 있습니다
그렇다면 웹을 구현하고 개발하는 방식도 달라지지 않았을까요?
HTML을 이용해 컴퓨터에 저장된 텍스트 파일을 그대로 보는 것을 우리는 정적 웹 페이지라고 부르고,
이와 다르게 내용을 가공 처리하여 보는 것을 동적 웹페이지라고 부릅니다
정적 웹페이지의 동작방식은 단순히 클라이언트가 웹 브라우저를 통해 웹 페이지를 요청하면
서버가 준비된 HTML을 그대로 보여주는 것 뿐이죠

그렇다면 동적 웹페이지에는 데이터를 가공해줄 무언가가 필요합니다.
그것이 바로 웹 어플리케이션 서버, WAS 입니다. 대표적으로 apache tomcat이 있습니다

이제 동적인 데이터를 처리해주는 서버인 WAS가 준비되었습니다.
그렇다면 이제 동적인 데이터를 담고 있는 "기능을 처리할 수 있는 코드"가 필요하겠죠?
그게 바로 Servlet입니다.
서블릿은 기본적으로 HttpServlet을 상속받아 doGet, doPost, destroy, init등과 같은 메소드를 오버라이드하여 사용합니다.
request를 통해 parameter를 받아와서 html로 응답을 출력할 수 있게 됩니다
Servlet 객체는 WAS(Tomcat 등)가 하나만 생성해서 재사용합니다.
즉, 싱글톤처럼 동작합니다


이런식으로 코드를 작성하면 이제 /first 로 접속을 했을 경우 FirstServlet 클래스의 init()과 doGet이 출력되는 것을 알 수 있고 두번째 호출부터는 init()은 출력되지 않습니다.
여기까지가 정적 웹페이지에서 동적 웹페이지의 탄생 그에 필요한 WAS와 SERVLET & XML 설정에 대해 알아보았습니다
하지만 모든 servlet을 xml에서 mapping해야 하는 방식은 꽤나 번거로운 일입니다 그렇기 때문에 Servlet 3.0 이상 환경에서는 annotation방식의 mapping을 지원합니다. 이를 통해 xml파일은 필요없이 다음과 같이 사용할 수 있습니다

하지만 순수 서블릿 방식은 HTML을 자바 코드로 작성해야 하기 때문에,
로직과 화면이 뒤섞여 유지보수에 어려움이 있습니다.
이는 디자인과 로직의 경계를 모호하게 하여 유지보수와 가독성을 불편하게 만들
그렇기 때문에 서블릿만 사용하던 방식에서 다시 한번 서블릿 + jsp 사용 방식으로 발전하게 됩니다
즉, 서블릿이 컨트롤러 역할을, JSP가 뷰 역할을 하게 된 것이죠
다음 간단한 예제 코드를 보면서 이해해 보도록 합시다
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = "cochae";
req.setAttribute("name", name);
RequestDispatcher dispatcher = req.getRequestDispatcher("/hello.jsp");
dispatcher.forward(req, resp);
}
}
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head><title>Hello JSP</title></head>
<body>
<h1>안녕하세요, ${name}님!</h1>
</body>
</html>
이런 식으로 로직을 분리하게 되면, 서버에 있는 데이터를 html안으로 넣어 유저에게 제공할 수 있게 됩니다
“이후 Spring MVC에서는 개발자가 직접 서블릿을 정의하거나 @WebServlet 어노테이션을 사용하지 않아도 되고,
대신 @Controller와 @RequestMapping 등의 애노테이션으로 URL 매핑을 처리합니다.”
그렇기 때문에 개발자는 로직 구현에만 집중할 수 있는 환경이 되었죠
스프링의 동작방식과 dispatcherservlet에 대해서는 추가 포스팅으로 설명하겠습니다 !