Spring 입문 (Servlet)

KimGwangmin·2026년 9월 6일

Servlet(서블릿)

  • 클라이언트 요청에 따라 동적 웹페이지나 데이터를 반환하는 자바 프로그램
    1. 클라이언트의 요청(HTTP Request) 해석
    2. 조회, 계산 등 비즈니스 로직 수행
    3. 결과 생성 후 클라이언트에게 응답
  • jakarta.servlet.http.HttpServlet 클래스를 상속받아 구현
초기 웹 서버는 고정된 HTML 파일을 그대로 보내주기만 했고, 이는 정적(Static) 페이지라고 함

Servlet Container

  • Servlet의 실행, 관리, 웹 서버와의 통신을 지원하는 서버 측 환경
  • 대표적으로 Tomcat이 있음

서블릿 컨테이너의 역할

  • 서블릿의 생명주기(생성: init(), 실행: service(), 소멸: destroy()) 관리
  • 클라이언트 HTTP 요청을 서블릿에게 전달
  • 서블릿의 응답을 받아 클라이언트에게 전송
  • 동시에 여러 요청 처리 (멀티스레드 관리)
  • 서블릿을 싱글톤 객체로 유지

API 구현 기초 실습

  • hello 응답을 받는 /hello API
코드 스니펫
import 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 포트에서 실행된다.
실행 결과
  • Postman을 사용해 로컬 서버로 API 요청 전송
  • GET 메서드이므로, 브라우저로도 같은 결과를 얻을 수 있다.
  • 당연히 응답 문자열을 바꿔봐도 잘 동작한다.

API 명세서

  • 구현을 모르더라도 API 사용에 지장이 없도록 설명해주는 '메뉴판'
  • 일반적으로 다음의 정보를 포함
구성 요소설명
API 개요이 API가 어떤 목적으로 만들어졌는지, 버전 정보, 전체 주소(Base URL) 등
EndpointAPI가 제공하는 개별 기능의 '주소' (URI)
Method해당 주소로 어떤 작업을 할지 결정 (HTTP Method)
Parameters요청할 때 꼭 보내야 하는 추가 정보들
Request Body생성하거나 수정할 데이터의 실체 (주로 JSON 형식)
Response요청 처리 후 서버가 돌려주는 응답 정보
Status Codes요청의 성공/실패 여부를 나타내는 숫자 코드

영화 추천 API 실습

리스트에서 랜덤한 영화 제목을 뽑아 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
실행 결과
  • 요청마다 결과가 달라지는 것을 확인할 수 있다.

0개의 댓글