[TIL] 스프링 입문 TIL - 26/04/09

신여원·2026년 4월 9일

내일배움캠프

목록 보기
4/15

오늘 할 일

공부한 내용

Path Variable과 Request Param

  • Client(브라우저)에서 서버로 HTTP 요청을 보낼 때 데이터를 함께 보낼 수 있음

Path Variable 방식
: 서버에 보내려는 데이터를 URL 경로에 추가할 수 있음
🌐 GET http://localhost:8080/hello/request/star/Robbie/age/95

// [Request sample]
// 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 String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
}

Request Param 방식
: 서버에 보내려는 데이터를 URL 경로 마지막에 ?&를 사용하여 추가할 수 있음
🌐 GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95

// [Request sample]
// 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 String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}

form 태그 POST
: HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있음
🌐 POST http://localhost:8080/hello/request/form/param

  • 이때 해당 데이터는 HTTP Body에 name=Robbie&age=95 형태로 담겨져 서버로 전달됨
<form method="POST" action="/hello/request/form/model">
  <div>
    이름: <input name="name" type="text">
  </div>
  <div>
    나이: <input name="age" type="text">
  </div>
  <button>전송</button>
</form>
// [Request sample]
// 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 String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
  • @RequestParam은 생략 가능
  • @RequestParam(required = false)
    • required 옵션을 false로 설정하면 Client에서 전달받은 값들에서 해당 값이 포함되어있지 않아도 오류가 발생하지 않음
    • Client로 부터 값을 전달 받지 못한 해당 변수는 null로 초기화됨
      (required = false 설정이 안되어있다면, 오류 발생)

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

@ModelAttribute

// [Request sample]
// 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 String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
- HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있음
-> 이때 해당 데이터는 HTTP Body에 `name=Robbie&age=95` 형태로 담겨져서 서버로 전달됨
- `@ModelAttribute` 어노테이션을 사용한 후 Body 데이터를 `Star star` 받아올 객체로 선언함
// [Request sample]
// 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 String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
- `?name=Robbie&age=95`처럼 데이터가 두 개만 있다면 괜찮지만, 여러 개 있다면 `@RequestParam` 어노테이션으로 하나씩 받아오기 힘들 수 있음
-> 이때 `@ModelAttribute`를 사용하면 Java의 객체로 데이터를 받아올 수 있음
	- 파라미터에 선언한 `Star` 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 `name & age`의 값이 담겨짐
  • @ModelAttribute는 생략 가능하다.
  • @ModelAttribute@RequestParam이 모두 생략 가능한데 Spring에서 어떻게 구별할까
    - Spring은 해당 파라미터(매개변수)가 SimpleType이라면 @RequestParam으로 간주하고, 아니라면 @ModelAttribute가 생략되어있다고 판단한다.

@RequestBody

// [Request sample]
// 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 String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
  • HTTP Body에 {"name":"Robbie","age";"95"} JSON 형태로 데이터가 서버에 전달되었을 때 @RequestBody 어노테이션을 사용해 데이터를 객체 형태로 받을 수 있음
  • 데이터를 객체로 받아올 때 주의할 점
    - 해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요함

문제 & 오류

내일 할 일

profile
경북대학교 컴퓨터학부

0개의 댓글