백앤드 공부를 하던 도중 서버와 관련된 헷갈리는 용어가 많아 이번기회에 정리하려 한다.
0. 웹서버 등장 배경
초창기엔 정적 웹사이트만 존재하여 모든 페이지의 모든 내용이 정해져 있어 사용자의 요구를 맞출 수 없었다.
이에 대해 동적인 웹사이트가 등장하였고, 이때 등장한 것이 CGI(Common Gateway Interface)였다.
CGI는 서버에서 수행 중인 프로세스 사이에 정보를 주고받는 규칙을 의미했다.
CGI는 Perl, C, C++ 등의 언어를 지원하면서 웹 서버를 통해 요청을 받고 실행 결과를 다시 웹 서버를 거쳐
클라이언트의 브라우저로 보낼 수 있는 기능을 지닌다.
하지만 CGI는 각각의 클라이언트의 요청에 대해서 독립적인 별도의 프로세스가 생성하기 때문에 ,
프로세스가 많아질수록 시스템에 많은 부하가 걸리게 된다. 또한 웹 서버는 같은 요청이라도 웹 브라우저에서 받은 요청 개수만큼 같은 프로세스를 생성하게 된다.
이러한 단점으로 인해 개발이 어렵고, 유지 보수가 어려웠다.
CGI를 대안으로 나온 것이 스크립트 엔진을 활용한 방법이었다.
스크립트 엔진을 활용한 방식은 다수의 웹 브라우저가 같은 요청을 하더라도 스크립트에 대한 프로세스를 하나만 수행하고,
각 웹 요청에 대해 스레드로서 처리하는 방식이었다.
실제 프로그램 수행은 프로세스를 생성하여 메모리에 띄어놓고 각 요청에 대한 스레드를 새로 생성하여
프로세스를 한 번씩 지나가게 하여 원하는 응답을 얻어내는 기법을 활용한다는 것이다.
이러한 방식은 CGI 방식에 비하여 CPU 점유도나 메모리 점유도에 있어 효율적이며,
이를 발전시켜 안정적인 웹 서비스를 제공할 수 있는 웹 애플리케이션 서버 ( WAS )로 발전하였다.
1. 웹서버와 WAS
- 전체적인 구조
- 웹서버
웹 서버란 하드웨어, 소프트 웨어 두 가지로 나뉜다.
1 ) 하드웨어 : 웹 서버가 설치되어 있는 컴퓨터
2 ) 소프트웨어 : 웹 브라우저 클라이언트로 부터 HTTP 요청을 받아들이고 HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
웹 서버란 클라이언트가 웹 브라우저에서 어떠한 페이지 요청을 하면 웹 서버에서 요청을 받아 정적 콘텐츠를 제공하는 서버이다.
동적인 컨텐츠를 생성하거나 서버 상에 데이터를 저장하지 못하기 때문에,
동적인 컨텐츠 제공을 위해 WAS로 클라이언트의 요청을 전달하고 처리한 결과를 클라이언트에게 응답하는 역할도 수행한다. ( Proxy )
대표적인 웹 서버 Apache, Nginx 등이 있다.
- WAS ( Web Application Server )
웹 상에서 HTTP을 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들에어로서 , 주로 동적 콘텐츠를 수행하며. 데이터베이스 서버와 같이 수행한다.
동적 컨텐츠 수행, 즉 DB 조회나 로직 처리를 위해 만들어진 Application Server이다.
웹 서버는 Application 서버와 직접적으로 통신하지 못해 중간 다리 역할로 WAS (tomcat)를 두고 각자 맞는 방식으로 요청을 변환해주는 역할을 한다.
클라이언트 요청은 Servlets , JSP로 구성되어 있다.
정리해보면 WAS는 요청한 페이지의 로직이나, DB 접속 기능을 제공한다.
대표적인 WAS로는 Apachi Tomcat, Weblogic 등이 존재한다.
지금까지 웹 서버, WAS에 대해 알아보았는데 정리하면
웹 서버를 통해 정적인 파일 ( 이미지 등 media 파일, static 파일)들은 WAS를 거치지 않고 제공할 수 있다. 이를 통해 서버의 부담을 줄여준다.
정적 콘텐츠뿐만 아니라 동적 콘텐츠도 제공하기 위해 WAS를 통해 요청에 맞는 데이터를 DB에서 가져와 비즈니스 로직에 맞게 제공하여 자원을 효율적으로 사용할 수 있다.
2. Servlet
서블릿은 클라이언트 요청에 대해 동적 콘텐츠를 생성하는 자바 언어 기반의 웹 컴포넌트이다. 다른 자바 기반의 컴포넌트들처럼, 서블릿은 OS로부터 독립적인 자바 클래스들이다.
웹 클라이언트로부터 요청과 응답을 웹 서버를 통해 넘겨받고 서블릿 컨테이너에 의해 실행되어 상호작용을 한다.
즉, 자바로 구현된 Application Server이다.
서블릿 동작 과정
1. 클라이언트가 웹 서버에 HTTP 요청을 보낸다. ( HTTP Request )
2. 웹 서버는 받은 요청을 서블릿 컨테이너( WAS )에 넘겨주고, 서블릿 컨테이너는 요청을 처리하게 된다.
3. 서블릿 컨테이너는 사용자가 요청한 URL로 어떤 서블릿을 호출할지 결정하고, 요청과 응답에 대응되는 객체들 (HttpServletRequest, HttpServletResponse)를 생성하고 불러온다.
4. 서블릿은 HTTP 응답을 통해 요청받은 객체 (HttpServletResponse)를 클라이언트로 넘겨주고 두 객체 (HttpServletRequest, HttpServletResponse)를 모두 소멸시킨다. Thread는 종료되지만 Servlet 객체는 메모리에 계속 유지된다.
HttpServletRequest, HttpServletResponse 객체
- HttpServlet을 상속한 클래스의 doGet(), doPost() 메서드 등의 parameter로 넘어온다.
- HttpServletRequest
클라이언트의 요청 정보(헤더 정보, 파라미터, 쿠키, URI, URL)를 저장한다.
- HttpServletResponse
HTML 코드 및 데이터를 담아서 반환할 수 있다.
- 서블릿 라이프 사이클
1. 웹 서버가 구동되면 서블릿 파일들은 모두 실행가능 상태로 전환되고 컨테이너가 해당 서블릿이 메모리에 있는지 확인한다.
2. init() 메서드에 의한 초기화 ( 클라이언트 최초 요청 시에 한 번만 실행)
3. service(request, response) 메서드 (doGet(), doPost(), doHead().. ) 실행 -> Spring에서 Controller 부분이 실행되고 종료된다.
4. destory() 메서드에 의해 종료가 되고 메모리를 해제한다. ( 웹 서버가 종료될 때 한 번만 실행 )
- Servlet Container
서블릿들을 모아서 관리하고 웹 서버와 소켓으로 통신하는 역할을 한다. Tomcat이 이에 해당한다.
서블릿 컨테이너의 역할
1. 웹 서버와의 통신 지원 : 서블릿 컨테이너는 웹 서버가 쉽게 통신할 수 있게 해 준다. 소캣기능들을 API로 제공하여 복잡한 과정을 생략하고, 개발자는 구현해야 할 비즈니스 로직에만 초점을 맞추면 된다.
2. 서블릿 생명주기 관리 : 서블릿 컨테이너는 서블릿의 생성, 소멸을 관리한다. 서블릿 클래스를 로딩하여 인스턴스화하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 호출한다.
3. 멀티스레드 지원 및 관리 : 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드를 하나 생성하는데, HTTP 서비스 메서드를 실행한 후 스레드는 자동으로 죽는다. 이러한 관리를 컨테이너가 하게 된다.
4. 선언적인 보안 관리 : 보안관리는 XML 배포 서술자에 기록되므로 보안적 문제로 인해 자바 소스를 수정할 일이 없다.
- JSP
서블릿이 Java Source 속에 HTML이 들어가는 형태라면, JSP는 Java Source가 HTML Source이다.
이렇게 작성된 HTML 코드는 브라우저로 전송되는 것이 아닌 , 웹 서버 내에서 실행되는 부분이다.
실질적으로 서블릿 컨테이너에 의해 서블릿으로 변환되어 사용된다.
동작 절차
1. 웹 브라우저에서 JSP페이지를 웹 서버로 요청하면, 웹 서버는 JSP에 대한 요청을 서블릿 컨테이너로 넘긴다.
2. 서블릿 컨테이너는 이를 서블릿 객체로 반환하고 요청에 대한 수행 결과를 웹 브라우저로 응답하는 과정을 거친다
'스프링' 카테고리의 다른 글
분산 시스템에서 메시지 안전하게 다루기 (0) | 2023.12.22 |
---|---|
쿠폰 발급 동시성 제어하기, 성능테스트로 성능 개선하기 (0) | 2023.11.29 |
스케줄러와 Transactional 테스트 코드에서 생긴 문제 해결하기 (0) | 2023.10.09 |
Spring WebSocket Ping / Pong (2) | 2023.03.27 |
Controller , Service , Repository 이해하기 (0) | 2022.05.19 |