Servlet과 JSP에 대해 공부해보자 ❕
1. 개요
Servlet과 JSP 모두 동적 콘텐츠를 만들거나 데이터 처리 수행을 위해 사용되는 웹 애플리케이션 개발 기술이다.
초기 정적 컨텐츠만 제공하던 웹 서버에서 동적 콘텐츠를 제공하기 위한 목적으로 *CGI가 등장했다. CGI 프로그램은 서버에서 프로세스 단위로 실행되기 때문에 사용자의 요청이 많아질수록 서버에 부하가 생겼고, 이에 따라 스레드 단위로 실행하여 서버 부하를 줄이고 성능을 개선한 Servlet이 등장했다.
Servlet은 순수 Java 코드로만 이루어진 웹 서버용 클래스이다. 따라서 Servlet이 수정된다면 Java 코드를 다시 컴파일한 후 빌드해야 하는 번거로움이 있었고, 이런 한계를 보완하기 위해 JSP가 등장했다.
(CGI → Servlet → JSP 순으로 등장)
JSP는 서블릿 기반의 서버 스크립트 기술로, HTML안에 Java 코드를 작성해 동적인 컨텐츠를 생성한다. JSP는 WAS에 의하여 Servlet 클래스로 변환되고, Servlet과는 달리 변경되더라도 컴파일 과정이 필요 없다.
초기 자바 웹 개발은 서블릿을 이용했다. 이후 JSP가 등장하면서 이를 이용하다가 결국 Servlet은 비즈니스 로직(Controller)을 JSP는 프레젠테이션 로직(View)을 담당하도록 분리해 개발하는 방식으로 발전했다.
* CGI (Common Gateway Interface) ?
웹 서버와 외부 프로그램 간의 통신 규약.
CGI 자체는 웹 서버와 외부 프로그램이나 스크립트가 상호작용할 수 있게 해주는 규약이며, CGI를 따라 웹 서버와 상호작용하는 프로그램을 CGI 스크립트(CGI 프로그램)라고 한다.
CGI & WSGI & ASGI
CGI, WSGI, ASGI 용어의 개념을 정리해보자 ❕ 다음 용어들을 공부하기 전에 Web Server와 WAS에 대한 개념을 잡고 있으면 이해가 쉽다.<figure id="og_1713242543272" contenteditable="false" data-ke-type="opengraph" data-k
chchaego.tistory.com
2. Servlet
서블릿은 동적 페이지를 만들 때 사용되는 Java 기반의 웹 애플리케이션 개발 기술이다. 클라이언트의 요청과 그에 대한 응답의 흐름을 간단한 메서드 호출만으로 쉽게 다룰 수 있게 해준다.
서블릿은 서버에서 실행되다가 클라이언트로부터 요청이 오면 해당 기능을 수행한 후 클라이언트에게 결과를 전송한다.
특징
- Java 코드 안에 HTML 코드를 삽입해 작성
- HTML 코드는 문자열(
println(””)
)로 작성 - Java 스레드를 이용해 동작
- MVC 패턴에서 Controller로 이용
- HTTP 프로토콜 서비스를 지원하는
javax.servlet.http.HttpServlet
클래스를 상속한다. - 코드가 수정된다면 재컴파일해야 한다.
예시
@WebServlet("/test")
public class Test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String username = "chaego";
out.println(
"<!DOCTYPE html>" +
"<html><body><div>" +
"<span>이름 : </span>" +
"<span>" + username + "</span>" +
"</div></body></html>" +
)
out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
}
}
Servlet Container
서블릿 컨테이너는 서블릿을 관리해주는 역할을 하며, 클라이언트의 요청에 따라 서블릿을 수행해 동적인 페이지를 반환해주는 소프트웨어 모듈이다. 서블릿을 만들면 서블릿의 실행과 제어는 서블릿 컨테이너가 하는 것이다.
ex) Tomcat
역할
- 웹 서버와의 통신 지원
- 소켓을 만들고 listen, accept 등의 일을 구현해야 하는데, 컨테이너가 이를 API로 제공해준다.
- 서블릿 생명주기 관리
- 서블릿 클래스를 로딩하여 인스턴스화하고, 초기화 메서드 호출과 요청에 해당되는 메서드 등을 호출한다.
- 멀티쓰레드 지원 및 관리
- 요청이 올 때마다 자바 스레드를 생성하는데, 요청이 끝나면 스레드를 알아서 소멸시켜준다.
- 선언적인 보안 관리
- 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현하지 않고, 특정 XML파일에 기록해 설정이 가능하다.
Servlet 동작 과정
- 웹 서버가 사용자로부터 서블릿에 대한 요청을 받으면 서블릿 컨테이너(WAS)에게 넘긴다.
- 요청을 받은 컨테이너는 HttpServletRequest와 HttpServletResponse 객체를 만든다.
- web.xml을 확인해 어느 서블릿에 대한 요청인지 확인하고, 해당 서블릿 인스턴스 생성 여부를 확인하여 없으면
init()
을 호출한다.- `init()`은 처음 한 번만 실행되며, 실행 중 서블릿이 변경된 경우 기존 서블릿을 제거하고 다시 `init()`을 실행한다.
- 컨테이너에 스레드를 생성해
service()
를 호출하고, 요청에 해당하는 메서드(doGet()
ordoPost()
)를 실행한다. - 해당 메서드를 실행해 결과를 웹 서버에 넘기고, 웹 서버는 사용자에게 전달한다.
- 응답을 처리하면 HttpServletRequest와 HTTPServletResponse 객체를 제거한다.
3. JSP (Java Server Page)
서블릿을 이용하면 자바에 대한 지식이 필요하고 화면 구현 시 문자열 형태로 HTML을 작성하기 때문에 불편함이 있었다. 이런 점을 보완하기 위해 간편하게 동적 페이지를 만들기 위한 서블릿 기반의 서버 스크립트 기술인 JSP가 등장했다.
특징
- HTML 코드 안에 Java 코드를 삽입해 작성
- Java 코드는
<% 소스코드 %>
또는<%= 소스코드 %>
형태로 작성 - JSP 파일은 서블릿으로 변환되어 실행된다.
- ^JSP로 만든 HTML이 서블릿 println(””) 형태로 변환된다.^
- JSP가 서블릿으로 변환되는 과정은 한번만 일어난다.
- Servlet과 달리 코드가 수정되도 WAS에서 자동으로 빌드하기 때문에 재컴파일 할 필요가 없다.
- MVC 패턴에서 View로 이용
예시
<!DOCTYPE html>
<html>
<body>
<div>
<span>이름 : </span>
<span><%=request.getParameter("user_name")%></span>
</div>
</body>
</html>
jsp 코드는 결국 Servlet으로 변환되는데, 위에서 작성한 Servlet 코드와 유사한 형태로 변환되어 반환된다.
JSP 동작 과정
- 웹 서버가 사용자로부터 *.jsp 페이지에 대한 요청을 받으면 JSP 컨테이너에게 넘긴다.
- 컨테이너는 해당 *.jsp 파일을 서블릿으로 변환하여 컴파일한다.
- 서블릿 인스턴스는 매 요청마다 생성되는 것이 아니라 한 개의 인스턴스를 재사용한다.
- 컨테이너는 변환된 서블릿을 실행해 동적 페이지를 생성한다.
- 생성된 페이지는 HttpServletResponse 객체를 통해 사용자에게 반환된다.
4. MVC 패턴 - Servlet + JSP
앞서 말한 것 처럼 초기 자바 웹 개발은 서블릿을 이용했다. 이후 JSP가 등장하면서 JSP을 이용해 개발하다가, 결국 Servlet은 비즈니스 로직(Controller)을 JSP는 프레젠테이션 로직(View)을 담당하도록 분리하여 개발하는 방식으로 발전됐다.
Servlet으로 View단을 구현하려면 HTML 코드를 문자열로 작성해줘야 하기 때문에 오류도 많고 작성하는데 번거롭다는 점이 있었고, JSP로 Controller단을 구현하면 화면을 구성하는 부분과 로직을 처리하는 부분이 함께 작성돼 코드가 복잡해지고 유지보수가 어렵다는 문제가 있었다.
따라서 HTML 코드를 기반으로 구현하는 JSP를 사용하면 View을 쉽게 구현할 수 있고, Java 코드를 기반으로 구현하는 Servlet을 사용하면 Controller를 쉽게 구현할 수 있기 때문에 이 둘을 함께 사용하며 분리해 개발하는 방식으로 발전됐다.
이렇게 화면, 로직, 데이터를 나눠 개발하는 방식을 MVC 패턴이라고 한다. 애플리케이션을 세 가지 주요 부분으로 분리하여 개발하는 방법이다. 재사용성과 확장성이 용이하다는 장점이 있다.
- Model (모델) : 애플리케이션의 데이터인 데이터베이스 데이터, 상수, 변수 등을 구성하는 역할
- View (뷰) : 사용자에게 표시할 UI를 구성하는 역할
- Controller (컨트롤러) : 사용자의 입력을 받아 처리하고, 모델과 뷰 사이의 상호작용을 관리하는 역할
참고자료 😃
https://mangkyu.tistory.com/14
https://gmlwjd9405.github.io/2018/11/04/servlet-vs-jsp.html
https://m.blog.naver.com/acornedu/221128616501
https://velog.io/@falling_star3/Tomcat-서블릿Servlet이란
https://coding-factory.tistory.com/742
'Web' 카테고리의 다른 글
[Web] XSS & CSRF (0) | 2024.05.29 |
---|---|
[Web] JWT 토큰 인증 (Access Token & Refresh Token) (0) | 2024.04.07 |
[Web] Cookie & Session & Token 인증 (0) | 2024.04.06 |
[Web] 웹 스토리지 (localStorage & sessionStorage) (0) | 2024.04.02 |
[Web] Web Server & WAS (0) | 2024.03.30 |