스프링 MVC 구조

핸들러 어댑터 : 중간에 어댑터 역할을 하고, 다양한 종류의 컨트롤러를 호출할 수 있다.
핸들러: 더 넓은 범위인 컨트롤러



뷰 리졸버

return new ModelAndView("new-form");
// 뷰 리졸버 반환 값
return new ModelAndView("/WEB-INF/views/new-form.jsp");



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

핸들러 매핑과 핸들러 어댑터가 어떤 것들이 어떻게 사용되는지 알아보자.

  1. Controller 인터페이스 구현
  2. HttpRequestHandler 인터페이스 구현
  3. 애노테이션 기반의 컨트롤러



@Controller

스프링이 자동으로 스프링 빈으로 등록한다. (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 됨


@RequestMapping

@RequestMapping("/hello-basic")

  • /hello-basic URL 호출이 오면 이 메서드가 실행되도록 매핑한다.
    가장 우선순위가 높은 핸들러 매핑과 핸들러 어댑터
  • RequestMappingHandlerMapping
  • 스프링 빈 중에서 @RequestMapping 또는 @Controller 가 클래스 레벨에 붙어 있는 경우에 매핑 정보로 인식한다
  • RequestMappingHandlerAdapter
  • GetMapping, PostMapping

@RequestParam

HTTP 요청 파라미터를 @RequestParam 으로 받을 수 있다.

public String requestParamV2(@RequestParam("username") String memberName)
// 파라미터
request.getParameter("username") 

GET 쿼리 파라미터, POST Form 방식을 모두 지원한다.


@ModelAttribute

요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.

@RequestParam String username;
@RequestParam int age;
HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);
// @ModelAttribute 적용 
public String modelAttributeV1(@ModelAttribute HelloData helloData) {}
  • HelloData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다.

@RequestBody & @ResponseBody

  • HTTP 메시지 바디를 직접 조회하는 기능

  • 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달하는 기능

  • @RequestBody 요청
    - JSON 요청 > HTTP 메시지 컨버터 > 객체

  • @ResponseBody 응답
    - 객체 > HTTP 메시지 컨버터 > JSON 응답

@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData data) {
 log.info("username={}, age={}", data.getUsername(), data.getAge());
 return data;
}


@RestController

  • @Controller 는 반환 값이 String 이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.
  • @RestController 는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.

@PathVariable(경로변수)

@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {}

참고
https://velog.io/@sossont/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1%ED%8E%B8-%EC%A0%95%EB%A6%AC

profile
개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN