Spring MVC 구조

ssongyi·2025년 4월 21일
0

Java/Spring TIL

목록 보기
9/11

  1. 클라이언트가 요청하면,
  2. DispatcherServlet 이 어떤걸 요청했는데 핸들러를 조회한다는 것이 어떤 메서드를 실행할지 컨트롤러에서 메서드를 찾기
  • HandlerMapping 컴포넌트 사용
  • 대표적인 구현체 RequestMappingHandlerMapping
  • 이 객체가 @RequestMapping, @GetMapping, @PostMapping 등이 붙은 메서드를 찾아서 반환
  1. 해당 핸들러를 실행할 수 있는 적절한 어댑터를 찾기
  • 컨트롤러가 어떤 타입이냐에 따라 실행 방식을 다르게 처리해야 하므로 어댑터 필요
  • HandlerAdapter 컴포넌트 사용
  1. 반환받은 어댑터로 컨트롤러(핸들러) 호출 --> 자세한 구조 아래 이미지 첨부

4-1. 핸들러 어댑터를 통해 핸들러(컨트롤러)를 호출할 때, ArgumentResolver 를 호출

@PostMapping("/user")
public ResponseEntity<String> createUser(@RequestBody UserDto userDto) {
    // ...
}
  • HandlerMethodArgumentResolver 컴포넌트 사용 (각 파라미터에 들어갈 값(Argument) 을 만들어주는 컴포넌트)
  • 여기서 @RequestBody UserDto userDto처럼, 직접 파라미터를 전달하지 않아도 Spring이 알아서 값을 넣어주는 역할 --> ArgumentResolver가 담당

  • 즉, ArgumentResolver : 요청 데이터 --> Java 파라미터로 변환
    - @RequestBody를 처리할 때 내부적으로 HttpMessageConverter를 사용해 JSON → Java 객체로 변환
    (Jackson 라이브러리의 역할)

4-2. 변환된 데이터로 컨트롤러 호출

UserDto userDto = ... // ArgumentResolver가 만들어줌
controller.createUser(userDto); // 호출!

4-3. Controller 의 반환값을 Response 로 변환

  • HandlerMethodReturnValueHandler : Java 객체 --> Http 응답으로 변환
@GetMapping("/user")
public @ResponseBody UserDto getUser() {
    return new UserDto("홍길동", 30);
}

여기서 UserDto 객체를 --> JSON 응답으로 만들어주는 것 : ReturnValueHandler

  1. Response 형태로 반환한 값을 클라이언트에 전달하기
  • Controller 에서 반환할 수 있는 값
    • String (뷰 이름) --> JSP, Thymeleaf 템플릿 (템블릿 기반 뷰)
    • ModelAndView --> JSP, Thymeleaf 템플릿
    • @ResponseBody (직접 응답 바디) --> API 방식 (서버는 JSON 만 응답)
    • ResponseEntity<> --> API 방식
    • void --> 파일 다운로드, 이미지 출력, 스트리밍 응답

정리

요청 → DispatcherServlet → HandlerMapping → Controller 메서드 찾음  
   → HandlerAdapter → [ArgumentResolver] → 파라미터 생성  
   → Controller 메서드 실행  
   → [ReturnValueHandler] → 반환값을 HTTP 응답으로 변환

0개의 댓글