새소식

스프링

서블릿이 뭐에요?

  • -

스프링 MVC에 대해 공부하던 중 서블릿에 대한 나름대로의 정리가 필요할 것 같았다.

 

그래서 먼저 위키에 서블릿이 뭔지 찾아봤다.

뭐 그렇다는데, 영한님의 강의에서는 이렇게 서블릿을 설명해주셨다.

 

WAS(웹 어플리케이션 서버)를 구현하려면 아래와 같이 여러 작업을 해야한다.

  • 서버 소켓 연결
  • HTTP 요청 메시지 파싱
  • ...
  • 비즈니스 로직 실행 및 디비에 저장
  • ...
  • HTTP 응답 메시지 생성 및 전달
  • 소켓 종료

이렇게 많은 동작을 필요로 하는데, 서블릿을 지원하는 WAS 사용시 위와 같이 비즈니스 로직 실행 및 디비 저장하는 부분 외에 귀찮은 부분들을 다 처리해준다. 그래서 개발자가 WAS를 더 쉽게 개발할 수 있게 되는 것이다.

 

WAS는 Web Server + Web Container(Sevlet Container)로 이루어져 있다.

인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

 

기본적인 처리 플로우는 다음과 같다.

 

웹 브라우저에서 특정 url로 요청 전송

⬇️

WAS의 서블릿 컨테이너에서 request와 response 객체를 새로 만들어 서블릿 객체를 호출. 이때 서블릿 객체는 설정에 따라 서버가 만들어질 때 만들어지거나 실제 사용 시점에 만들어진다. 참고

 

서블릿 생성 시점과 역할 관련 질문입니다! - 인프런 | 커뮤니티 질문&답변

누구나 함께하는 인프런 커뮤니티. 모르면 묻고, 해답을 찾아보세요.

www.inflearn.com

⬇️

서블릿에서 비즈니스 로직 실행 후 응답 결과를 서블릿 컨테이너로 전달

⬇️

서블릿 컨테이너에서 응답을 만든 후 웹 브라우저로 전달

 

이때 서블릿은 싱글톤으로 생성되어 관리되기 때문에 공유 변수를 사용하게 되면 유저 정보가 노출되는 등 문제가 발생할 수 있기 때문에 주의해야 한다.

 

자바 코드로는 이렇게 나타낼 수 있다.

물론 이렇게 그대로 쓰진 않고 이미 스프링에서 사용하기 편리하도록 구현이 다 되어 있다. 하지만 나름 위 코드도 개발자들이 더 쉽게 HTTP 스펙을 사용할 수 있도록 고민한 결과이다.

 

서블릿 사용시 싱글톤으로 관리된다고 했는데, 그럼 한 요청이 해당 서블릿을 사용중이면 다른 요청은 기다려야 할까? 당연히 아니다. 동시 요청을 처리하기 위해 멀티 쓰레드로 처리한다. 그래서 공유 변수를 사용하지 말라는 말...

 

처음스프링 어플리케이션을 실행하면, 즉 main 메서드를 실행하면 수많은 main 쓰레드들이 실행되는걸 볼 수 있다.

오른쪽 끝에 나오는 정보가 쓰레드를 의미한다.

그러면 요청이 올때마다 이렇게 쓰레드를 생성해서 제공하는 것일까? 당연히 아니다. 쓰레드 생성 비용이 매우 비싸고 필요할 때마다 생성하면 응답 속도도 느려지기 때문이다. 그리고 요청이 너무 많이 오면? 쓰레드가 너무 많아져 서버가 터질수도 있다. 그래서 쓰레드를 관리하기 위해 쓰레드 풀 방식을 사용한다.

인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

미리 쓰레드를 만들어 놓고 쓰레드가 필요할 때 쓰레드 풀에서 꺼내 사용한다. 물론 다 쓰면 다시 반납해야 한다. 그러면 쓰레드 풀에 쓰레드가 없으면? 쓰레드를 기다리거나 요청을 거부할 수 있다.

 

어쨌든 WAS는 이러한 멀티 쓰레드 처리부분까지 모두 담당하여 개발자가 쉽게 WAS를 개발할 수 있도록 해준다.

 

이제야 좀 정리가 된 것 같다 😇

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.