✍ Web Server와 WAS(Web Application Server)

- Web
- 인터넷을 기반으로 한 정보를 공유, 검색할 수 있게 하는 서비스이다.
- 웹의 핵심 구성요소로는 URL(주소), HTTP(통신 규칙), HTML(내용) 등이 있다.
- Server
- 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템이다.
- Web Server
- 웹 브라우저(클라이언트)로부터 HTTP 요청을 받아 HTML 문서와 같은 정적 컨텐츠를 제공하는 프로그램이다.
- 이후 요청에 따른 비즈니스 로직 처리나 DB 연동 문제를 해결하기 위해 등장한 것이 WAS이다.
- ex. Apache HTTP Server, Microsoft IIS, NGINX 등
- 웹 브라우저(클라이언트)로부터 HTTP 요청을 받아 HTML 문서와 같은 정적 컨텐츠를 제공하는 프로그램이다.
- Web Application
- 웹 브라우저에서 실행되는 응용 프로그램이다.
- Web Application Server
- 웹 애플리케이션과 서버 환경을 만들어 동작시키는 기능을 제공하는 소프트웨어 프레임워크이다.
- 웹 애플리케이션을 실행시켜 필요한 기능을 수행하고 그 결과를 웹 서버에게 전달한다.
- php, jsp, asp와 같은 언어들을 사용해 동적인 페이지를 생성할 수 있는 서버이다.
- Web Server와 Web Container를 합친 형태이다.
- ex.Tomcat, Classfish, Websphere, JBoss, WebLogic 등
- Web Container
- JSP, Servlet을 실행시킬 수 있는 소프트웨어이다.
- 웹 애플리케이션이 배포되는 공간이다.
- 자바 환경에서는 웹 애플리케이션 컨테이너라고도 말한다.
✍ WAS(Web Application Server)에 Web Server가 포함되어 있는데 앞 단에 Web Server를 두는 이유

- 책임 분할을 통한 서버 부하 방지
- 웹 서버와 WAS의 역할을 명확히 구분함으로써 각 서버는 최적화된 작업만을 처리한다. 이를 통해 서버 부하를 최소화할 수 있다.
- 웹 서버는 정적인 컨텐츠의 처리가 특화되어 있다. 별도의 DB 조회나 복잡한 연산이 필요 없으므로 빠르게 응답할 수 있다.
- WAS는 동적인 페이지 생성이나 비즈니스 로직 처리, DB와의 통신 등을 담당한다.
- 웹 서버와 WAS의 역할을 명확히 구분함으로써 각 서버는 최적화된 작업만을 처리한다. 이를 통해 서버 부하를 최소화할 수 있다.
- 로드 밸런싱(Load Balancing)
- 서버에 도착하는 트래픽을 여러 서버에 분산시켜 각 서버에 가해지는 부하를 줄이는 기술이다.
- 해당 기술로 특정 WAS에 부하가 과도하게 집중되지 않도록 요청을 균등하게 나누어 처리할 수 있다.
- Health check
- 앞단의 Web Server는 여러 대의 WAS의 상태를 주기적으로 체크할 수 있다. 특정 WAS에 문제가 발생하면 해당 WAS로의 트래픽을 잠시 중단하고, 정상 동작하는 WAS로 요청을 전달할 수 있다.
- Healt check
- 서버에 정해진 주기(Interval)로 특정 URL에 HTTP 요청을 보내 해당 서버의 응답 상태를 확인한다.
- Interval: health check를 통해 서버 상태를 확인하는 요청을 날리는 주기이다.(default: 5초)
- Fails: 정해진 횟수만큼 연속 실패하면 서버가 비정상이라고 인지한다.(default: 1회)
- Passes: 서버가 다시 복구되어 요청이 정해진 횟수만큼 연속 성공하면 서버가 정상으로 인지한다.(default: 1회)
- 보안
- 웹 서버는 리버스 프록시 역할도 수행하여 실제 내부 구조나 서버 정보를 숨길 수 있다. 따라서 외부 공격자가 실제 WAS에 직접 접근하는 것을 방지하게 된다.
- 리버스 프록시
-
- 웹 서버 또는 WAS 앞에 위치하게 되며, 외부의 요청을 대신 받아서 실제 서비스에 전달하는 역할을 한다.
- 이를 통해 실제 서버의 정보나 구조를 외부에 노출시키지 않아 보안을 강화할 수 있다.
-
✍ 정적, 동적 프로그래밍 및 렌더링 전략

- 웹 서버에 미리 저장된 정적 리소스(HTML, CSS, JS 파일, 이미지 등)를 요청 받을 때마다 그대로 반환하는 방식이다.
- 대부분의 정보가 변하지 않으므로 서버의 부하가 적다.
- 관리자가 직접 HTML 코드를 주기적으로 업데이트해야 한다.
- 따라서 실시간 정보를 표시할 때는 적합하지 않다.
- 데이터베이스가 필요하거나 복잡한 비즈니스 로직이 필요하지 않다.

- 정적 웹 프로그래밍에서 관리자의 역할을 WAS(Web Application Server)가 수행한다.
- 클라이언트의 요청이 있을 때마다, 데이터베이스와의 상호작용을 통해 실시간 정보를 바탕으로 HTML 파일을 동적으로 생성한 후 클라이언트에게 반환한다.
- WAS는 CGI 방식과 Container 방식으로 구현할 수 있다.

- 웹 페이지의 렌더링을 서버에서 완료하고, 해당 결과인 완성된 HTML 페이지를 클라이언트에게 전송하는 방식이다.
- 사용자가 웹 페이지를 요청할 때마다 서버는 매번 새로운 HTML을 생성하여 응답한다.
- 매 사용자 요청마다 서버에서 렌더링 작업을 해야 하므로 서버에 많은 부하가 발생할 수 있다.
- 크롤러가 완성된 HTML을 직접 볼 수 있으므로, SEO(Search Engine Optimization)에 유리하다.

- 사용자가 웹 페이지를 처음 요청하면 서버는 기본적인 HTML과 JavaScript 파일만 응답한다. 클라이언트는 받은 JavaScript를 실행하여 필요한 데이터를 추가적으로 요청하고, 페이지를 동적으로 구성한다.
- 초기 페이지 로드는 느릴 수 있으나, 처음 페이지 로드 이후 필요한 부분만 변경되므로 빠르게 처리된다.
- 대부분의 렌더링 작업은 클라이언트에서 처리되므로 서버 부하가 상대적으로 적다.
✍ CGI(Common Gateway Interface) 방식


- 정의
- CGI는 초기 웹에서 서버와 외부 프로그램 간에 정보를 교환하기 위한 인터페이스이다.
- 등장 배경
- 웹 서버는 기본적으로 정적인 HTML 페이지를 반환하기 위해 설계되었다.
- 그러나 사용자의 변화하는 요청에 따라 동적으로 페이지를 생성하고 보여줄 필요성이 생겼다.
- 이를 해결하기 위해 처음으로 등장한 기술이 CGI이다.
- 동작 방식
- 각 클라이언트의 요청에 대해 새로운 프로세스를 생성하여 처리한다.
- CGI 프로그램은 특정 언어(C, Java, PHP, Python 등)로 작성되어 웹 서버에 연결된다.
- 클라이언트의 요청이 오면, 웹 서버는 해당 CGI 프로그램을 실행시켜 동적인 내용을 생성하고 응답한다.
- 단점
- 사용자 수가 급격히 늘고 기능이 복잡해지면 메모리 과부하 문제가 발생한다.
✍ Container 방식



- 등장 배경
- 기존의 CGI의 메모리 과부하 문제와 성능 이슈를 해결하기 위한 대안으로 등장한 기술이다.
- Servlet
- WAS에서 동작하는 Java 프로그램으로, 클라이언트의 요청을 받아서 처리하고, 그 결과를 클라이언트에게 응답으로 돌려주는 역할을 한다.
- Servlet은 내부적으로 CGI 통신 규약을 지켜 통신이 이루어진다.
- 또한 JSP, Spring MVC는 내부적으로 Servlet 기술을 사용하고 있다.

- Container(Servlet Container)
- Servlet이 동작할 수 있는 환경을 제공하는 서버의 일부분이다. 즉, Servlet의 실행을 관리하며, Servlet와 웹 서버 간의 통신을 중계한다. (통신 복잡성을 추상화)
- 서블릿의 생명주기(생성, 초기화, 서비스, 종료)를 관리한다.
- Servlet class 로딩: 서블릿 클래스를 메모리에 로드
- 초기화 메소드 호출: init() 메소드 호출하여 초기화 작업 수행
- 클라이언트 요청에 대한 servlet 메소드 호출: 클라이언트로부터의 요청이 있을 때 service() 메소드를 호출한다. 이 메소드 내에는 doGet(), doPost() 등의 메소드로 분기된다.
- Servlet 사용이 끝나는 시점에 garbage collection: 서블릿이 더 이상 사용되지 않을 경우 메모리에서 제거하는 작업을 수행한다. destroy() 메소드가 호출되며, 이후 Java의 Garbage Collector에 의해 메모리에서 해지된다.
- JSP를 Servlet으로 변환한다. JSP는 HTML 내에 Java 코드를 포함할 수 있는 스크립팅 언어이다.
- 각 요청에 대해 프로세스를 생성해 처리하는 것이 아니라, 하나의 프로세스 내부에 스레드 풀이라는 스레드들이 생성될 수 있는 공간을 만들어 멀티 스레드로 처리한다.
- 예시
- Tomcat, Classfish, Websphere, JBoss, WebLogic
- 동작 방식
- 하나의 웹 서비스에 대한 실행 코드(Servlet)는 하나만 메모리에 존재한다.
- 각 클라이언트 요청마다 별도의 스레드를 생성하여 처리한다. 이로 인해 효율적인 메모리 사용과 빠른 응답 시간을 제공한다.
- 예시
- Client 1이 환율 정보를 요청하면 WAS는 환율 조회 기능을 메모리에 생성한 후 데이터베이스와 연동하여 결과를 가져와서 클라이언트에게 반환한다.
- 만약 다른 클라이언트가 동일한 정보를 요청하면, 이미 메모리에 존재하는 환율 조회 기능을 이용하여 정보를 가져온다. 이로 인해 중복된 처리나 불필요한 메모리 사용을 피할 수 있다.
✍ Apache Tomcat


- 정의
- Servlet이 실행될 수 있는 Web Container(Servlet Container) 환경을 제공하는 WAS이다.
- Apache Web Server의 일부 기능과 Web Container 조합으로, Web Server의 정적 데이터 처리 기능과 동적 데이터 처리 기능 모두를 포함하고 있다.
- 특징
- 하나의 Tomcat은 하나의 JVM을 가지고 있다.
✍ Servlet API 계층 구조와 기능

- Servlet 인터페이스
- 모든 Servlet이 구현해야 하는 기본 메소드들을 정의한다.
- ex. init, service, destroy와 같은 생명 주기 메소드
- ServletConfig 인터페이스
- Servlet의 설정과 관련된 메소드들을 정의한다. 이를 통해 서블릿은 초기 파라미터 값을 얻을 수 있다.
- GenericServlet 추상 클래스
- Servlet과 ServletConfig 인터페이스를 구현하며, Servlet의 기본 구현을 제공한다.
- 특정 프로토콜에 종속되지 않는 일반적인 서블릿을 개발할 때 사용된다.
- 대부분의 메소드는 기본적으로 구현되어 있지만, service 메소드는 추상 메소드로 남겨져 있어서 하위 클래스에서 구현해야 한다.
- HttpServlet 클래스
- GenericServlet을 상속받아 HTTP 프로토콜에 특화된 서블릿을 개발하기 위한 클래스이다.
- HTTP 요청 메소드에 따라 다른 메소드를 오버라이드하여 구현할 수 있다. (ex. doGet, doPost 메소드)
✍ HttpServlet 동작 구조

- HttpServletRequest
- 클라이언트로부터의 HTTP 요청 정보를 포함하고 있다.
- HttpServletResponse
- 클라이언트에게 보낼 HTTP 응답 정보를 포함하고 있다.
- HTTP 요청 메소드에 따라 다양한 메소드를 제공한다.
- GET(doGet), POST(doPost), PUT(doPut), HEAD(doHead), DELETE(doDelete), OPTIONS(doOptions), TRACE(doTrace)
✍ Forward 기능과 sendRedirect
- Forward 기능
- 현재의 요청 객체를 다른 Servlet이나 JSP로 전달하는 방식이다.
- 서버 내에서의 리소스 간 이동을 위한 것이며, 요청 정보를 그대로 전달할 수 있다.
// RequestDispather 객체를 사용하여 요청을 전달하려는 리소스를 얻는다.
RequestDispatcher dis = request.getRequestDispatcher("포워드할 서블릿 또는 JSP");
// forward 메소드를 사용하여 요청과 응답 객체를 해당 리소스로 전달한다.
dis.forward(request, response);
- sendRedirect
- 클라이언트에게 새로운 페이지로 요청을 다시 보내도록 하는 것으로, 기존의 요청 정보를 전달할 수 없다.
// HttpServletResponse 객체의 sendRedirect() 메소드를 사용하여 클라이언트에게 새로운 페이지로 이동하도록 지시한다.
response.sendRedirect("포워드할 서블릿 또는 JSP");
✍ Binding
- Servlet 간 또는 Servlet과 JSP 간에 데이터를 공유하기 위한 기법이다.
- 바인딩된 데이터는 Request, Session, Context 수준에서 공유될 수 있다.
- HttpServletRequest
- 해당 객체에 바인딩된 데이터는 해당 요청을 처리하는 동안에만 유효하다. 즉, RequestDispatcher를 사용하여 다른 Servlet이나 JSP로 요청을 전달할 때만 바인딩된 데이터가 전달되며, 새로운 요청이 시작되면 바인딩된 데이터는 사라진다.
- HttpSession: 세션 동안 데이터에 접근 가능하다.
- ServletContext: 애플리케이션이 실행되는 동안 어떤 요청에서든 해당 데이터에 접근이 가능하다.
- HttpServletRequest
CGI와 서블릿, JSP의 연관관계 알아보기
스프링 프레임워크를 제대로 이해하기 위해 CGI와 서블릿, JSP의 연관관계를 알아봅니다.
velog.io
[Web] 웹 서버와 WAS의 개념 이해
인터넷을 기반으로 한, 정보를 공유 검색할 수 있게 하는 서비스URL(주소), HTTP(통신 규칙), HTML(내용네트워크를 통해 클라이언트에게 정보나 서비스를 제공하는 컴퓨터 시스템인터넷을 기반으로
velog.io
'Backend > Spring' 카테고리의 다른 글
| [Spring] 객체 지향과 SOLID 원칙 (0) | 2023.07.04 |
|---|---|
| [Spring] 스프링 빈과 의존관계 (1) | 2023.02.04 |
| [Spring Boot] JPA Auditing 기능 사용하기 (1) | 2023.01.17 |
| [JPA] persist와 merge 이해(차이) (0) | 2023.01.13 |
| [Spring Boot] 공부하면서 정리해가는 yml 설정 (0) | 2022.12.22 |