본문 바로가기
[ java ]

서블릿/JSP 공부(1) - 서블릿이란? JSP, CGI, 서블릿 라이프 사이클

by 히앤님 2022. 9. 26.
반응형
SMALL

Servlet

클라이언트 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술. 즉, JAVA를 사용해서 웹을 만들기 위해 필요한 기술로, 자바 코드 안에 HTML 포함되어 있다. 클라이언트가 어떤 요청을 하면 그 결과를 다시 전송해주는 역할을 하는 JAVA 프로그램이다.

JSP

JavaServer Pages, HTML 코드에 JAVA 코드를 넣어 동적인 웹페이지를 생성하는 웹어플리케이션 도구. JSP가 실행되면 자바 서블릿(Servlet)으로 변환되며 웹 어플리케이션 서버(WAS)에서 동작되면서 필요한 기능을 수행하고 그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.

서블릿 이전에 CGI가 있었다.

서블릿의 조상인 CGI(Common Gateway Interface)라는게 있다. CGI 이전의 웹서버는 단순히 사용자가 특정 경로를 입력하면 그 경로에 해당하는 리소스만 뿌려주었다. (주소 입력하면 정적인 페이지로 이동만 시켜줌) 그런데 CGI가 나오면서 사용자가 입력값을 인자로 넣은 프로그램을 실행시키면 그 결과를 웹으로 뿌려줄 수 있게 되었다. 바야흐로 동적인 페이지를 보여주기 위해 임의의 프로그램을 실행할 수 있는 기술의 탄생이다.

CGI 이전엔 경로->정적페이지 출력만 가능했는데,
CGI는 사용자에게 입력값을 받아 동적인 페이지를 보여줄 수 있게됨.

정적인 페이지는 예를들어 기업설명 페이지, 즉 사용자에 의해 변경될 일이 없으며 똑같 내용의 페이지를 말하고, 동적인 페이지는 SNS 페이지와 같이 사용자의 좋아요와 팔로우에 따라 알고리즘을 변경하여 사용자마다 다른 페이지를 보여주는 것을 말한다.

CGI 이전까지는 말 그대로 글자와 이미지 출력이 다였지만, CGI의 탄생으로 주소 하나에도 다양한 내용을 각자의 사용자에게 보여줄 수 있게 되었다.

CGI에서 서블릿으로

CGI는 웹서버에 요청이 들어오면 각각 처리한다. 일하는 인력 많고 처리를 하나씩 맡아서 한다.

CGI의 동작방식

CGI는 브라우저에서 웹서버에 요청이 갔을 때, 각각에 대한 처리 프로세스를 만들어낸다는 단점이 있었다. 그래서 대량의 트래픽을 처리하기에는 약간 무리가 있었다.

서블릿의 동작방식

서블릿도 CGI 규칙에 따라 데이터를 주고 받는 것은 같다. 하지만 서블릿은 각 요청에 대한 프로세스를 생성하는 것이 아니라, 서블릿 컨테이너로 보내서 처리하도록 했다.


서블릿 컨테이너는 요청이 들어오면 해당 요청을 처리할 일꾼 서블릿을 설정파일(가이드문서 같은거)을 읽어서 찾은 뒤, 어떤 서블릿이 필요한지 알았으면 해당 일꾼 서블릿을 찾는다. 또한 서블릿 인스턴스(클래스를 구체화한 제품)가 있다면 그 인스턴스를 가져와서 사용하고, 없으면 생성해서 그걸 이 일꾼 서블릿에게 가져다준다.


이 서블릿 인스턴스를 요청객체 HttpServletRequest와 응답 객체 HttpServletResponse에게 인자로 넘겨주면, 해당 일꾼 서블릿이 요청에 따른 로직을 처리하고, 처리 결과를 HttpServletResponse 객체에 담아 반환한다.(일꾼은 일을 끝냈음)


처리를 마치면 요청, 응답객체들은 사라지고 사용했던 서블릿 인스턴스만 남는다. 이 서블릿 인스턴스는 소멸하지 않고 있다가 다음에 같은 요청이 들어오면 서블릿 컨테이너가 다시 일꾼 서블릿에게 보내주면서 금방금방 일처리를 해준다.

 

서블릿 컨테이너는 서블릿의 생명주기를 관리하는 객체이다. 생성, 호출, 적절한 시점의 소멸을 담당한다.

 

그럼 한 요청을 처리하는 중에 또다른 요청이 들어오면 어떻게 될까? 그럼 멀티스레드로 요청이 처리되면서 일꾼 서블릿이 여러군데에서 호출되서 여러 스레드에서 사용된다. (이곳저곳 불려간다는 말임) 문제는 스레드 생성도 비용이 많이 들고, 다른 스레드로 전환하는 것도 부하가 걸리기 때문이다.

 

따라서 WAS는 이러한 문제를 처리하기 위해 프로세스 1개가 있고 그 내부에 스레드 풀이라는 스레드들이 생성될 수 있는 공간을 만들어 스레드로 처리했다.


스레드 풀은 스레드를 미리 생성해서 스레드가 필요할 때 꺼내쓰고 반납하는 저장소이다. 개수를 제한해서 일정 이상의 요청이 들어왔을 때는 대기하도록 만들어서 대량의 요청이 들어왔을 때도 조금 더 안정성이 증가했다.
그리고 사실 비슷한 경로에 요청을 한 클라이언트들의 비즈니스 로직은 대부분 중복되는 부분이므로, 스레드 사이에 있는 공유 자원 (Code, Data, Heap)을 통해 더욱 효율적인 처리가 가능했다.

 

 

▼ 스레드와 메모리에 관한 자세한 설명이 궁금하다면?

서블릿 개발 흐름

서블릿 라이프 사이클

서블릿 라이프 사이클

  1. 서블릿은 생성 이후에 init() 메소드를 통해 초기화된다.
  2. 클라이언트가 서비스(service())로 보낸 요청들을 처리한다.
  3. 서블릿은 사용 중지된 후, destroy()를 이용해 제거된다.

서블릿 컨테이너가 서블릿 클래스를 로딩하고, 인스턴스를 생성해 생성자와 함께 자바 서블릿 객체를 생성한다. 이 후 초기화와 사용자의 요청 비지니스 로직 처리(service), 완료 후 서블릿 상태 종료 및 소멸을 서블릿 컨테이너가 담당한다.

 

이 모든 과정을 컨테이너 내부에서 스레드 단위로 요청을 처리하는데, 이 과정을 개발자가 아닌 컨테이너가 제어하는 것을 IoC (Inversion of Control)라고 한다.

반응형
LIST

댓글