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 메서드 또는 오버로딩된 생성자의 유무를 확인하시면 좋음
'컴퓨터 프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Ioc (제어의 역전) 와 DI (의존성 주입) (0) | 2024.08.16 |
---|---|
[Spring] CRUD (0) | 2024.08.13 |
[Spring] 데이터를 Client 에 반환, Jackson 라이브러리 (0) | 2024.08.12 |
[Spring] Controller, 정적 페이지와 동적 페이지 (0) | 2024.08.12 |
[Spring] Gradle, Lombok (0) | 2024.08.11 |