📕 목차
1. Web Server
Web Server
- HTTP 기반으로 동작하며 정적 리소스(HTML, CSS, JS, 이미지 파일 등)를 클라이언트에게 제공하는 역할을 한다.
- 웹 서버는 클라이언트로부터 HTTP 요청을 받아, 정적 리소스를 응답하거나 WAS로 요청을 전달한다.
대표적인 Web Server
- NGINX: 가볍고 빠른 성능으로 유명한 웹 서버로, 리버스 프록시 및 로드 밸런서 기능도 강력하다.
- Apache HTTP Server: 오랜 역사와 다양한 모듈을 가진 웹 서버로, 높은 호환성과 안정성을 자랑한다.
2. WAS (Web Application Server)
WAS (Web Application Server)
- HTTP 요청을 받아 비즈니스 로직을 실행하고, DB와 상호작용하여 동적 데이터를 생성하는 서버이다.
- 웹 서버의 기능도 포함하고 있다.
- 클라이언트의 요청을 받아 내부 애플리케이션 로직을 처리한다.
- DB 연동, 동적 페이지 생성, 사용자 인증 등의 기능을 수행한다.
대표적인 WAS
- Tomcat: 가장 많이 사용되는 Java 기반 WAS로, Spring Boot에 내장되어 있다.
- Jetty: 가볍고 유연한 WAS로, 임베디드 형태로 많이 사용된다.
- Undertow: 고성능 비동기 기반 WAS로, Spring Boot에서 선택적으로 사용 가능하다.
* Web Server vs WAS
항목 | Web | WAS |
주요 역할 | 정적 리소스 제공 | 동적 처리, 비즈니스 로직 실행 |
코드 실행 | 불가능 | 가능 |
예시 | NGINX, Apache | Tomcat, Jetty |
3. 웹 시스템 구성 방식
WAS만 사용하는 경우
- 모든 요청을 WAS가 직접 처리
- 정적 리소스까지 WAS가 담당해 과부하 위험 존재
- WAS에 장애가 발생하면 아무 화면도 보여줄 수 없음
실제 웹 시스템 구성
- Web Server가 정적 리소스를 처리하고,
- WAS에는 비즈니스 로직 처리 요청만 전달
- 장점
- 정적/동적 처리의 역할 분리로 성능 및 안정성 향상
- 장애 시 Web Server에서 오류 페이지 제공 가능
- 필요 시 Web Server 또는 WAS만 확장(Scale-out) 가능
4. Servlet
Servlet
- Java 기반 웹 애플리케이션에서 HTTP 요청과 응답을 처리하는 객체
- HttpServlet 클래스를 상속받아 구현한다.
Servlet 동작 순서
- WAS는 HTTP 요청 메세지를 기반으로 새로운 Request, Response 객체 생성
- WAS는 만들어진 Request, Response 객체를 서블릿 컨테이너에 넘겨주며 ExampleServlet 객체 호출
- ExampleServlet에서 비지니스 로직 처리
- 응답에 필요한 정보를 개발자가 입력
- WAS는 Response 객체 정보(개발자가 입력한 정보)로 HTTP 응답 메세지 생성
개발자가 하는 일
- Request 객체에 담겨져있는 HTTP 요청 정보를 꺼내서 사용한다.
- 요청 정보(URL, Method, Message Body)를 통해 필요한 기능(비지니스 로직)을 수행한다.
- 생선된 Response 객체에 HTTP 응답 정보를 입력한다.
@WebServlet(name="ExampleServlet", urlPatterns = "/example")
public class ExampleServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
// 비즈니스 로직 처리
}
}
Servlet Container
- WAS 내부에 존재하며, Servlet을 생성/초기화/관리/실행/종료하는 역할을 한다.
- 생명주기 관리
- Servlet은 개발자가 직접 new 하지 않아도 된다.
- 컨테이너가 자동으로 인스턴스를 생성하고 관리한다.
- Servlet은 기본적으로 싱글톤으로 관리된다.
- 컨테이너의 기능
- 요청마다 Servlet 객체를 새로 만드는 것이 아니라, 하나의 객체로 여러 요청을 처리한다.
- 멀티스레드 기반 동시 요청 처리를 지원한다.
* 싱글톤이란?
- 싱글톤은 하나의 인스턴스만 생성하여 애플리케이션 전체에서 공유하는 객체 패턴
- 장점: 객체 생성 비용 절감, 일관성 있는 상태 유지
- 단점: 공유 자원 접근 시 동시성 문제 발생 가능성 → 주의 필요
5. Thread
Thread
- 애플리케이션 코드를 순차적으로 실행하는 단위이다.
- Java의 main() 실행 시 main이라는 Thread가 하나 생성된다.
- Thread는 한 번에 하나의 코드만 실행할 수 있으므로 동시 처리를 위해서는 추가적인 Thread 생성이 필요하다.
Single Thread의 한계
- 요청마다 Thread를 하나씩 처리.
- 동시에 여러 요청이 들어오면 순차 대기 발생.
- 하나의 요청에서 지연/오류가 발생하면 전체 요청이 영향을 받음 (예: Time out).
Multi Thread로 해결
- 방법 1: 요청마다 Thread 생성
- 장점
- 각 요청을 독립적으로 처리 가능.
- 단점:
- Thread 생성 비용이 높고 무제한 생성 시 리소스 부족 위험.
- Thread 간 전환(Context Switching)으로 CPU 비용 발생.
- 장점
- 방법 2: Thread Pool 사용
- 미리 여러 개의 Thread를 생성해 Pool에 저장.
- 요청 시 Thread를 꺼내 쓰고, 끝나면 다시 반납.
- 장점:
- Thread 재사용 → 빠른 응답, 자원 절약.
- 최대 Thread 수 제한 가능 → 서버 안정성 확보.
- 단점:
- 설정값이 낮으면 지연, 너무 높으면 리소스 부족.
WAS는 Multi Thread를 지원하며, 개발자가 Thread 관련 코드를 직접 다루지 않아도 된다.
6. SSR
SSR (Server Side Rendering)
- 서버에서 HTML을 완성하여 클라이언트에게 응답하는 렌더링 방식.
- Java 진영에서는 JSP, Thymeleaf 등이 사용됨.
SSR 동작 흐름
- 클라이언트가 HTML 요청
- 서버에서 로직 처리 및 DB 조회
- 조회 결과로 HTML 동적 생성
- 생성된 HTML 응답
장점
- 첫 페이지 로딩이 빠르다 (서버가 완성된 HTML 제공).
- SEO에 유리하다 (크롤러가 HTML을 그대로 수집 가능).
단점
- 요청마다 서버가 렌더링 → 트래픽 증가 시 서버 부하 커짐.
- 페이지 전환 속도가 느릴 수 있음.
7. CSR
CSR (Client Side Rendering)
- 클라이언트(브라우저)에서 자바스크립트를 사용하여 HTML을 동적으로 생성하는 방식.
- React, Vue 등의 프론트엔드 프레임워크에서 사용됨.
CSR 동작 흐름
- HTML 요청 → 텅 빈 HTML과 JS 링크 응답
- JS 파일 다운로드 및 실행
- API 요청 후 JSON 데이터 응답
- JSON 기반으로 화면 렌더링
장점
- 브라우저에서 렌더링 → 빠른 사용자 인터랙션 반응.
- 한 번 로딩 후 서버 요청 없이 빠르게 페이지 전환 가능.
단점
- 초기 로딩 시 자바스크립트 다운로드로 속도 저하.
- 크롤러가 JS를 실행하지 못하면 SEO에 불리.
8. SSR vs CSR
항목 | SSR | CSR |
렌더링 위치 | 서버 | 클라이언트 |
첫 페이지 로딩 속도 | 빠름 | 느림 |
페이지 전환 속도 | 느림 | 빠름 |
서버 부하 | 많음 | 적음 |
SEO | 유리 | 불리 |
'Spring > 강의' 카테고리의 다른 글
[📕 기초 Spring] 2-2. 어노테이션(Annotation) 이론 (0) | 2025.05.03 |
---|---|
[📕 기초 Spring] 2-1. 프레임워크와 라이브러리 (1) | 2025.05.03 |
[📕 기초 Spring] 1-3. HTTP (1) | 2025.05.03 |
[📕 기초 Spring] 용어 모음집 (0) | 2025.05.03 |
[📕 기초 Spring] 1-2. Web 기초 (0) | 2025.05.03 |