@RequestParam, @PathVariable, @ModelAttribute, @RequestBody

김태훈·2024년 1월 2일
0

Spring

목록 보기
5/16

@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);
}

0개의 댓글