본문 바로가기
카테고리 없음

211115 TIL

by 오우지 2021. 11. 16.

스프링 MVC 정리

1. 요청 매핑파트

 

 

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments

 

@RestController

 

url 호출이 오면 이 메서드가 실행 되도록 매핑한다.

속성을 배열로 제공하므로 다중 설정이 가능하다. - {"/hello-basic", "/hello-go"}

 

@RequestMapping() 

 

괄호 안에 method의 값으로 HTTP 요청을 GET, POST등등 선택도 가능하지만 클래스단에서 공통 주소를 매핑해주고 

내부 개별 매서드에서 개별 url을 GetMapping PostMapping등의 어노테이션으로 묶어주면 훨씬 깔끔한 코드를 만들 수 있다.

 

 

@PathVariable

 

@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
	log.info("mappingPath userId={}, orderId={}", userId, orderId);
	return "ok";
}

다음과 같이 url 변수를 PathVariable로 받아줄 수 있다. 특정 조건을 추가할 수도 있지만 잘 사용하지는 않는다.

 

 

클라이언트에서 서버로 요청 데이터를 전달할 때 주로 3가지 방법을 사용한다.

1. GET 쿼리 파라미터

2. POST 메시지 바디에 쿼리 파라미터 형식 전달

3. HTTP message body에 데이터를 직접 담아서 요청

 

파라미터를 통해 값을 받는 방법에서 스프링에서 사용할 수 있는 여러가지 방법이 있다. 

 

@RequestParam

 

@RestController = @Controller + @ResponseBody라고 생각하면 된다.

@ResponseBody
@RequestMapping("/request-param-v5")
public String requestParamRequired(
              @RequestParam(required = true) String username,
              @RequestParam(required = false) Integer age){
      log.info("username={}, age={}", username, age);
      return "ok";
}

@RequestParam은 넘겨주는 변수와 이름이 같다면 굳이 안써도 된다. 또 만약 변수명을 바꿔서 받아주고 싶다면 RequestParam 안에 ("username")등과 같이 받는 이름을 달아주고 뒤의 String memberName과 같이 새 변수명을 달아주면 된다.

required를 통해 필요 여부도 정해서 충족하지 않는다면 400 bad request 에러를 띄울 수도 있다.

 

@ResponseBody
@RequestMapping("/request-param-v6")
public String requestParamDefalut(
              @RequestParam(defaultValue = "guest") String username,
              @RequestParam(required = false) Integer age){
      log.info("username={}, age={}", username, age);
      return "ok";
}

값이 없으면 디폴트를 넣어주는 방법도 있다. 빈 문자인 경우에도 설정한 기본값이 들어간다.

 

@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap){
        log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
        return "ok";
}

Map을 통해서 받아주는 방법도 있는데 파라미터의 값이 1개가 확실하다면 Map을 사용해도 되지만 그렇지 않다면 MultiValueMap을 사용해야 한다.

 

@ModelAttribute

 

@Data 적용시

Getter, Setter, ToString, EqualsAndHashCode, RequiredArgsConstructor를 자동 적용

 

@ResponseBody
@RequestMapping("/model-attribute-v1-1")
public String modelAttributeV1(@ModelAttribute HelloData helloData){
        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());

        return "ok";
}

위와 같이 객체도 파라미터를 객체로 받는 @ModelAttribute를 생략 가능하다

 

http 메시지 바디를 통해 데이터가 넘어오는 경우 @RequestParam, @ModelAttribute를 사용할 수 없다. 그 대신 InputStream으로 받아줄 수 있다. 

 

@RequestBody

 

HttpEntity

Http header, body  정보를 편리하게 조회하는데 쓰인다.

메시지 바디 정보를 조회하는데 위에서 지금까지 하던 요청 파라미터를 조회하는 기능과는 관계 없다.

응답에도 사용 가능하며 헤더 정보도 포함할 수 있다. 단 view조회는 불가능하다.

 

하지만 세개 중 가장 편한건 @RequestBody다.

 

@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) throws IOException {
        log.info("messageBody={}", messageBody);

        return "ok";
}

여기서 @RequestBody를 생략할 수 있을까?

정답은 못한다. 스프링은 단순타입은 @RequestParam, 나머지는 @ModelAttribute로 반환하기 때문에 HTTP 메시지 바디가 아니라 요청 파라미터를 처리하는 로직을 따르게 된다.

 

출처: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

오늘 정리

그냥 정신이 없다.