본문 바로가기

Develop/Spring

Spring MVC

728x90

Spring MVC 아키텍처

* spring bean으로 표시 된 요소들은 스프링 빈으로 등록해야 하는것을 의미합니다.

Spring MVC 동작 과정

  1. 클라이언트가 URL을 통해서 Request 전송
  2. 디스패쳐 서블릿은 Request를 처리하기 위한 Controller를 HandlerMapping 빈에게 검색 요청
  3. HandlerMapping은 Client의 URL을 사용하여 이를 처리할 Controller 반환
  4. 디스패쳐 서블릿은 Controller 객체를 처리할 수 있는 HandlerAdapter에게 처리 위임
    (@Controller, Controller Interface, HttpRequestHandler 어떤 방식이든 동일한 처리를 위해 HanlderAdapter가 사용됨)
  5. HandlerAdapter는 Controller에게 알맞은 메서드 호출
  6. Controller는 비즈니스 로직 수행 후 처리 결과를 HandlerAdapter에게 반환
  7. HandlerAdapter는 DispatcherServlet에게 Controller의 실행 결과를 ModelAndView 객체로 변환 후 반환
  8. 디스패쳐 서블릿은 결과를 보여줄 View를 검색하기 위해 ViewResolver 빈 객체에게 ModelAndView 안의 해당 View 검색
  9. ViewResolver는 ModelAndView 안의 View 이름에 해당하는 View 객체를 찾거나 생성해서 반환
  10. DispatcherServlet은 ViewResolver가 반환한 View 객체에게 request result 생성 요청
  11. request result를 클라이언트에게 반환

참조) https://velog.io/@gillog/Spring-MVC-%EA%B5%AC%EC%A1%B0

Spring MVC 기본 HTTP 요청 매핑

Controller/RestController의 차이

  • Controller: 응답 값이 기본적으로 HTML을 주도록 되어 있습니다.
  • RestController: 응답 값으로 Rest API 요청에 대한 응답(주로 JSON)을 주도록 되어 있습니다.

Mapping Annotation

  • @RequestMapping: GET, POST 등 요청 방식을 직접 지정합니다.
@Slf4j
@RestController
public class SampleController {

    @RequestMapping(value = "/order/1", method = RequestMethod.GET)
    public String getOrder() {
        log.info("Get some order");
        return "orderId:1, orderAmount:1000";
    }
}

축약형 Mapping Annotation

스프링 4.X 중반 버전부터 지원

  • @GetMapping: 데이터를 가져옴
  • @PostMapping: 데이터를 전송함
  • @PutMapping: 전체 수정
  • @PatchMapping: 일부 수정
  • @DeleteMapping: 삭제
@Slf4j
@RestController
public class SampleController {
    
    @PostMapping("/order")
    public String createOrder() {
        log.info("Create order");
        return "order created -> orderId:1, orderAmount:1000";
    }
}

Spring HTTP 요청 파라미터 전송

파라미터를 넘기는 방법

Get, Delete

PathVariable: 요새는 id를 path에 넣는 것을 선호

  • @PathVaribale("id") String identity;
  • 하지만 이름이 같으면 생략 가능
  • 여러 개를 넣을 수 있음

query-params: 추가적인 정보들 입력

  • 게시판의 검색 필터 페이징에서 많이 사용합니다.
  • @RequestParam("orderId") String orderId
  • PathVariable처럼 이름을 동일하게 하면 자동으로 받아줌(생략 가능)
  • required, defaultValue로 세부적인 옵션 설정 가능
  • Map, MultiValueMap 으로 요청 받는 것도 가능함(잘 안씀)
    @GetMapping("/order/{orderId}")
    public String getOrder(@PathVariable("orderId") String orderId) {
        log.info("Get some order information : " + orderId);
        return "orderId: " + orderId + ", orderAmount:100";
    }
    
    @GetMapping("/order")
    public String searchOrder(@RequestParam("orderId") String orderId,
                              @RequestParam("orderAmount") Integer orderAmount) {
        log.info("Search order information : " + orderId + 
                ", orderAmount : " + orderAmount);
        return "orderId: " + orderId + ", orderAmount: " + orderAmount;
    }

POST, PUT, PATCH

  • @RequestBody: http body 정보를 편리하게 받을 수 있습니다.
  • 주로 사용하는 메세지 포맷은 JSON(현재 사실상의 표준)
  • @RequestHeader: http header 정보를 편리하게 받을 수 있습니다.
    @PostMapping("/order")
    public String createOrder(
            @RequestBody OrderCreateRequest orderCreateRequest,
            @RequestHeader String userAccountId
    ) {
        log.info("Create order : " + orderCreateRequest + ", userAccountId : " + userAccountId);
        return "orderId:2, orderAmount:1000";
    }

'Develop > Spring' 카테고리의 다른 글

Spring Exception  (0) 2022.11.19
Spring Filter, Interceptor  (0) 2022.11.17
(작성 중) Spring web.xml  (0) 2022.11.16
Spring SpEL  (0) 2022.11.16
Spring DataBinding  (0) 2022.11.16