[Spring] 스프링 MVC 기본 기능 정리

2025. 3. 7. 06:28코딩 도구/백엔드 개발 (Backend Development)

반응형

스프링 MVC 기본 기능 정리

이 글에서는 인프런 김영한님의 "스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술"을 수강하고 정리했습니다. 

 

스프링 MVC 기본 기능 정리

스프링 MVC는 웹 애플리케이션에서 HTTP 요청을 처리하고 응답을 반환하는 프레임워크이다. 본 강의에서는 스프링 MVC의 기본 기능을 학습하며, 웹 개발에 필요한 다양한 개념들을 다룬다. 이 글에서는 강의 내용을 정리한다. 

1. 요청 매핑(Request Mapping)

스프링에서는 @RequestMapping을 사용하여 특정 URL과 컨트롤러 메서드를 매핑할 수 있다.

  • HTTP 메서드(GET, POST 등)를 제한할 수 있으며, @GetMapping, @PostMapping 등으로 축약하여 사용할 수도 있다.
  • @PathVariable을 활용하여 URL 경로 변수 값을 매핑할 수 있다.

2. HTTP 요청 처리

스프링 MVC에서는 HTTP 요청 데이터를 다양한 방법으로 받을 수 있다.

  • @RequestParam: 요청 파라미터를 받아오는 방법
  • @ModelAttribute: 객체 단위로 요청 데이터를 바인딩하는 방법
  • @RequestBody: HTTP 메시지 바디에서 직접 데이터를 추출하는 방법

3. HTTP 응답 처리

서버에서 클라이언트로 데이터를 응답하는 방법은 크게 세 가지이다.

  1. 정적 리소스 제공 (/static, /public 등 디렉토리에 파일 배치)
  2. 뷰 템플릿 렌더링 (Thymeleaf 활용)
  3. HTTP 메시지 응답 (@ResponseBody, ResponseEntity 활용)

4. HTTP 메시지 컨버터

HTTP 메시지 컨버터(HttpMessageConverter)는 HTTP 요청과 응답을 변환하는 역할을 한다.

4.1 개념

스프링은 요청 데이터(예: JSON)를 객체로 변환하거나, 객체를 응답 데이터(JSON 등)로 변환할 때 메시지 컨버터를 사용한다.

  • @RequestBody: HTTP 요청 바디의 데이터를 Java 객체로 변환
  • @ResponseBody: Java 객체를 HTTP 응답 바디로 변환
  • HttpEntity<T>: 요청과 응답 데이터를 다룰 때 사용

4.2 동작 방식

스프링 MVC는 HttpMessageConverter 인터페이스를 구현한 여러 기본 컨버터를 제공한다.

  • StringHttpMessageConverter: 문자열 데이터를 변환
  • MappingJackson2HttpMessageConverter: JSON 데이터를 변환 (Jackson 라이브러리 필요)
  • ByteArrayHttpMessageConverter: 바이트 배열을 변환

요청을 처리할 때 클라이언트의 Content-Type 헤더를 보고 어떤 컨버터를 사용할지 결정한다. 응답을 생성할 때는 클라이언트의 Accept 헤더를 참고하여 적절한 컨버터를 선택한다.

4.3 예제

@RestController
public class MessageConverterController {
    @PostMapping("/convert")
    public ResponseEntity<HelloData> convertJson(@RequestBody HelloData data) {
        log.info("Received: {}", data);
        return ResponseEntity.ok(data);
    }
}

위 코드에서 @RequestBody는 JSON을 HelloData 객체로 변환하며, ResponseEntity.ok(data)는 다시 JSON 응답을 생성한다.


5. 요청 매핑 핸들러 어댑터 구조

스프링 MVC에서 요청을 처리하는 핵심 구조는 다음과 같다.

5.1 DispatcherServlet

모든 요청은 DispatcherServlet을 통해 처리된다. 요청을 받은 후 내부적으로 여러 컴포넌트를 이용해 컨트롤러 메서드를 호출한다.

5.2 핸들러 매핑과 핸들러 어댑터

  1. HandlerMapping: 어떤 컨트롤러의 메서드가 요청을 처리할지 결정한다.
    • RequestMappingHandlerMapping: @RequestMapping 기반의 매핑 처리
    • SimpleUrlHandlerMapping: 단순한 URL 패턴 매핑
  2. HandlerAdapter: 컨트롤러를 실행할 수 있도록 요청을 변환하고 호출한다.
    • RequestMappingHandlerAdapter: @RequestMapping이 붙은 메서드를 실행하는 역할
    • HttpRequestHandlerAdapter: HttpRequestHandler를 구현한 컨트롤러 처리

5.3 흐름 정리

  1. 클라이언트 요청이 들어오면 DispatcherServlet이 이를 받는다.
  2. HandlerMapping이 적절한 컨트롤러를 찾는다.
  3. HandlerAdapter가 해당 컨트롤러를 실행하고, 결과를 반환한다.
  4. ViewResolver가 뷰를 렌더링하거나, HTTP 메시지 컨버터가 응답을 생성한다.

5.4 흐름 예제 코드

@Controller
@RequestMapping("/example")
public class ExampleController {
    @GetMapping("/test")
    public String testHandler(Model model) {
        model.addAttribute("message", "Hello Spring MVC");
        return "testView";
    }
}

위 코드에서:

  • RequestMappingHandlerMapping/example/test 요청을 testHandler 메서드로 연결
  • RequestMappingHandlerAdapter가 해당 메서드를 실행하고, 뷰 이름 testView를 반환
  • ViewResolvertestView.html을 찾아 렌더링
반응형