일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 취업리부트코스
- 빈 충돌
- infcon 2024
- 코딩테스트 준비
- 파이썬
- 전략패턴 #StrategyPattern #디자인패턴
- 프로그래머스 이중우선순위큐
- 프로그래머스
- 항해99
- @FeignClient
- DesignPattern
- 빈 조회 2개 이상
- 커스텀 헤더
- Python
- 인프콘 2024
- Spring multimodule
- 개발자 취업
- 단기개발자코스
- jwt
- 디자인 패턴
- 개발자부트캠프추천
- jwttoken
- 디자인패턴
- spring batch 5.0
- 1주일회고
- 구글 OAuth login
- TiL
- 99클럽
- JavaScript
- KPT회고
- Today
- Total
m1ndy5's coding blog
ABOUT SERVLET, WAS, SERVLET CONTAINER 본문
Servlet
동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술
웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해줌
웹 브라우저에서 요청을 하면 해당 기능을 수행한 후 웹 브라우저에 결과를 전송
주요 특징
- 클라이언트의 Request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
- JAVA의 스레드를 이용하여 동작
- MVC패턴에서 컨트롤러로 이용됨
- 컨테이너에서 실행
- 보안 기능을 적용하기 쉬움
동작 과정
클라이언트가 웹 서버에 요청을 보냄
웹 서버는 그 요청을 톰캣과 같은 WAS에 보냄
WAS는 각 요청에 해당하는 서블릿을 실행
서블릿은 요청에 대한 기능을 수행한 후 결과를 반환하여 클라이언트에 전송
1. 클라이언트 요청
2. HttpServletRequest, HttpServletResponse 객체 생성
3. Web.xml이 어느 서블릿에 대해 요청한 것인지 탐색
4. 해당하는 서블릿에서 service() 메소드 호출
- service() : 응답에 대한 모든 내용은 service() 메서드에 구현
HttpServlet을 상속받은 Servlet클래스에서 service()를
오버라이드 하지 않았다면, HttpServlet의 service()가 호출됨
request의 type에 따라 적절한 메서드를 호출함
메서드가 return 하면 해당 thread는 제거됨
5. doGet() 또는 doPost() 호출
6. 동적 페이지 생성 후 ServletResponse 객체에 응답 전송
7. HttpServletRequest, HttpServletResponse 객체 소멸
public class FirstServlet extends HttpServlet {
@Override
public void init() {
...
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
...
}
@Override
public void destroy() {
...
}
}
HttpServletRequest
- HTTP의 요청 정보(클라이언트 요청, 쿠키, 세션 등)를 제공하는 인터페이스
- HTTP 프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용
- Message Body의 Stream을 읽어들이는 메서드를 가지고 있음
- ex) getParameterNames(), getParameter(name)
HttpServletResponse
- HTTP 응답 정보(요청 처리 결과)를 제공하는 인터페이스
- Servlet이 HttpServletResponse 객체에 content-type, 응답 코드, 응답 메세지 등을 담아서 전송
- Servlet으로 들어온 요청은 텍스트로 응답을 보내기 때문에 출력 스트림을 받기 위해 주로 response로부터 writer 객체를 얻어서 내보냄
// HttpServletResponse response
response.setHeader("custom-header", "my custom header info");
response.setContentType("text/html; charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.print("hello");
w.close(); // printwriter 자원 해제
서블릿의 생명주기
서블릿도 자바 클래스라서 초기화부터 서비스 수행 후 소멸하기까지의 과정을 거침
이 과정을 서블릿의 생명주기라고 함
각 단계마다 호출되어 기능을 수행하는 콜백 메서드를 서블릿 생명주기 메서드라고 함
- 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인
- 없을 경우 init()메서드를 호출하여 메모리에 적재
- init()은 처음 한번만 실행되기 때문에, 서블릿의 스레드에서 공통적으로 사용해야 하는 것이 있다면 오버라이딩 하여 구현
- 실행 중 서블릿이 변경될 경우, 기존 서블릿을 destroy()하고 init()을 통해 새로운 내용을 다시 메모리에 적재
- init()이 호출된 후 클라이언트의 요청에 따라서 service() 메소드를 통해 요청에 대한 응답이 doGet() doPost()로 나뉨 → 서블릿 컨테이너가 클라이언트 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response 객체가 제공됨
- 컨테이너가 서블릿에 종료 요청을 하면 destroy() 메서드가 호출되고 한번만 실행됨, 종료시에 처리해야 하는 작업들은 destroy() 메서드를 오버라이딩하면 됨
서블릿 생명주기 메서드
초기화 : init()
- 서블릿 요청 시 맨 처음 한 번만 호출된다.
- 서블릿 생성 시 초기화 작업을 주로 수행한다.
작업 수행 : doGet(), doPost()
- 서블릿 요청 시 매번 호출된다.
- 실제로 클라이언트가 요청하는 작업을 수행한다.
종료 : destroy()
- 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출된다.
- 서블릿의 마무리 작업을 주로 수행한다.
What is Servlet Container?
구현되어 있는 servlet 클래스의 규칙에 맞게 서블릿을 담고 관리해주는 컨테이너
클라이언트의 요청이 들어오면 컨테이너가 HttpServletRequest, HttpServletResponse 두 객체를 생성하여 post, get 여부에 따라 동적인 페이지를 생성하여 응답
서블릿 컨테이너가 하는 일
웹 서버와의 통신 지원
- 원래는 소켓을 만들고 listen, accept 등을 해야하지만 서블릿 컨테이너는 이러한 기능을 API로 제공하여 복잡한 과정을 생략할 수 있게 해줌
서블릿 생명주기 관리
- 서블릿 클래스를 로딩하여 인스턴스화하고 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 호출
- 수명이 다 된 서블릿을 적절하게 가비지 컬렉터를 호출하여 자원 낭비를 막아줌
서블릿 객체는 싱글톤으로 관리
- 고객의 요청이 올 때 마다 계속 객체를 생성하는 것은 비효율적 → 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
- 모든 고객의 요청은 동일한 서블릿 객체 인스턴스에 접근
- 공유 변수 사용 주의
- 서블릿 컨테이너 종료시 함께 종료
멀티쓰레드 지원 및 관리
Request가 올 때 마다 새로운 자바 쓰레드를 하나 생성, Http 서비스 메소드를 실행하고 나면 쓰레드는 자동으로 죽음
최대 몇개까지의 쓰레드 생성이 가능?
- 쓰레드 생성에 제한이 없음
- 고객 요청이 너무 많이 오면 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있음
- 해결하려면?
- 서블릿 작업이 완료될 때까지 쓰레드 풀에 저장
- 다 사용하면 다시 쓰레드 풀에 반납
- 쓰레드 한계 개수를 200개로 설정했다면 200번대를 넘어가는 요청들은 대기하거나 거절됨
- 쓰레드 생성에 제한이 없음
원래는 쓰레드를 관리해야 하지만 서버가 다중 쓰레드 생성 및 운영을 해주기 때문에 걱정하지 않아도 됨
선언적인 보안 관리
- 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 됨
추가 정보
Tomcat은 Servlet Container
→ 엥?? Tomcat은 WAS였는데?? 그럼 WAS와 Servlet Container가 같은거야??
No No
WAS는 Web Server + Web Container(Servlet Container)이다.
그래서 정적 컨텐츠를 제공하면서도 웹 컨테이너를 이용해 내부 로직을 거쳐 동적 페이지를 보여줄 수 있음
서블릿 객체는 쓰레드가 호출해줌
쓰레드 특징
- 애플리케이션 코드를 하나하나 순차적으로 실행
- 쓰레드가 없으면 자바 애플리케이션 실행 불가능
- 한번에 하나의 코드 라인만 수행 가능
- 동시 처리가 필요하면 쓰레드를 추가로 생성
- 쓰레드 생성 비용 매우 비쌈
쓰레드 풀 - 실무 팁
WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread) 수 이다.
이 값을 너무 낮게 설정하면?
→ 동시 요청이 많으면, 서버 리소스는 여유롭지만, 클라이언트는 금방 응답 지연
이 값을 너무 높게 설정하면?
→ 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버 다운(서버가 한 번 다운되면 복구하기 쉽지 않음)
장애가 발생하면 어떻게 해야할까?
→ 클라우드 환경에서 autoscaling으로 서버의 용량을 늘리거나 개수를 늘리면 됨(scale up, scale out)
'백엔드 with java > java' 카테고리의 다른 글
String VS StringBuffer (0) | 2024.03.25 |
---|---|
람다식 (0) | 2023.12.12 |
자바 클래스 & 객체 (0) | 2023.05.29 |
ABOUT JAVA, 환경 변수 등록 (0) | 2023.05.29 |