[스프링MVC] 웹기본 동작방식 이해 Servlet(서블릿), JSP

JEONG SUJIN·2023년 2월 19일
0

웹 애플리케이션을 작성하려면 우선 브라우저와 서버의 관계를 이해해야만 한다.
서블릿과 jsp가 어떤과정을 통해서 브라우저에 데이터를 전달하고,
브라우저에서 이를 어떤식으로 사용하는지 알아보기

Request(요청) / Response(응답)

- GET 방식 : 주소창에 직접 원하는 데이터를 적거나 링크를 클릭해서 호촐

원하는 웹의 주소를 호출할 때 필요한 데이터를 '?'와 '&=,"를 이용해서 같이 전송하는 방식
주소와 필요한 데이터를 한번에 같이 보내기 때문에 단순링크로 처리되므로 다른사람들에게 메신저나 SNS등을 통해서 쉽게 공유가 가능하다.
GET방식은 주로 특정한 정보를 조회하는 용도로 사용된다.

- POST 방식 : 입력화면에서 필요한 내용을 작성한 후 '전송'과 같은 버튼등을 클릭해서 호출

주소와 데이터를 따로 보내는 방식. 보통 회원가입이나 로그인 등의 처리가 있다.
POST방식은 웹 화면을 통해서 실제 처리가 필요한 작업을 하기위해서 사용한다.


브라우저에서 서버에 앞선 방식으로 데이터를 요구하는 것을요청(Request) 이라하고, 서버는 이에 대한 응답(Response) 데이터를 만들어서 브라우저로 보내게 된다.

서버에서는 브라우저로 응답을 보내는데 서버에서는 이를 정적인 데이터인지 동적인 데이터인지에 따라서 다르게 처리한다.

- 정적(static)데이터

항상 동일하게 고정된 데이터를 전송하는 방식으로 주로 파일로 고정된 HTML,CSS, 이미지 파일 등의 데이터

- 동적(dynamic)데이터

매번 필요할 때마다 다른 데이터를 동적으로 구성해서 전송하는 방식.
예를 들어 메일함처럼 상황에 따라 동적으로 서버에서 데이터를 만들어 보내는 방식이라서 서버 사이드 프로그램(Server Side Programming) 이라고 한다.

항상 같은 정적 데이터를 보내느 역할만을 수행하는 서버는 '웹서버(Web Server)'라 칭하고,
동적 데이터를 만들어 보내는 경우는 '웹 어플리케이션 서버(Web Application Server, WAS)' 라 한다.

톰캣의 경우 엄밀하게도 WAS로 보는 것이 좋지만, 대부분의 WAS는 웹서버기능도 같이 포함하므로 실습하는 과정에서 이미지나 CSS/JS 파일과 같은 정적인 지원들과 서블릿/JSP 같은 동적인 자원 모두를 처리할 수 있다.

비연결성

웹의 특성상 여러 명의 사용자가 브라우저를 통해서 서버를 호출하는 구조이기 때문에 서버에서는 최대한 많은 사용자에게 서비스를 제공하기 위한 고민이 필요하다.

HTTP는 이를 위해서 '비연결성' 라는 방식을 선택하는 데 이는 하나의 요청과 응답을 처리한 후에 연결을 종료한다는것을 의미한다.
예를 들어 특정한 웹 페이지의 최신 결과를 다시 확인하기 위해서 '새로고침'을 해본 경험이 한 번쯤은 있을 것 이다.
우리가 '새로고침'을 해야하는 이유는 이미 브라우저와 서버의 연결이 끝났기 때문에 다시 연결하지 않으면 과거의 결과만이 남아 있기 때문에

서버에서는 하나의 요청을 빨리처리하고 연결을 종료해서 다음 요청을 받을 수 있다면 적은 리소스를 이용해서 많은 수의 요청들을 처리할 수 있다는 장점이 있다.

자바서버사이드 프로그래밍

서버 사이트 프로그래밍은 서버쪽에서 프로그래밍을 통해 데이터를 처리할 수 있도록 구성하는 것을 의미하는데, 개발 할 때는 다음과 같은 점들을 고려

  • 동시에 여러 요청이 들어온다면 어떻게 할까?
  • 서버에서 문제가 생기면 이를 어떻게 처리해야 하는가?
  • 어떤 방법으로 데이터 전송을 최적화할 수 있을까?
  • 분산환경이나 분산처리와 같은 문제들은?

만일 새로운 서비스를 개발할 때마다 이런 고민을 새로 해야 한다면 엄청나게 많은 개발 비용과 시간을 소모해야만 한다. 자바의 경우 이러한 처리를 JavaEE라는 기술 스텍으로 정리해 두었고, Servletrhk JSP는 JavaEE의 여러 기술 중 하나다.

서블릿(Servlet) 기술

Java EE 기술 스텍은 엄청나게 방대하고 기술들 역시 많은 종류가 존재한다.
이 중에서 가장 기본적인 기술이 서블릿과 JSP라고 할 수 있다.

서블릿 기술은 쉽게 말해서 서버에서 동적으로 요청과 응답을 처리할 수 있는 API들을 정의한 것이라고 할 수 있다.

서블릿을 지원하는 환경에서 개발자들은 서블릿에서 제공하는 API를 이용해서 코드를 작성하고 이를 설정하는 방식으로 서블릿 프로그램을 작성하게 된다.

JSP는 근본적으로 서블릿과 같은 원리지만 좀 더 HTTP을 쉽게 이용할 수 있는 방식으로 코드를 작성할 수 있기 때문에 '서블릿코드를 이용한처리, JSP로는 화면개발'과 같이 역할을 분담해서 개발하는 것이 일반적이다.

서블릿의 실행은 톰캣과 같이 서블릿을 실행할 수 있는 환경에서 실행이 가능한데 이를 '서블릿 컨테이너' 라고 하며, 과거에는 서블릿 엔진이라고 용어를 사용했다고 한다. 현재는 톰캣이 서블릿 컨테이너' 역항을 하고 있다.

서블릿 코드를 실행하는 주체는 톰캣과 같은 서블릿 컨테이너이므로, 일반 자바 프로그램과 비교했을 때 다음과 같은 점들이 달라진다.

  • 객체를 생성하거나 호출하는 주체는 사용자가 아닌 서블릿컨테이너가 하게 된다.
  • 서블릿 클래스에서 생성하는 객체의 관리 자체가 서블릿 컨테이너에 의해서 관리된다.
  • 서블릿/JSP의 코드개발은 기본적인 자바API와 더불어 서블릿 API도 같이 사용해야 한다.

프로젝트 디렉토리 구조

HelloServlet.java

프로젝트 생성 시에 만들어진 HelloServlet의 코드
import의 경우 javax로 시작하는 서블릿 관련 API를 사용하고 있는 것을 볼 수 있다.

HelloServlet 클래스의 클래스 선언 자체에 HttpServlet이라는 부모 클래스가 지정되어 있다.

내부에는 init(), doGet(), destroy()가 작성되었는데, 이를 서블릿 API에서 지정된 메서드이다.

호출의 주체는 개발자가 아닌 서블릿 컨테이너가 서블릿들을 관리하면서 호출한다. 이러한 메서드들은 일반적으로 서블릿의 라이프 사이클 이라고 한다.

package org.sujin.w1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="heeloServlet" , value="/hello-servlet")
public class HelloServlet extends HttpServlet {
	
	private String message;
	
	public void init() {message = "Hello World !";}
	
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.setContentType("text/html");
		
		//Hello	
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<h1> " +  message + "</h1>");
		
		out.println("</body></html>");
	}
	
	
	public void destroy() {
		
	}	
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> <%= "Hello World" %></h1>

<a href="hello-servelt">hello-servelt</a>
</body>
</html>

JSP 기술

JSP는 'Java Server Page'의 약자로 서블릿 기술과 동일하게 서버에서 동적으로 데이터를 구성하는 기술. 특이하게도 서블릿이 있는데도 불구하고 '동일한 목적'으로 JSP가 제공되는 이유는 두 기술의 목적 자체가 좀 다르기 때문.

서블릿 코드와 JSP 코드를 비교해보면 이 차이가 명확하게 보인다.

* Servlet의 일부

* JSP의 일부

JSP 기술은 서블릿과 달리 HTML코드를 그대로 이용하고 필요할 때 약간의 자바코드를 넣는 반면에 서블릿 코드는 자바 코드를 이용해서 HTML문자열을 만들어내는 방식의 차이가 있다.

JSP코드는 자바 코드가 아님에도 서블릿과 동일하게 처리되는데 이것은 사실 JSP파일도 서블릿코드로 변환되어서 컴파일되고 실행되기 때문.
JSP파일은 필요한 순간에 자바파일로 생성되고, 이를 컴파일해서 class파일로도 만들어진다.

JSP는 서블릿 기술과 같은 목적이지만, 브라우저에 보내는 html 데이터를 만들어내는데 좀 더 특화 된 기술이다.

  • 서블릿/JSP 모두 JavaEE 스텍의 일부
  • 서블릿/JSP를 실행하기 위해서는 서블릿 컨테이너가 필요함
  • 서블릿 컨테이너가 서블릿/JSP 객체를 생성하고 생명주기를 관리함
  • JSP는 내부적으로 서블릿과 같은 방식의 코드로 변환됨
  • JSP는 HTML내에 자바코드를 추가하는 방식이고, 서블릿방식은 자바코드안에 HTML코드를 추가하는 방식이다.
profile
기록하기

0개의 댓글