스프링

스프링 부트와 스프링 MVC 이해

yoon4360 2025. 4. 5. 22:52

 

Spring Boot로 웹 애플리케이션을 개발하다 보면 가장 처음 마주하게 되는 질문이 있다.
“HTTP 요청이 실제로 어떻게 처리되는가?”

이번 글에서는 서블릿 컨테이너(Tomcat) 부터 시작해 DispatcherServlet, Controller, View 까지
스프링 웹 애플리케이션이 HTTP 요청을 처리하는 전체 흐름을 정리하려 한다.

 


 

서블릿 컨테이너

웹 브라우저로 접속하는 모든 애플리케이션은 웹앱이며, HTTP 요청과 응답을 자바 객체로 변환하는 서블릿 컨테이너가 필요하다.
대표적인 서블릿 컨테이너는 Tomcat이다.

  • 클라이언트의 HTTP 요청 → 자바 코드에서 사용할 수 있도록 매핑
  • 자바에서 생성한 응답 → 다시 HTTP 형태로 변환 후 브라우저에 반환

서블릿의 역할

서블릿은 단순히 HTTP 요청을 처리하는 자바 객체이다.
서블릿 컨테이너(Tomcat)는 URL 경로에 따라 서블릿 인스턴스를 호출하고, 요청을 처리하게 한다.

 


 

스프링 부트

스프링 부트는 톰캣, 서블릿 설정 등을 자동 구성해주는 도구이다.

특징
  • 간소화된 프로젝트를 생성해준다. (spring-boot-starter-*)
  • 자동 구성: 의존성에 따라 자동으로 설정가능하다.
  • 내장 톰캣: 별도 설정 없이 실행만으로 서버를 구동할 수 있다.

예를 들어 웹 애플리케이션을 만들기 위해 spring-boot-starter-web 을 추가하면,

스프링 부트는 자동으로 톰캣을 설정하고, 서블릿 관련 구성도 자동으로 해준다.

이러한 방식을 관례보다 구성 원칙이라고 한다.

 


 

HTTP 요청 흐름

 

  1. 클라이언트 요청
    사용자가 브라우저에서 https://myapp.com/hello 요청한다.
  2. Tomcat 수신
    내장 톰캣이 요청을 수신하고, DispatcherServlet 이라는 서블릿에 전달한다.
  3. DispatcherServlet 실행
    스프링 MVC의 핵심 컴포넌트이다.
    모든 요청을 받아 어떤 컨트롤러가 응답할지 결정하는 프론트 컨트롤러 역할을 한다.
  4. HandlerMapping → 컨트롤러 선택
    URL, HTTP 메서드 등을 기반으로 적절한 @Controller 또는 @RestController 의 메서드를 매핑한다.
  5. Controller 메서드 실행
    요청 처리 로직 수행 후 모델(Model)과 뷰(View 이름)를 반환한다.
  6. ViewResolver 작동
    뷰 이름을 받아 실제 HTML 템플릿 파일을 찾아 렌더링한다.
  7. 응답 반환
    렌더링된 뷰 → DispatcherServlet → 톰캣 → 최종적으로 클라이언트에게 응답한다.

 


 

MVC 구성요소 정리

Tomcat HTTP 요청을 수신하는 웹 서버
DispatcherServlet 모든 요청을 받아 스프링 내부 흐름을 조율하는 프론트 컨트롤러
HandlerMapping 어떤 컨트롤러가 요청을 처리할지 결정
Controller 실제 비즈니스 로직 수행
ViewResolver 뷰 이름 → HTML 또는 템플릿 파일로 매핑
View 클라이언트에게 보여줄 콘텐츠 생성 (HTML 등)

 


 

동적 뷰 & 템플릿 엔진

HTML 뷰는 상황에 따라 다른 데이터를 보여줘야 하므로 동적 뷰가 필요하다.
스프링에서는 보통 Thymeleaf, JSP 같은 템플릿 엔진을 사용한다.

@GetMapping("/greeting")
public String greeting(Model model) {
    model.addAttribute("name", "Joo");
    return "hello"; // templates/hello.html
}
  • Model 객체에 데이터를 저장한다.
  • 템플릿 파일에서 ${name} 으로 값을 사용할 수 있다.

 


 

HTTP 요청에서 데이터 받기

HTTP 요청에 따라 다양한 방식으로 데이터를 전달할 수 있다. 각각의 사용 이유와 애노테이션을 정리한다.

방식 애노테이션 사용 예 설명
쿼리 파라미터 @RequestParam /search?keyword=spring 소량, 선택적 데이터
경로 변수 @PathVariable /user/123 필수 값, 리소스 ID
요청 바디 @RequestBody JSON 요청 대용량, 구조화된 데이터
요청 헤더 @RequestHeader Authorization 보안 토큰, 사용자 정보

 


 

마무리

스프링 부트를 사용할 때 HTTP 요청이 어디서 시작해 어디까지 도달하는지
전체 흐름을 이해하면 디버깅, 테스트, 확장에 큰 도움이 된다.

  • DispatcherServlet → 컨트롤러 → 뷰
  • @RequestMapping, @PathVariable, @RequestParam 등으로 요청 데이터를 추출할 수 있다.
  • 템플릿 엔진을 활용한 동적 뷰를 처리하는것이 좋다.