📖 김영한 님의 <스프링 MVC 1편 - 백엔드웹 개발 핵심 기술> 강의를 보고 공부하며 정리한 포스트입니다.
여기서 전송
을 딱 눌렀을 때 어떤 일이 일어날까요? 웹 브라우저가 요청 HTTP 메시지를 아래와 같이 만듭니다.
POST
메서드와 /save
URL로 보내겠다는 메시지가 생성이 되었습니다. Host
헤더에 BaseURL, Content-Type
에 Form-data를 보내겠다는게 명시되어 있으며, 메시지 Body에 유저가 입력한 데이터가 들어가 있습니다.
이렇게 만든 메시지를 서버로 전송을 합니다.
유저로부터 받을 위 HTTP 메시지를 풀어헤쳐 처리할 코드를 작성해야 합니다...! 주로 사용되는 TCP/IP 프로토콜 방식의 소켓 연결을 대기하는 코드를 짭니다. 이때 들어올 HTTP 요청 메시지는 그냥 해당 소켓으로 전송되는 단순 텍스트입니다. HTTP라는 프로토콜을 알고 있으므로 해당 규칙에 따라 메시지를 잘라(파싱)줍니다. 이 메시지가 POST
방식이라는 사실, 엔드포인트가 /save
라는 사실, Content-Type
이 Form-data라는 사실을 확인하고 메시지 Body 내용까지 그에 맞게 해석을 해냅니다. 메시지를 저장하는 프로세스까지 거치고나면 그제서야 이에 맞는 비즈니스 로직에 요청을 연결할 수 있습니다. 이때부터는 우리가 아는 DB에 저장을 요청하고(이러한 DB 연결도 관리해야 할 겁니다) 예외처리를 해줍니다. 다 되고 나면 이제 읽씹할 수 없으니 클라이언트를 위한 HTTP 응답을 만들어줘야 합니다. HTTP 응답 메시지를 텍스트로, 직접 HTTP 시작 라인, Header, Body까지 만들어줍니다. 열려있던 있던 TCP/IP 소켓으로 응답을 전달하고 나면 소켓을 종료합니다.
여기서 저희가 실제로 신경써서(물론 다 신경써야겠지만!) 구현해야할 비즈니스 로직, 즉, 클라이언트의 요청에 따라 이름과 나이를 저장하는 부분은 저 긴 과정 중 중간에 잠깐 뿐입니다. 이런 부분을 매번 다 구현해야 한다면 전세계 개발자들이 가만있지 않겠죠(감히 일을 중복해?). 그래서 등장한 것이 서블릿(Servlet)입니다. 서블릿은 제가 말한 중요한 비즈니스 로직 부분을 제외한 모든 부분에 대한 기능을 지원해줍니다!
✏️ 서블릿(Servlet) 자바 기반 웹 애플리케이션에서 클라이언트 요청을 처리하고 응답을 생성하는 서버 측 프로그램입니다. 서블릿은 Java EE (Java Platform, Enterprise Edition) 기술 스택의 일부로, 웹 서버와 클라이언트(주로 웹 브라우저) 간의 동적 콘텐츠를 생성하는 데 사용됩니다.
JSP 파일의 라이프사이클. Servlet이 포함되어 있어 참고로 가져왔습니다. (출처: 위키백과)
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
// 애플리케이션 로직
}
}
urlPatterns(/hello)의 URL이 호출되면 위 클래스의 service()
코드가 실행됩니다. 해당 클래스에서 이제 소켓 연결과 관련된 부분을 처리해줍니다. 저희는 HttpServlet
만 상속 받아 애플리케이션 로직만 작성하면 됩니다. 또한, HTTP 텍스트를 파싱하는 코드를 작성하는 것도 만만치 않은 귀찮음일 것입니다. 이러한 HTTP 요청 정보 사용과 응답 제공을 편리하게 해주는 HttpServletRequest
와 HttpServletResponse
도 제공됩니다. 예를 들어:
String name = request.getParameter("name");
등의 코드로 폼데이터의 파라미터를 간단하게 가져올 수 있습니다(와 편리해~). 그러나 기본적인 HTTP 스펙을 알아야 Servlet이 정확히 어떤 부분을 추상화해서 기능을 제공하는지 알 수 있고, 어떤 기능을 사용해야할 지도 알 수 있습니다. 때문에 이러한 HTTP 스펙 공부가 필요합니다.
서버 주소를 localhost:8080
라고 하겠습니다. 클라이언트 웹 브라우저가 localhost:8080/hello
라고 요청을 합니다. 그러면 WAS에서 요청 메시지를 기반으로 request
, response
객체를 생성합니다. 그 다음 서블릿 컨테이너(추후 설명합니다)에서 저희가 만든 helloServlet
이라는 이름의 서블릿을 생성된 request
와 response
객체를 넘겨 실행해줍니다. helloServlet
끝나고 리턴을 하고 나면, 기존에 넘겨받았던 response
객체를 바탕으로 HTTP 응답 메시지를 생성하고 이를 웹 브라우저에 반환해줍니다.
자바는 아시다시피 코드 실행을 위해 객체가 있어야합니다. 그런데 위와 같은 서블릿 객체를 저희가 직접 생성하지 않습니다. 서블릿 클래스만 코드로 작성하면 이를 서블릿 컨테이너가 자동으로 생성하고, 호출하고, 생명주기를 관리해줍니다. 이 관리를 맡은 걸 서블릿 컨테이너라 부르기로 했다는 설명이 좀 더 매끄럽겠네요.
🙇♂️ 오타, 잘못된 정보, 추가 정보 등이 있으면 얼마든지 알려주세요! 감사합니다.