[프로그래밍 기록] Spring - HTTP 요청 데이터

김엄지·2024년 3월 24일
0

Spring

목록 보기
12/21

클라이언트(브라우저)에서 서버로 HTTP 요청을 보낼 때 데이터를 함께 보낼 수 있다.

서버에서는 이 데이터를 받아서 사용해야하는데 데이터를 보내는 방식이 한 가지가 아니라 여러 가지가 있기 때문에 모든 방식에 대한 처리 방법을 배워보자.

1. 쿼리 파라미터 (HTTP GET)

  • 요청 URL에 쿼리 파라미터, 데이터를 포함해서 전달한다.
  • 클라이언트에게 직접적으로 노출이 되기 때문에 민감한 정보는 제외해야 한다
  • 검색, 필터, 페이징 등에 주로 사용된다.
  • 예를들어, 구글에 velog를 검색하면, url에 아래와 같이 나온다. 👇
https://www.google.com/search?q=velog&sourceid=chrome&ie=UTF-8

2. Form (HTTP POST)

  • Content-Type: application/x-www-form-urlencoded와 메세지 바디에 쿼리 파라미터 형식으로 전달한다.
  • 회원 가입, 상품 주문, HTML Form태그 등에 주로 사용된다.

3. HTTP Message Body

  • 메세지 바디에 데이터를 직접 담아서 전달한다.
  • HTTP API에서 주로 사용된다.
  • 데이터 형식으로는 JSON, TEXT, XML 등이 사용된다.

Path Variable

  • 요청 URL에 쿼리 파라미터는 제외하고 데이터만 전달한다.
  • 서버에 보내려는 데이터를 URL 경로에 추가할 수 있다.
// GET http://localhost:8080/hello/request/star/Robbie/age/95

@GetMapping("/star/{name}/age/{age}")
@ResponseBody
public String helloRequestPath(@PathVariable String name, @PathVariable int age)
{
    return 리턴값;
}
  • 데이터를 받기 위해서는 /star/{name}/age/{age} 이처럼 URL 경로에서 데이터를 받고자 하는 위치의 경로에 {data} 중괄호를 사용한다.
  • (@PathVariable String name, @PathVariable int age)
  • 파라미터에 @PathVariable 애너테이션과 함께 {name} 중괄호에 선언한 변수명과 변수타입을 선언하면 해당 경로의 데이터를 받아올 수 있다.

Request Param

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

[GET]

// GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95

@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
    return 리턴값;
}
  • 데이터를 받기 위해서는 ?name=Robbie&age=95 에서 key 부분에 선언한 name과 age를 사용하여 value에 선언된 Robbie, 95 데이터를 받아올 수 있다.
  • (@RequestParam String name, @RequestParam int age)
  • 파라미터에 @RequestParam 애너테이션과 함께 key 부분에 선언한 변수명과 변수타입을 선언하면 데이터를 받아올 수 있다.

[form 태그 POST]

// POST http://localhost:8080/hello/request/form/param
// Header
//  Content type: application/x-www-form-urlencoded
// Body
//  name=Robbie&age=95

@PostMapping("/form/param")
@ResponseBody
public String helloPostRequestParam(@RequestParam String name, @RequestParam int age) {
    return 리턴값;
}

HTTP 데이터를 객체로 처리하는 방법

ModelAttribute

해당 데이터를 Java의 객체 형태로 받는 방법은 @ModelAttribute 애너테이션을 사용한 후 Body 데이터를 Star star 받아올 객체를 선언한다.

[form 태그 POST]

// POST http://localhost:8080/hello/request/form/model
// Header
//  Content type: application/x-www-form-urlencoded
// Body
//  name=Robbie&age=95

@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
    return 리턴값;
}

[Query String 방식]

// GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95

@GetMapping("/form/param/model")
@ResponseBody
public String helloRequestParam(@ModelAttribute Star star) {
    return 리턴값;
}
  • 데이터가 여러개라면 @RequestParam 애너테이션으로 하나 씩 받아오기 힘들 수 있다.
  • 이때 @ModelAttribute 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있다.
  • 파라미터에 선언한 Star 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 name & age 의 값이 담겨진다.

RequestBody

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

// POST http://localhost:8080/hello/request/form/json
// Header
//  Content type: application/json
// Body
//  {"name":"Robbie","age":"95"}

@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
    return 리턴값;
}

마무리

이론을 정리하는 것은 그닥 기억에 남지 않는 것 같다. postman으로 직접 값을 넣어서 확인해야 직관적으로 개념들이 잘 들어오는거 같다.
postman으로 나중에 내용을 더 추가해보자.


참고자료

profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글