본문 바로가기
Spring Framework/Spring

스프링 MVC - HTTP Request,Response

by 도쿠니 2022. 6. 8.

스프링 기본 HTTP 요청 매핑

Controller 어노테이션

  • 클래스 단위에 추가하며, 자동으로 빈 등록을 해줍니다.

Controller 어노테이션 종류

  • @Controller
    • 반환 값이 String 이면 뷰 이름으로 인식하고 뷰를 찾은 후 뷰를 렌더링합니다.
    • 응답 값이 기본적으로 HTML을 주도록 되어 있습니다.
  • @RestController
    • HTTP 메시지 바디에 바로 입력
    • 응답 값으로 Rest API 요청에 대한 응답(주로 JSON)을 주도록 되어있습니다.
    • @ResponseBody + @Controller
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {}

매핑 어노테이션

  • 메소드 단위에 추가합니다.
  • URL을 매핑하여 해당 URL로 요청이 들어오면 매핑한 메소드가 실행됩니다.
  • 만약 클래스 단위에 추가하면, 클래스 단위 매핑 + 메소드 단위 매핑 으로 매핑됩니다.
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/hello")
@RestController
public class TestController {

    @RequestMapping(value = "/world", method = RequestMethod.GET)
    public String printWorld() {
        return "Hello World!";
    }
}

매핑 어노테이션

  • @RequestMapping
    • GET, POST 등의 요청 방식을 직접 지정합니다.
    • 요새는 잘 안쓰인다고 합니다.

축약형 매핑 어노테이션

  • @GetMapping
    • 웹에서 데이터를 요청할 때 사용
  • @PostMapping
    • 웹에서 데이터를 전송할 때 사용
  • @PutMapping
    • 웹에서 데이터를 전체 수정할 때 사용
  • @PatchMapping
    • 웹에서 데이터를 일부 수정할 때 사용
  • @DeleteMapping
    • 웹에서 데이터를 삭제할 때 사용

스프링 HTTP 요청 파라미터 전송

  • 파라미터를 넘기는 방법
    • Get, Delete
      • PathVariable (경로 변수) 사용
        • @PathVariable(”id”) String id; 이런 형식으로 사용
        • 만약, 경로 변수명과 파라미터 명이 같으면 경로변수명 생략 가능합니다.
        • 여러번 사용할 수 있습니다.
        • 요새는 위의 예시처럼 HTTP API에서 다음과 같이 리소스 경로에 식별자를 넣는 스타일을 선호한다고 합니다.
      @GetMapping("/user/{userId}/orders/{orderId}")
      public String getUserOrderInfo(@PathVariable("userId") String userId,@PathVariable String orderId) {
      	 return "userId: " + userId + ", orderId: " + orderId;
      }
      
      • query-params
        • URL로 오는 쿼리스트링의 파라미터를 받을 수 있습니다.
          • 쿼리스트링이란 사용자가 입력 데이터를 전달하는 방법 중의 하나
          • localhost:8080/?key1=value1&key2=value2 이런 형식으로 사용됩니다.
        • 게시판의 검색 필터 페이징에서 많이 사용하는 방식입니다.
        • @RequestParam 이용
          • @PathVariable 처럼 이름이 동일하면 자동으로 받아줍니다.
            • String, int , Integer 같은 단순 타입이면 어노테이션 조차 생략가능합니다.
            • 대신 required 옵션이 false로 설정됩니다.
          • required 옵션
            • true 가 기본값이며, 해당 파라미터 값이 없을 경우 예외 발생
            • false 설정 시, 쿼리스트링에 파라미터가 없어도 예외가 발생하지 않습니다.
          • defaultValue 옵션
            • 해당 파라미터에 값이 없을 경우 기본 값을 설정하며 에러발생 X
          • 하나의 키로 여러 값이 들어올 때 Map, MultiValueMap으로 받을 수 있습니다.
      @GetMapping("/world")
      public String printWorld(@RequestParam("id") String id, @RequestParam String number) {
              return "id = "+id + ",  number = "+number;
      }
      
    • Post, Put, Patch
      • @RequestBody
        • http body 정보를 편리하게 받아올 수 있습니다.
          • body 정보를 읽어오기 때문에 Header 정보에서 값을 읽어오는 Get방식에서는 사용할 수 없습니다.
          • 주로 JSON을 받아올 때 사용하는데, 데이터를 객체에 바로 매핑해줍니다.
            • 클래스의 변수 명과 타입이 JSON의 키값과 동일해야합니다
            • Setter가 없더라도 작동합니다.
          // JavaBean 객체 생성
          import lombok.Getter;
          
          @Getter
          public class TestDto {
              private String name;
              private int age;
          }
          
          // 컨트롤러
          @RequestMapping("/hello")
          @RestController
          public class TestController {
          
              @PostMapping("/world")
              public String printWorld(@RequestBody TestDto testDto) {
                  return "name = "+testDto.getName() + ",  age = "+testDto.getAge();
              }
          }
          

      • @RequestHeader
        • http header 정보를 편리하게 받을 수 있습니다.
  • 공용
    • @ModelAttribute
      • 클라이언트가 전송하는 HTTP parameter(URL 끝에 추가하는 파라미터), HTTP Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 바인딩합니다.
      • 보통 form으로 데이터를 보낼 때 많이 사용합니다.
      • @RequestParam처럼 조건만 맞으면 생략가능합니다
        • RequestParam은 단순타입일 경우에만 생략가능
        • ModelAttribute는 그 외의 경우 생략가능
      • @RequestBody와의 차이점
        • ModelAttribute는 객체에 setter가 필요하지만 RequestBody는 필요 없습니다.
        • ModelAttribute는 쿼리스트링으로 들어오는 파라미터까지 받을 수 있지만, RequestBody는 안됩니다.
        • ModelAttribute는 HTTP Body 내용이 multipart/form-data여야만 가능하며 application/json이 안되지만, RequestBody는 그 반대입니다.

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

스프링 MVC - 예외처리 (REST API)  (0) 2022.06.09
스프링 MVC - Filter , Interceptor  (0) 2022.06.08
스프링 MVC - 전체 구조  (0) 2022.06.08
Spring Validation  (0) 2022.06.07
Data Binding  (0) 2022.06.07

댓글