이전에 웹의 기본 구조를 정리했다.
브라우저는 request를 보내고, 서버는 response를 돌려준다.
그리고 “동적 데이터”는 요청이 올 때마다 서버가 로직을 실행해서 결과를 만들어야 한다.
문제는 여기서부터이다.
동적 요청을 처리하려면 서버는 단순히 파일만 전달하는 수준을 넘어
요청을 해석하고, 데이터를 읽고, 결과를 만들고, 다시 응답으로 보내야 한다.
게다가 웹은 동시에 많은 요청이 들어오기 때문에, 이런 처리를 안정적으로 반복할 수 있어야 한다.
이 복잡한 문제를 매번 처음부터 직접 구현하면 비용이 너무 크다.
그래서 자바 진영에서는 웹 개발을 위한 표준 스펙을 정리했고, 그 핵심이 Servlet이다.
서블릿의 정체: “웹 요청/응답 처리를 위한 자바 표준 API”
서블릿(Servlet)은 한 문장으로 말하면 이것이다.
HTTP 요청(request)을 받아서 처리하고, HTTP 응답(response)을 만드는 규칙과 API를 정리한 것
즉 서블릿은 “특정 제품”이 아니라
자바에서 웹 개발을 하기 위해 필요한 표준 규격(스펙) 에 가깝다.
개발자는 이 규격에 맞춰 코드를 작성하면 되고,
그 코드를 실제로 실행해주는 환경이 따로 존재한다.
서블릿 컨테이너가 “서블릿을 실행하는 주체”이다
일반 자바 프로그램은 개발자가 직접 이렇게 시작한다.
- main()이 실행된다
- 필요한 객체를 new로 생성한다
- 메서드를 직접 호출한다
하지만 서블릿 기반 웹 애플리케이션은 구조가 다르다.
서블릿 코드의 실행 주체는 개발자가 아니라 서블릿 컨테이너이다.
서블릿 컨테이너는 다음을 대신 해준다.
- 요청이 들어오면 어떤 서블릿이 처리해야 하는지 찾는다
- 서블릿 클래스를 로딩하고 객체를 만든다
- request/response 객체를 만들어서 서블릿에 전달한다
- 서블릿이 만든 결과를 HTTP response로 브라우저에 전송한다
즉, 서블릿 컨테이너가 “웹 요청을 서블릿 코드로 연결해주는 실행 엔진” 역할을 한다.
톰캣은 대표적인 서블릿 컨테이너이다
톰캣(Tomcat)은 흔히 WAS라고 불리는데,
정확히는 서블릿/JSP를 실행할 수 있는 서블릿 컨테이너이다.
톰캣이 있다는 말은 곧 이런 의미이다.
- 서블릿 스펙을 지원하는 실행 환경이 있다
- 개발자가 작성한 서블릿 코드를 HTTP 요청과 연결해서 실행할 수 있다
그래서 톰캣을 설치할 때 “어떤 서블릿 버전을 지원하는지” 같은 이야기가 나오는 것이다.
서블릿 스펙이 버전별로 바뀌고, 컨테이너는 그 스펙을 구현해서 제공하기 때문이다.
서블릿 방식에서 가장 큰 차이: “객체 생성과 호출 주체가 개발자가 아니다”
서블릿을 이해할 때 초보가 가장 많이 헷갈리는 지점이 여기다.
일반 자바 코드에서는
- `new SampleServlet()`을 개발자가 직접 한다
- 메서드를 직접 호출한다
서블릿 환경에서는
- 서블릿 컨테이너가 서블릿 객체를 만든다
- 요청이 들어오면 컨테이너가 적절한 메서드를 호출한다
즉 개발자 코드는 “호출되는 쪽”이지, “호출하는 쪽”이 아니다.
그래서 서블릿 코드는 이런 형태가 된다.
- “요청이 오면 컨테이너가 이 메서드를 호출한다”
- “나는 여기서 request를 읽고 response를 만든다”
이 관점 전환이 서블릿 학습에서 가장 중요하다.
서블릿이 해결해주는 것들
서블릿을 쓰면 개발자는 다음 고민을 덜 수 있다.
- 요청/응답을 처리하는 기본 구조를 매번 구현하지 않아도 된다
- request/response를 다루는 표준 API를 사용할 수 있다
- 동시에 여러 요청이 들어오는 웹 환경에서 동작하도록 기본 구조가 잡혀 있다
물론 “아무것도 신경 안 써도 된다”는 뜻은 아니다.
하지만 최소한 웹 서버를 직접 만들고, HTTP를 직접 파싱하고, 라우팅을 직접 구현하는 수준의 부담은 크게 줄어든다.
핵심 정리
- 서블릿은 웹 요청/응답 처리를 위한 자바 표준 API이다
- 서블릿 컨테이너가 서블릿을 실행한다
- 톰캣은 대표적인 서블릿 컨테이너이다
- 서블릿 환경에서는 객체 생성/호출의 주체가 개발자가 아니라 컨테이너이다
'Web > Web Basics' 카테고리의 다른 글
| [서블릿과 JSP] 3. HttpServletRequest/HttpServletResponse (0) | 2026.03.29 |
|---|---|
| [서블릿과 JSP] 2. 서블릿 라이프사이클 (0) | 2026.03.29 |
| [웹 기초] 9. 개발자 도구(Network)로 request/response를 눈으로 확인하는 방법 (0) | 2026.03.29 |
| [웹 기초] 8. HTTP가 비연결성이고 무상태성이라는 말의 의미 (0) | 2026.03.29 |
| [웹 기초] 7. HTTP 메시지는 왜 Header와 Body로 나뉘는가 (0) | 2026.03.29 |