ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @RequestParam, @PathVariable, @ModelAttribute, @RequestBody
    Spring 2024. 2. 22. 01:50

    @RequestParam과 @PathVariable

    브라우저에서 서버로 HTTP 요청을 보낼 때, 데이터를 함께 보낼 수 있습니다.
    서버에서는 이 데이터를 받아서 사용해야하는데 이 때 데이터를 보내는 방식들이 있습니다.

    • uri를 통해 값을 전달하는 방식은 2가지가 있습니다.

    @PathVariable

    http://localhost:8080/request/taehoon/28

    	@ResponseBody
    	@GetMapping("/request/{name}/{age}")
    	public String pathVariable(@PathVariable String name, @PathVariable int age) throws Exception {
        	return String.format("이름 = %s, 나이 = %d");
    	}

    uri 경로에 추가한 데이터를 { } 중괄호를 이용하여 데이터를 받아올 수 있습니다.

    해당 요청 메서드 파라미터에 @PathVariable 애너테이션과 함께 {name} 중괄호에 선언한 변수명과 변수타입을 선언하면 해당 경로의 데이터를 받아올 수 있습니다.

    @ReqeusetParam

    http://localhost:8080/request?name=taehoon&age=28

    	@ResponseBody
    	@GetMapping("/request/form/param")
    	public String requestParam(@RequestParam String name, @RequestParam int age) throws Exception {
        	return String.format("이름 = %s, 나이 = %d");
    	}

    서버에 보내려는 데이터를 URL 경로 마지막에 쿼리스트링 ? 와 & 를 사용하여 추가할 수 있습니다.

    Header
    Content type: application/x-www-form-urlencoded
    Body
    name=Taehoon&age=28

    이 때 Get 방식이 아닌, Post 방식으로 HTTP 요청을 보낸다면 HTTP Body에 값이 담겨져 서버로 전달 됩니다.

    해당 데이터 또한 @RequestParam 애너테이션을 통해 값을 받아올 수 있습니다.

    둘 모두 required = false를 사용하면

    @RequestParam(required = false)
    @PathVariable(required = false)

    Client에서 전달받은 값에 해당 값이 포함되지 않아도 오류가 발생하지 않고 해당 전달받지 못한 변수는 null로 초기화 됩니다.

    @ModelAttribue, @RequestBody

    HTTP 데이터를 각 변수에 전달 받는 것이 아닌 객체로 처리하는 방법입니다.

    @ModelAttribute

    데이터가 두 개만 있다면 괜찮지만 여러 개 있다면 @RequestParam 애너테이션으로 하나 씩 받아오기 힘들 수 있습니다.
    이때 @ModelAttribute 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있습니다.
    파라미터에 선언한 User 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 name & age 의 값이 담겨집니다.

    // [Request sample]
    // POST http://localhost:8080/request/form/model
    // Header
    //  Content type: application/x-www-form-urlencoded
    // Body
    //  name=Taehoon&age=30
    @PostMapping("/form/model")
    @ResponseBody
    public String requestBodyForm(@ModelAttribute User user) {
        return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", user.name, user.age);
    }

    @RequestBody

    HTTP Body에 쿼리스트링 방식이 아닌 JSON 데이터{"name":"Robbie","age":"95"}의 형태로 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받을 수 있습니다.

    // [Request sample]
    // POST http://localhost:8080/request/form/json
    // Header
    //  Content type: application/json
    // Body
    //  {"name":"Taehoon","age":"30"}
    @PostMapping("/form/json")
    @ResponseBody
    public String postRequestJson(@RequestBody User user) {
        return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", user.name, user.age);
    }

    'Spring' 카테고리의 다른 글

    DI, IoC  (0) 2024.02.22
    Spring 3 Layer Architecture  (0) 2024.02.22
    Servlet  (0) 2024.02.22
    MVC 디자인 패턴  (0) 2024.02.22
    Client, Server, REST  (0) 2024.02.22
Designed by Tistory.