[spring] @PathVariable, @RequestParam, @RequestBody, @ResponseBody

지우개·2024년 5월 1일
0

spring

목록 보기
1/2

@PathVariable

  • URI의 경로의 일부를 파라미터로 사용
  • /user/{id} /{id}와 같이 URI의 경로로 넘어오는 값을 변수로 받을 수 있음
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/pathVariable/{id}")
    public String pathVariableTest(@PathVariable Long id){
        return id.toString();
    }
}

http://localhost:8080/test/pathVariable/{id} 로 Get 요청을 보내면 {id} 값을 얻을 수 있음.


  • URI 변수 이름과 메소드 매개변수 이름이 반드시 동일해야 하는 것은 아님.
  • 다를 경우 @PathVariable("userId") 처럼 지정해 줄 수 있음.
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/pathVariable/{userId}")
    public String pathVariableTest(@PathVariable("userId") Long id){
        return id.toString();
    }
}


  • 여러개의 @PathVariable 어노테이션을 사용할 경우 URI 변수를 어노테이션으로 지정된 매개변수 숫자에 맞게 설정하면 됨.
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/pathVariable/{userId}/{orderId}")
    public String pathVariableTest(@PathVariable("userId") Long uid, @PathVariable("orderId") Long oid){
        return "userId = " + uid + " orderId = " + oid;
    }
}




@RequestParam

  • 쿼리 스트링에서 값을 가져옴.
  • ?id={id} 와 같이 요청 파라미터로 넘어오는 값을 받을 수 있음.
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/requestParam")
    public String requestParamTest(@RequestParam Long id){
        return id.toString();
    }
}


  • @RequestParam 어노테이션에 명시된 매개변수 값은 반드시 파라미터 값이 넘어와야 함.
  • 넘어오지 않으면 400에러(Bad Request)가 발생
  • 필수 파라미터가 아닌 경우 required=false 설정을 추가(기본 설정은 required=true)
  • 이렇게 하면 파라미터가 넘어오지 않아도 에러가 발생하지 않음.

근데

  • 필수가 아닌 파라미터 값이 없을 때 null 값을 할당하는데, null 할당이 불가능한 기본 데이터 타입의 경우 타입 변환 에러가 발생함.
  • 따라서 defaultValue 속성을 통해 기본 값을 설정해야함.
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/requestParam")
    public String requestParamTest(@RequestParam(required=false, defaultValue = "123456789") Long id){
        return id.toString();
    }
}




@RequestBody

  • @RequestBody는 반환하고자 하는 리소스가 복잡할 때 사용함.
  • 기본 자료형이 아닌 오브젝트처럼 복잡한 자료형을 요청에 보내고 싶은 경우 사용
  • 즉, JSON 데이터를 원하는 타입의 객체로 변환해야 하는 경우에 사용
  • HTTP 요청의 body를 자바 객체로 받을 수 있게 해줌.
  • 주로 비동기 처리 구현 시 @ResponseBody와 함께 자주 사용됨.

클라이언트에서 서버로 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아 서버로 보내면 서버에서 @RequestBody 어노테이션을 사용해 HTTP 요청 본문에 담긴 값들을 자바 객체로 변환시켜 객체에 저장.

@Builder
@Getter
public class TestDTO {
    private int id;
    private String message;

    public TestDTO(int id, String message) {
        this.id = id;
        this.message = message;
    }
}
@RestController
@RequestMapping("/test")
public class TestController {

    @PostMapping("/requestBody")
    public ResponseEntity<TestDTO> requestBodyTest(@RequestBody TestDTO dto){
        return ResponseEntity.ok(dto);
    }
}

Post? Get?

  • @RequestBody는 원칙상 Request Body 안에 Json만 포함한다면 Get, Post 둘 다 가능.
  • 그렇지만 웬만해선 Post만 사용해야 함.
  • @RequestBody는 Body안에 Json을 포함해야하는 것이 룰이지만 Get은 Content Type을 설정해서 보내지 않음.
    (데이터 타입을 Query String 형태로 보내는 것이 일반적이기 때문임)

Post로는 Body에 Json으로 요청하는 것이 일반적이고 또 이런 경우 Restful Semantics이라는 표현을 쓰는데, Rest Api에서는 의미론적으로 Get에 Body를 담아버리면 Api의 의도를 파악하기가 어려울 수 있기 때문에 Post는 Post 답게 Get은 Get 답게 쓰는 것을 권장한다.




@ResponseBody

  • spring 4.x 버전부터 지원하는 @RestController는 @Controller와 @ResponseBody 어노테이션의 기능을 포괄하는 어노테이션임.
  • 즉, @RestController를 붙이면 클래스 하위 메서드들에 따로 @ResponseBody를 붙이지 않아도 JSON형태의 데이터를 전송할 수 있음(@Controller 어노테이션도 마찬가지)
@Builder
@Getter
public class TestDTO {
    private int id;
    private String message;

    public TestDTO(int id, String message) {
        this.id = id;
        this.message = message;
    }
}
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/responseBody")
    public ResponseEntity<TestDTO> responseBodyTest(){
        TestDTO dto = TestDTO.builder()
                .id(123456789)
                .message("Hello world!")
                .build();

        return ResponseEntity.ok(dto);
    }
}

0개의 댓글

관련 채용 정보