🌱 Spring

서블릿

토심 2021. 5. 17. 21:41

 

서블릿에 대해 알아보자.

 

회원 가입 웹페이지에 HTML Form이 있고,

이름이랑 나이를 넣고 전송을 한다고 가정해보자.

 

이 과정을 

HTML POST로 데이터를 저장하려고 하면

서버에서 처리해야 하는 업무는 정말 많다.

 

 

----------------------------------------------

  ~ 서버에서 처리해야 하는 업무 순서 ~

 

1. 웹 애플리케이션 서버 직접 구현

2. 서버 TCP/IP 연결 대기, 소켓 연결

3. HTTP 요청 메시지를 파싱 해서 읽기

4. POST 방식, /save URL인지 확인

5. Content-Type 확인

6. HTTP 메시지 바디 내용 파싱

7. 저장 프로세스 실행

8. 비즈니스 로직 실행 (<<< 이게 의미 있는 비즈니스 로직)

9. HTTP 응답 메시지 생성 시작

10. TCP/IP에 응답 전달, 소켓 종료

----------------------------------------------

 

 

이래서,

서블릿이 나왔다.

 

서블릿이 저 의미 있는 비즈니스 로직 제외한 모든 기능을 제공해준다.

심지어 HTTP 응답 메시지 생성해주는 것까지 자동화해준다.

 

 

 


 

 

 

 

서블릿 파라미터는 두개가 들어오는데

HTTP에 대한 요청 정보를 편리하게 사용할 수 있도록

Request 객체(HTTP 응답 메시지 생성),

Response 객체(HTTP에 대한 응답 정보)를 제공하여 굉장히 편하게 사용할 수 있다.

 

서블릿을 통해서 개발자는 HTTP 스펙을 편리하게 사용할 수 있다.

그래서 HTTP 스펙을 기본적으로 알고 있어야 한다.

 

 

 

 

서블릿 전체 그림을 설명!

이전글에서 사용한 이미지이지만 흐름이 비슷해서 또 가져와봤다.

1. 웹 브라우저에서 먼저 localhost:8080/hello 라고 요청을 한다.

2. WAS 서버에서 요청 메시지를 기반으로 Request 객체를 새로 만든다.

3. 서블릿 컨테이너에서 helloServlet이라는 것을 실행을 해준다.

4. 끝나고 리턴을 하면 우리가 만들었던 Response 객체를 가지고 바탕으로 HTTP 응답 메시지를 만든다.

5. 그리고 웹 브라우저에 응답 메시지를 전달한다.

(간단하죠?)

 

 

↓↓↓↓↓↓↓

 

 

풀어서 이야기 해보면

HTTP 요청 시 WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다.

개발자는 Request객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용하고,

Response 객체에 HTTP 응답 정보를 편하게 넣을 수 있다.

그럼 WAS는 Response 객체에 담겨있는 내용을 바탕으로

HTTP 응답 메시지를 만들어서 웹브라우저에게 전송을 해준다.

웹브라우저가 받은 HTML을 렌더링 해서 예쁘게 보여준다.

 

 

 

 

서블릿 객체는 직접 생성하거나 하는 게 아니다.

→ 서블릿을 지원하는 WAS 안에는 서블릿 컨테이너라는 게 있는데

→ 이 서블릿 컨테이너를 자동으로 생성해주고 호출해주고 생명주기가 있는데

→ WAS가 내려갈 때 서블릿을 같이 내려준다.

그래서 서블릿이 여러 개 있으면 서블릿 컨테이너에 여러 개의 서블릿이 있게 된다.

 

 

 

 

 


 

 

 

 

 

- 서블릿과 서블릿 컨테이너의 자세한 이야기

 

 

톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.

이 서블릿 컨테이너를 서블릿 객체를 생성하고 초기화하고 호출하고 종료하는 생명주기를 관리해준다.

 

서블릿 객체는 이게 중요한데 싱글톤으로 관리를 해준다.

객체를 딱 하나만 생성해두고 걔를 공유해서 쓰는 거다.

JVM안에는 딱 이 객체 하나만 생성되어있고, new 해서 또 생성되는 게 아니라 이거 하나만 생성된다.

 

그런 이유는

고객마다 Request, Response 객체가 다 달라야 하는데

고객 요청이 올 때마다 새로 만들어지는 게 맞는데 

helloServlet은 굳이 새로 생성할 필요가 없다.

 

그래서 얘는 항상 다 같이 재 사용을 한다.

요청이 올 때마다 new로 생성하면 의미 없는 객체가 만들어져서 비효율적이다.

최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.

 

모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근하게 된다.

누가 요청을 하던 다 같은 서블릿 인스턴스에 접근해서 그 로직을 실행한다.

★ 그래서 공유 변수를 사용할 때 주의해야 한다.

멤버 변수를 사용할 때는 싱글톤 사용할 때는 굉장히 조심해야 한다.

그리고 서블릿 컨테이너 종료가 될 때 함께 종료가 된다.

 

 

 

진짜 중요한 그리고 서블릿을 사용하는 WAS에 진짜 큰 특징은

 동시 요청을 위한 멀티 쓰레드 처리를 지원 해준다는 것이다.

서버가 동시에 100면 1000명 10000이 요청해도 서버가 잘 처리하거든요.

그 이유가 멀티 쓰레드라는 게 지원이 되기 때문이다.

개발자는 멀티 쓰레드에 크게 신경 쓰지 않아도

WAS에서 그런 걸 자동으로 다 해결해준다.

 

 

 

- 서블릿과 서블릿 컨테이너의 자세한 이야기 Fin.

 

 

 

 

참고) Jsp라는 게 있는데 Jsp도 서블릿으로 변환되어서 사용이 된다.

 

 

 

 

 

 

 

 


커피 한 잔 후원하기