[서블릿]
A. 서블릿이란?
- 서블릿(Servlet)은 자바 기반의 웹 애플리케이션을 개발하기 위한 기술로, 웹 서버에서 실행되며 클라이언트의 요청을 처리하고 동적인 웹 콘텐츠를 생성한다.
- HTTP 프로토콜을 지원하며, 클라이언트의 요청에 따라 다양한 응답을 생성할 수 있다.
웹 애플리케이션를 직접 구현을 해야한다면?
위 사진에 나와있는 목로과 같이 서버 TCP/IP 연결대기 및 소켓을 연결, HTTP 메시지를 모두 파싱해서 읽기 등등 모든것을 구현을 해야한다.
서블릿을 사용함으로써 개발자는 비즈니스 로직만 개발하면 된다.
서블릿 특징:
- 플랫폼 독립성: 자바로 작성되어 어떤 운영체제에서도 실행 가능하다.
- 성능 향상: 초기화 후 싱글톤으로 관리되어 반복적인 객체 생성 비용을 절약한다.
- 확장성: 다양한 기능을 추가하여 웹 애플리케이션을 확장할 수 있다.
- 보안성: 자바의 보안 모델을 활용하여 안전한 웹 애플리케이션 개발이 가능하다.
B. 서블릿 컨테이너
- 서블릿 컨테이너:
- 톰캣(Tomcat)과 같이 서블릿을 지원하는 WAS(Web Application Server)를 말한다.
- 서블릿의 실행 환경을 제공하고, 서블릿과 웹 서버 간의 통신을 관리한다.
- 생명주기 관리:
- 서블릿 컨테이너는 서블릿 객체의 생성, 초기화(init() 메서드), 요청 처리(service() 메서드), 종료(destroy() 메서드) 등 생명주기를 관리한다.
- 싱글톤 관리:
- 서블릿 객체는 싱글톤으로 관리되어, 애플리케이션 당 하나의 인스턴스만 생성된다.
- 이를 통해 메모리 효율성을 높이고, 성능을 향상시킨다.
[동시 요청 - 멀티쓰레드]
- 서블릿 객체는 누가 호출하나?
- 쓰레드가 호출한다.
- 쓰레드(Thread):
- 애플리케이션 코드를 순차적으로 실행하는 실행 단위이다.
- 자바 애플리케이션은 기본적으로 main 쓰레드에서 시작된다.
- 쓰레드가 없으면 자바 애플리케이션은 실행될 수 없다.
- 동시 처리 필요 시:
- 쓰레드를 추가로 생성하여 여러 작업을 동시에 처리한다.
요청마다 쓰레드 생성의 장단점
장점
- 동시 요청 처리: 여러 클라이언트의 요청을 동시에 처리할 수 있다.
- 리소스 효율성: 시스템 리소스가 허용하는 한 최대한의 동시 처리가 가능하다.
- 독립성 보장: 하나의 쓰레드가 지연되어도 다른 쓰레드는 영향을 받지 않는다.
단점
- 높은 생성 비용: 쓰레드를 생성하는 데는 많은 비용이 소요된다.
- 컨텍스트 스위칭 비용: 쓰레드 간 전환 시 추가적인 CPU 자원이 필요하다.
- 리소스 한계: 무제한으로 쓰레드를 생성하면 CPU와 메모리의 한계를 초과하여 서버가 다운될 수 있다.
쓰레드 풀(Thread Pool)
- 필요성: 요청마다 쓰레드를 생성하는 단점을 보완하기 위해 사용된다.
- 특징:
- 미리 쓰레드를 생성하여 풀에 보관하고 관리한다.
- 쓰레드 풀에서 생성 가능한 쓰레드의 최대치를 설정한다. (예: 톰캣은 기본적으로 최대 200개)
- 사용 방법:
- 쓰레드가 필요하면 풀에서 가져와 사용하고, 작업이 끝나면 다시 풀에 반납한다.
- 최대 쓰레드 사용 중일 때:
- 추가 요청은 거절되거나 대기열에 추가되어 순서대로 처리된다.
- 장점:
- 쓰레드 생성 및 소멸에 따른 오버헤드 감소로 응답 속도가 향상된다.
실무 팁
- 최대 쓰레드 수 튜닝:
- 너무 낮게 설정하면: 동시 요청 처리량이 감소하여 클라이언트 응답 지연이 발생한다.
- 너무 높게 설정하면: 시스템 리소스 한계를 초과하여 서버가 불안정해질 수 있다.
- 장애 발생 시 대처 방법:
- 클라우드 환경: 서버 인스턴스를 추가하여 대응하고, 이후에 설정을 최적화한다.
- 온프레미스 환경: 기존 서버의 설정을 조정하고 성능 튜닝을 실시한다.
- 적정 쓰레드 수 결정 방법:
- 애플리케이션의 특성, 로직의 복잡도, 시스템 리소스 상황 등을 고려한다.
- 성능 테스트를 통해 최적의 값을 찾아야 한다.
- 성능 테스트 도구: Apache ab, JMeter, nGrinder 등을 활용한다.
WAS의 멀티쓰레드 지원의 핵심
- 멀티쓰레드 처리는 WAS가 담당하므로, 개발자는 쓰레드 관리에 신경 쓸 필요가 없다.
- 개발자는 싱글 쓰레드 프로그래밍처럼 코드를 작성하면 된다.
- 주의사항:
- 싱글톤 객체(서블릿, 스프링 빈 등)를 사용할 때 동시성 문제가 발생하지 않도록 주의해야 한다.
- 공유 자원을 사용할 때는 동기화 처리가 필요하다.
[HTML, HTTP API, CSR, SSR]
A. 정적 리소스
- 정적 리소스:
- 변경되지 않는 고정된 콘텐츠인 HTML 파일, CSS, JavaScript 파일, 이미지 등을 제공한다.
- 클라이언트의 요청에 대해 서버는 해당 파일을 그대로 응답한다.
B. HTTP API
- 데이터 전달:
- HTML이 아닌 데이터(주로 JSON 형식)를 전달한다.
- 사용 사례:
- UI 클라이언트: 웹 또는 모바일 앱에서 서버와 데이터 통신 시 사용한다.
- 서버 간 통신: 마이크로서비스 아키텍처에서 서비스 간 데이터 교환 시 활용한다.
백엔드 개발자가 고민해야 할 사항
- 정적 리소스 제공 방식:
- 효율적인 정적 파일 서빙을 위한 웹 서버 설정 (예: 캐싱, 압축)
- 동적 HTML 페이지 제공 방식:
- 서버 사이드 렌더링을 통한 동적 페이지 생성 방법
- 템플릿 엔진 선택 및 활용 (예: JSP, Thymeleaf)
- HTTP API 설계 및 제공:
- RESTful API 설계 원칙 준수
- 보안 및 인증 방법 구현
C. 서버 사이드 렌더링(SSR)과 클라이언트 사이드 렌더링(CSR)
- SSR (Server-Side Rendering):
- 서버에서 완전한 HTML 페이지를 생성하여 클라이언트에 전달한다.
- 장점:
- 초기 로딩 속도가 빠르며, SEO에 유리하다.
- 단점:
- 서버에 부하가 증가할 수 있다.
- CSR (Client-Side Rendering):
- 기본 HTML과 자바스크립트를 전달하고, 클라이언트 측에서 동적으로 페이지를 구성한다.
- 장점:
- 사용자 경험이 향상되고, 부드러운 화면 전환이 가능하다.
- 단점:
- 초기 로딩 시간이 길어질 수 있으며, SEO에 불리할 수 있다.
- 관련 기술:
- React, Vue.js 등 프론트엔드 프레임워크를 사용하여 CSR을 구현한다.
- 이러한 프레임워크들은 SSR과 CSR을 동시에 지원하는 도구도 제공한다. (예: Next.js, Nuxt.js)
출처 및 참고문헌
'Web' 카테고리의 다른 글
[Spring] 예제를 통해 프록시(Proxy), 데코레이터(Decorator) 패턴에 대해 알아보기 (0) | 2025.01.02 |
---|---|
[Spring] 예제를 통해 전략 패턴(Strategy Pattern)에 대해 알아보기 (0) | 2025.01.02 |
[Spring] 예제를 통해 템블릿 메서드 패턴에 대해 알아보기 (0) | 2024.12.31 |
[Spring Boot] Test 클래스에서 lombok을 사용하고 싶을 때 (1) | 2024.11.18 |