jakarta.servlet.http.HttpServlet 클래스를 상속받아 구현초기 웹 서버는 고정된 HTML 파일을 그대로 보내주기만 했고, 이는 정적(Static) 페이지라고 함
서블릿 컨테이너의 역할
- 서블릿의 생명주기(생성:
init(), 실행:service(), 소멸:destroy()) 관리- 클라이언트 HTTP 요청을 서블릿에게 전달
- 서블릿의 응답을 받아 클라이언트에게 전송
- 동시에 여러 요청 처리 (멀티스레드 관리)
- 서블릿을 싱글톤 객체로 유지

hello 응답을 받는 /hello APIimport jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 요청 정보는 필요없으므로 요청 정보를 꺼내지는 않습니다.
// 비즈니스 로직 또한 따로 없으므로 작성하지 않습니다.
resp.setContentType("text/plain; charset=UTF-8"); // 응답 정보 타입 설정
resp.getWriter().print("hello"); // Response 객체에 응답 정보인 'hello'를 담아줍니다.
}
}
서블릿은 Spring Boot 표준이 아니라, 기본적으로는 Spring Boot에서 탐지하지 못한다.
동작을 위해서 Application에@ServletComponentScan이 필요하다.
요청 API 주소: http://localhost:8080/hello
Spring 애플리케이션은 기본적으로 8080 포트에서 실행된다.
실행 결과

GET 메서드이므로, 브라우저로도 같은 결과를 얻을 수 있다.

| 구성 요소 | 설명 |
|---|---|
| API 개요 | 이 API가 어떤 목적으로 만들어졌는지, 버전 정보, 전체 주소(Base URL) 등 |
| Endpoint | API가 제공하는 개별 기능의 '주소' (URI) |
| Method | 해당 주소로 어떤 작업을 할지 결정 (HTTP Method) |
| Parameters | 요청할 때 꼭 보내야 하는 추가 정보들 |
| Request Body | 생성하거나 수정할 데이터의 실체 (주로 JSON 형식) |
| Response | 요청 처리 후 서버가 돌려주는 응답 정보 |
| Status Codes | 요청의 성공/실패 여부를 나타내는 숫자 코드 |
리스트에서 랜덤한 영화 제목을 뽑아 JSON 형식으로 응답
코드 스니펫
import tools.jackson.databind.ObjectMapper;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@WebServlet("/movies/recommendation")
public class MovieRecommendationServlet extends HttpServlet {
private final List<String> recommendedMovies = List.of(
"쇼생크 탈출",
"대부",
"다크 나이트",
"인생은 아름다워"
);
// 1. Map을 JSON으로 바꾸기 위해 필요한 ObjectMapper를 생성합니다.
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 2. 랜덤으로 영화 하나를 선택합니다.
int randomIndex = (int) (Math.random() * recommendedMovies.size());
String randomMovie = recommendedMovies.get(randomIndex);
Map<String, String> movieMap = Map.of("title", randomMovie);
// 3. 응답 속성을 설정합니다.
response.setContentType("application/json; charset=UTF-8");
// 4. ObjectMapper를 사용해 JSON 문자열로 변환합니다.
String json = objectMapper.writeValueAsString(movieMap);
// 5. 생성된 JSON을 클라이언트에게 응답으로 보냅니다.
response.getWriter().print(json);
}
}
요청 API 주소: http://localhost:8080/hello
실행 결과

