본문 바로가기
컴퓨터 프로그래밍/Spring

[Spring] PathVariable, RequestParam, ModelAttribute, RequestBody

by 한33 2024. 8. 13.

Client (브라우저) 에서 서버로 HTTP 요청을 보낼 때 데이터를 함께 보내는 방식에는 여러 방식이 있다.

 

아래의 hello-request-form.html 을 우선 불러왔다.

 

@PathVariable

서버에 보내려는 데이터를 URL 경로에 추가해서 보낼 수 있다.

  • 데이터를 받기 위해서는 /star/{name}/age/{age} 이처럼 URL 경로에서 데이터를 받고자 하는 위치의 경로에 {data} 중괄호를 사용
  • (@PathVariable String name, @PathVariable int age)
  • 그리고 해당 요청 메서드 파라미터에 @PathVariable 애너테이션과 함께 {name} 중괄호에 선언한 변수명과 변수타입을 선언하면 해당 경로의 데이터를 받아옴

@RequestParam

form 태그 GET

서버에 보내려는 데이터를 URL 경로 마지막에 ?  & 를 사용하여 추가할 수 있다.

  • 데이터를 받기 위해서는 ?name=Robbie&age=95 에서 key 부분에 선언한 name과 age를 사용하여 value에 선언된 Robbie, 95 데이터를 받아올 수 있음
  • (@RequestParam String name, @RequestParam int age)
  • 해당 요청 메서드 파라미터에 @RequestParam 애너테이션과 함께 key 부분에 선언한 변수명과 변수타입을 선언하면 데이터를 받아올 수 있음

form 태그 POST

 

 

이때 해당 데이터는 HTTP Body에 name=Robbie&age=95 형태로 담겨져서 서버로 전달

  • @RequestParam은 생략이 가능
  • @RequestParam(required = false)
  • required 옵션을 false로 설정하면 Client에서 전달받은 값들에서 해당 값이 포함되어있지 않아도 오류가 발생하지 않음
  • @PathVariable(required = false) 도 해당 옵션이 존재
  • Client로 부터 값을 전달 받지 못한 해당 변수는 null로 초기화

@ModelAttribute

form 태그 POST

  • HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있음
  • 해당 데이터는 HTTP Body에 name=Robbie&age=95 형태로 담겨져서 서버로 전달
  • 해당 데이터를 Java의 객체 형태로 받는 방법은 @ModelAttribute 애너테이션을 사용한 후 Body 데이터를 Star star 받아올 객체를 선언

QueryString

  • ?name=Robbie&age=95 처럼 데이터가 두 개만 있다면 괜찮지만 여러 개 있다면 @RequestParam 애너테이션으로 하나 씩 받아오기 힘듦
  • 이때 @ModelAttribute 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있음
    • 파라미터에 선언한 Star 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 name & age 의 값이 담겨짐
  • @ModelAttribute 생략 가능

@RequestBody

 

HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받을 수 있음

 

HTTP Body에 {"name":"Robbie","age":"95"} JSON 형태로 데이터가 서버에 전달되었을 때 @RequestBody 애너테이션을 사용해 데이터를 객체 형태로 받을 수 있음

 

※ 데이터를 Java 의 객체로 받아올 때 주의사항

  • 해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요
    • 예를 들어 @ModelAttribute 사용하여 데이터를 받아올 때 해당 객체에 set 메서드 혹은 오버로딩된 생성자가 없다면 받아온 데이터를 해당 객체의 필드에 담을 수 없음
    • 이처럼 객체로 데이터를 받아올 때 데이터가 제대로 들어오지 않는다면 우선 해당 객체의 set or get 메서드 또는 오버로딩된 생성자의 유무를 확인하시면 좋음