본문 바로가기
Java , Spring/Spring

[Spring] @PathVariable, @RequestParam, @ModelAttribute, @RequestBody

by 방배킹 2023. 8. 21.

@PathVariable

@Controller
public class UserController {
	@GetMapping("/user/{userName}")
	public String user(@PathVariable("userName") String userName){ 
		log.info("userName={}",userName);
		return "ok";
	}
}
// (@PathVariable String userName)로 생략 가능

{userName} 처럼 url 탬플릿을 지정하고 @PathVariable을 통해 해당 값을 인자로 받아 올수있다.

 

@Controller
public class UserController {
	@GetMapping("/user/{userName}/order/{order}")
	public String user(@PathVariable String userName, @PathVariable int order){
		log.info("userName={}",userName);
        log.info("order={}",order);
		return "ok";
	}
}

여러개도 사용할수 있다.

 

@RequestParam

@Controller
public class UserController {
	@GetMapping("/user")
	public String user(@RequestParam("userName") String userName){ 
		log.info("userName={}",userName);
		return "ok";
	}
}

얼핏 보면 @PathVariable과 다른게 없어보이지만 요청 url에 차이가 있다.

@RequestParam은 요청 url 이 /user?userName=exampleName 과 같은식으로 구성된다.

쿼리 파라미터에 데이터를 포함해서 전달한다. HttpServletRequest의 request.getParameter과 동일한 방법이다.

 

@ModelAttribute

@Data
public class userData {
 	private String username;
 	private int age;
}

다음과 같은 데이터가 있을때, 위의 @RequestParam을 통해서 username과 age를 받아와서

UserData data = new UserData();
data.setUsername(username);
data.setAge(age)

다음과 같이 UserData를 만든다. 하지만 @ModelAttribute를 사용하면 위 코드를 자동으로 해준다.

@RequestMapping("/model-attribute")
public String modelAttributeV1(@ModelAttribute UserData userData) {
 	log.info("username={}, age={}", userData.getUsername(), userData.getAge());
 	return "ok";
}

 

@RequestBody

HTTP 메시지 바디 정보를 편리하게 조회할 수 있다. (HTTP  헤더 정보가 필요하면 HttpEntity 또는 @RequestHeader를 사용하면 된다.)

메시지 바디 정보를 직접 조회하는 방법으로 요청 파라미터를  조회하는 @RequestParam, @ModelAttribute 과는 관계가 없다.

xml, json 기반의 메시지를 사용하는 요청의 경우 @RequestBody를 사용하면 매우 편리하게 사용할 수 있다.

 

@RequestMapping("/requestBodyJson")
public String requestBodyJson(@RequestBody UserData userData) {
 	log.info("username={}, age={}", userData.getUsername(), userData.getAge());
 	return "ok";
}

댓글