결국 무엇이든 해내는 사람

Spring Servlet 쉽게 쉽게 알아보자 본문

본격적인 공부 노트/Spring

Spring Servlet 쉽게 쉽게 알아보자

kkm8257 2024. 2. 18. 22:46
반응형

 

서블릿(Servlet)


"자바로 구현된 CGI(Common Gateway Interface)"

"클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그램"

"Tomcat이 이해할 수 있는 순수 Java코드로 이루어진 서버용 클래스"

 

 

 

근데 CGI(Common Gateway Interface)가 뭔데?


데이터 요청 흐름

 

유저가 웹 페이지를 요청했을 때 서버는 요청된 페이지를 보내준다. 그런데 유저가 form을 채운뒤에 페이지를 요청한다고 가정해보자. 이런 경우 애플리케이션에서 로직을 수행해야한다. 즉, 웹 서버는 정보를 처리해줄 애플리케이션 프로그램에 정보를 보내고 메시지를 반환받아야한다. 만약 회원가입을 위한 데이터를 애플리케이션에 전달한다면 애플리케이션에서는 회원가입 로직을 수행 후 결과를 서버에 다시 보내준다. 이 때 웹 서버와 애플리케이션(프로그램)간의 교환 방식CGI라고한다.

웹 서버가 특정 언어로 쓰여진 구체적인 프로그램에 의존하는 것이 아니라 CGI라는 인터페이스에 의존하고 있다는 것은 

"어떤 언어든 이 인터페이스를 구현하기만 한다면 웹서버와 소통할 수 있음"을 의미한다.

 

Servlet 등장 이전에는 CGI가 Server-side-Programming에 주를 이루었으나 아래와 같은 단점들로 인해서 Servlet이 등장하게 되었다.

CGI를 사용할 때의 요청 처리

- 매번 request가 올 때마다 새로운 Process를 생성한다. 이는 요청이 많지 않던 옛날 시절에는 문제가 되지 않았다.

- 그림에서 볼 수 있듯, 클라이언트 수가 증가하면 응답을 보내는데 더 많은 시간이 걸린다. 각 요청에 대해 새로운 Process를 갖기 때문이다. 이는 DB Connection도 마찬가지로 요청 수 만큼 생성된다는 이야기

- HTTP 요청마다 프로세스를 생성하므로 서버 메모리를 많이 잡아먹는다.

- C, C++, Perl과 같은 Platform 종속 언어를 사용한다.

 

Process와 Thread

 

 

Servlet의 Life Cycle


 

 

서블릿의 라이프사이클

 

서블릿의 생성주기(Life Cycle)는 아래와 같다.

  • init() : 클라이언트 요청이 들어오면 서블릿 컨테이너는 서블릿이 메모리에 있는지 확인하고 메모리에 없다면 init() 메소드를 호출하여 적재한다. 매 request가 아닌 처음 load될 때 한번 실행 된다.
  • service() : 클라이언트 요청에 따라서 service() 메소드를 통해 요청에 대한 응답이 doGet(), doPost()로 분기된다. 매 request마다 새로운 thread에 의해 호출된다.
  • destroy() : 서블릿 컨테이너가 서블릿에 종료 요청을 하면 destroy() 메소드가 호출된다. destroy()메소드가 수행된 서블릿 인스턴스는 GC에 의해 제거된다.

 

Servlet과 일반 자바 객체의 차이점


JVM에서 호출하는 방식은 서블릿과 일반 클래스 모두 같지만, 서블릿은 main() 메소드로 직접 호출되지 않고 "웹 컨테이너(Servlet Container)"에 의해 실행된다. 컨테이너가 web.xml을 읽고, 서블릿 클래스를 클래스 로더에 등록하는 절차를 밟는다.

 

 

 

Servlet Container는 뭔데?


Servlet이라는건 자바 코드로 웹을 할 수 있는 것을 말하고, Servlet Container는 자바코드로 웹을 할 수 있는 것을 모아놓은 것이다.

Servlet Container는 구현되어 있는 Servlet 클래스의 규칙에 맞게 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명 주기를 담당한다.

Servlet Container는 클라이언트의 요청을 받고 응답 할 수 있도록 웹 서버소켓으로 통신한다.

 

Tomcat은 웹 애플리케이션(WAS)중 하나로 Servlet Container 기능을 제공하고 있다. 인터넷에서는 Tomcat을 서블릿 컨테이너라고 많이 부르지만 엄밀히 말하면 내장 웹 서버등의 부가 기능도 제공하므로 WAS로 부르는 것이 좋다.

 

 

 

Servlet Container가 있으면 뭐가 좋은데?


1. 통신 지원

서블릿과 웹 서버가 통신할 수 있는 손쉬운 방법을 제공한다. 만약 form을 통해 입력받은 요청을 처리한다고 가정하면 아래와 같은 많은 작업들이 수반된다.
서블릿 컨테이너는 개발자가 비즈니스 로직에 집중할 수 있도록 해당 과정을 모두 자동으로 해주기 때문에 개발자는 HTTP 요청 메시지로 생성된 Request를 읽어서 비즈니스 로직을 개발하고 response를 반환하면 된다.

유저가 Form으로 데이터를 전달한 경우

 

2. 서블릿의 생명 주기 관리

서블릿 클래스를 로딩해 인스턴스화하고 초기화, 서블릿 메소드 호출, 제거 등의 생명주기를 관리해준다.

 

3. 멀티 스레딩 관리

서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드를 하나 생성하여 다중 처리하고 실행이 끝나면 자동으로 종료시켜 관리한다.

 

4. 선언적 보안 관리

보안 관련 설정을 xml 문서를 활요하여 관리하므로 개발자가 보안 설정을 바꾸더라도 자바 코드에 영향이 가지 않는다.

 

5. JSP 지원

JSP 코드를 자바 코드로 변환해준다.

 

 

 

Servlet의 동작과정


동작과정

WAS 안에는 Web Server와 Servlet Container가 존재한다.

 

1. 웹 브라우저(클라이언트)에서 웹 서버에 HTTP 요청을 보내면, "Web Server"는 받은 HTTP 요청을 "WAS의 Web Server"로 전달한다.
2. "WAS의 Web Server"는 HTTP 요청을 "Servlet Container"에 전달한다.
3. "Servlet Container"는 HTTP 요청 처리에 필요한 "Servlet Instance"가 힙 메모리 영역에 있는지 확인한다. 존재하지 않는다면, "Servlet Instance"를 생성하고 해당 "Servlet Instance"의 init() 메소드를 호출하여 "Servlet Instance"를 초기화한다.
4. "Servlet Container"는 서블릿 인스턴스의 service() 메소드를 호출하여 HTTP 요청을 처리하고, "WAS의 Web Server"에게 처리 결과를 전달한다.
5. "WAS의 Web Server"는 HTTP 응답을 앞 단에 위치한 "Web Server"에게 전달하고, 앞 단의 "Web Server"는 받은 HTTP 응답을 웹 브라우저(클라이언트)에게 전달한다.

 

 

 

 

Servlet의 멀티 스레딩


 

 

멀티스레딩

 

위에서도 설명했지만 Servlet Container는 요청이 올 때마다 새로운 Thread를 하나씩 생성한다.

유의할 점은 "요청이 올 때마다 Servlet의 Thread를 생성하는 것이지 Servlet의 Instance 자체를 새로 생성하는 것이 아니다."

그리고 Servlet Instance는 "싱글톤"으로 생성되며 무상태 혹은 일기 전용상태, 동기호 처리된 구조로 설계되어야한다.

그러면 Servlet Container는 사용자 요청이 올 때마다 무한정으로 스레드를 생성할까?
그렇지 않고 내부에 Thread Pool 설정 값에 따라 전체 스레드 수를 조절한다.

 

 

반응형
Comments