개발자로 후회없는 삶 살기

[문법] 웹 서버와 서블릿 본문

[백엔드]/[spring | 학습기록]

[문법] 웹 서버와 서블릿

몽이장쥰 2024. 8. 1. 14:06

서론

※ 과거에 기록한 내용에서 중요한 부분만 발췌하여 모두가 이해하기 쉽게 다시 서술한다.

 

본론

- 웹 서버

http를 기반으로 정적 리소스를 반환하는 역할을 한다. static 폴더에 정적 리소스(html, css, 이미지)를 넣어두면 웹 서버가 반환한다. 웹 서버에는 nginx, 아파치가 있다.

 

- 웹 어플리케이션

http 기반으로 동작하며 웹 서버 기능을 대부분 포함하다. 큰 차이는 프로그램 코드를 실행해서 어플리케이션 로직을 수행할 수 있다는 것으로 웹 서버는 정적인 파일을 주는 것이기 때문에 html을 특정 사용자마다 다르게 보여줄 수 없는데 WAS는 http 요청이 오면 로직을 수행하여 다른 화면을 보여줄 수 있다.

 

- 웹 시스템 구성

웹 서비스에서는 최소한 was와 db 2개가 필요하다. was는 웹 서버의 대부분의 기능을 수행할 수 있다. 하지만 이렇게 하면 서버 과부하가 일어날 수 있다.

 

was가 정적 리소스와 동적 로직을 처리하면 부하가 발생할 수 있다. was는 잘 죽어서 오류 발생시 다운되어 오류 메세지 조차 못 받을 수 있다. 따라서 작은 시스템은 was만으로 할 수 있지만, 큰 시스템은 부담이 있다.

 

-> 일반적인 구성

따라서, 일반적으로 웹 서버와 was를 같이 사용한다. 정적 요청은 웹 서버가 처리하고, 동적 요청은 웹 서버가 받아서 was를 호출한다. 웹 서버의 역할은 정적 리소스 처리와 was 호출이다.

 

이렇게 하면 정적, 동적 리소스의 양에 따라 서버 대수를 늘려서 효율적으로 리소스를 관리할 수 있는 장점이 있다.

 

- 서블릿

이름을 입력 받는 폼이 있을 때, 요청을 보내면 http 메세지가 발생한다.

 

🚨 만약 was가 없다면?

http 메세지를 다 풀어헤쳐야 한다. 초록색 박스만이 의미있는 비즈니스 로직인데, 이를 전부 해석하는 작업이 필요하고 따라서 서블릿이 나왔다. 서블릿을 지원하는 was가 초록색을 제외한 모든 일을 다 지원해준다. (was가 어플리케이션 계층에서 동작해서 http 메세지를 해석해서 데이터만 넘겨준다.)

 

서블릿이 전처리를 다 해주니 개발자는 로직만 작성하면 된다. 인자인 request가 http 메세지를 서블릿이 직접 풀어서 정제한 결과이다. http 요청 정보를 편리하게 사용할 수 있도록 서블릿이 만들어준다. 서블릿을 통해 response도 편리하게 만들 수 있다.

 

- 전체 그림

브라우저 요청이 오면 was가 http 메세지를 받아서, req, resp를 생성하고 서블릿을 호출한다. 응답이 끝나면 resp 객체를 통해 http 응답 메세지를 만들고 브라우저에게 반환한다. was는 동시 요청을 위한 멀티 스레드 처리를 지원해준다.

 

- 동시 요청 멀티 스레드

브라우저에서 서버로 요청을 하면 was가 응답한다. was가 서블릿을 생성해서 실행한다고 했는데 서블릿 객체는 누가 호출할까? 스레드가 호출한다.

 

 

다중 요청에 쓰레드가 하나라면, 먼저 온 요청이 지연될 시 답변이 안 와서 was가 timeout하면서 404 에러를 보여준다. 이를 해결하는 방법이 요청이 올 때마다 스레드를 새로 만드는 것이다.

 

→ 단점

1. 스레드 생성은 비용이 크다. 스레드 생성으로 인해 cpu 처리 속도가 느려질 수 있다.
2. 스레드 개수가 많아질 수록 스위칭 비용이 크다.
3. 스레드는 메모리를 차지하기 때문에 임계점을 넘으면 서버가 다운 될 수 있다.

 

→ 해결 방법

이를 해결하기 위해 보통 was는 내부에 스레드 풀이 있다. 미리 스레드를 만들어 놓고 가져다 쓰고 응답이 끝나면 풀에 반납하여, 갯수를 유지한다. 톰캣은 최대 200개가 기본 설정이고, 201개부터는 대기 한다.

 

→ 적정 숫자 찾는 법

너무 적으면, cpu 사용량이 적고, 너무 높으면 임계점 초과로 죽어버린다. 적정 숫자는 로직 복잡도, cpu, 메모리 상황에 따라 모두 다르며 성능 테스트를 하는 것 밖에 없다.

 

핵심

개발자는 서블릿 코드에 비즈니스 로직만 넣으면 되고, 풀 관리, 멀티 스레드 관리 http 메세지 변환은 was가 다 해준다. 개발자는 마치 싱글 스레드 처리하듯이 코드를 짜면 된다.

 

- HttpServletRequest

서블릿에게 보낸 요청 인터페이스이다. 서블릿이 요청 메세지를 꺼내서 req에 담아서 제공한다.

 

-> 요청 메세지

1) start-line : http 메서드, 쿼리 스트링, URI, 프로토콜 버전
2) 헤더 : Host, Content-Type
3) 바디 : 폼 데이터

 

-> 부가 기능

http 메세지를 관리하는 것 외에도 여러 기능을 제공한다.

 

1. 임시 저장소 기능

요청 메세지는 요청이 오고 나가기까지가 생존 범위로, Attribute라고 해 놓으면 메세지 안에 데이터 저장소가 있고 요청 메세지가 살아있는 동안 값을 저장하고 사용할 수 있다.

 

2. 세션 관리 기능

로그인 세션을 관리할 수 있다.

 

- HttpServletRequest 사용법

http 메서드, 프로토콜 버전 등을 다 볼 수 있고 URL은 전체 경로, URI는 매핑 패턴이다.

 

- Http 요청 데이터 개요

요청 메세지를 통해서 클라이언트에서 서버로 어떤 식으로 데이터를 주는지 알아보자

 

1. get 쿼리 파라미터

보통 검색, 필터, 페이징에 많이 사용된다.

 

2. post html form

메세지 바디에 쿼리 파라미터 형식으로 데이터가 전달된다.

get 쿼리 파라미터 방식과 html form 방식의 형식이 [? & &]로 똑같다.

 

3. api 메세지 바디

http 요청 메세지의 메세지 바디에 데이터를 담아 서버로 전송한다. http 메세지에 컨텐트 바디에는 데이터가 인코딩 되어서 들어가는데 이를 자바에서는 ServletInputStream으로 저장하고 이를 문자로 바꿀 때 어떤 인코딩 방식인지 알려줘야 한다.

 

바디 데이터를 바로 객체로 변환할 수 있는 데 Jackson 라이브러리의 ObjectMapper가 필요하다.

 

- resp 기본 사용법

http 응답 메세지를 생성하는 역할을 하며, 이 객체에 필요한 값을 넣고 반환하면 자동으로 was가 응답 http 메세지를 만든다.

 

1) 응답 상태 1 ~ 5XX
2) 헤더
3) 바디
4) 쿠키
5) content-type
6) redirect

등을 편리하게 넣을 수 있다.

 

set 메서드로 원하는 값을 넣고, 실행하면 넣은 게 나오고

 

상태도 반영된다.

Comments