728x90
Spring MVC 아키텍처
* spring bean으로 표시 된 요소들은 스프링 빈으로 등록해야 하는것을 의미합니다.

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