[Spring] Spring 요청 데이터 (1)

이연우·2025년 7월 23일

TIL

목록 보기
30/100

🔹 @RequestParam란?

  • 쿼리 파라미터(Query Parameter)를 메서드 파라미터에 바인딩해 주는 방식
  • 주로 GET 방식에서 사용하지만, POST에서도 사용 가능
GET /v1/request-param?name=wonuk&age=100

📌 기본 사용법

@GetMapping("/v1/request-param")
@ResponseBody
public String paramV1(@RequestParam("name") String userName, 
                      @RequestParam("age") int userAge) {
    log.info("name={}, age={}", userName, userAge);
    return "success";
}

"name"이라는 키값을 가진 파라미터가 userName에 바인딩됨
@Controller + @ResponseBody@RestController와 동일 효과

✨ 생략 가능 예시

1. 속성값 생략

@GetMapping("/v2/request-param")
public String paramV2(@RequestParam String name, @RequestParam int age) {
    ...
}

2. 어노테이션 자체 생략 (권장 X)

@GetMapping("/v3/request-param")
public String paramV3(String name, int age) {
    ...
}

⚠️ 변수명과 파라미터명이 정확히 일치해야 하며, 명시적이지 않아 혼동될 수 있어 실무에서는 사용을 지양함

📌 required 속성

  • 파라미터의 필수 값을 설정
  • API 스펙을 규정할 때 사용
@GetMapping("/v4/request-param")
public String paramV4(@RequestParam(required = true) String name, 
                      @RequestParam(required = false) Integer age) {
    ...
}

required = true(기본값): 파라미터 없으면 400 Bad Request
required = false: 없어도 OK, 단 int는 null을 받을 수 없어 Integer로 선언해야 함

❗ 주의: ?name=처럼 값이 없는 경우는 null이 아닌 ""(빈 문자열)로 들어옴 → 예외 없이 통과됨

🎯 defaultValue 속성

  • 파라미터의 기본 값 설정
@GetMapping("/v5/request-param")
public String paramV5(@RequestParam(defaultValue = "sparta") String name, 
                      @RequestParam(defaultValue = "1") int age) {
    ...
}

→ 값이 없거나 빈 문자열이면 기본값 사용
→ 이 설정이 있으면 required는 자동으로 false처럼 작동

📦 Map으로 받기

  • Parameter를 Map 형태로 조회가 가능함
@GetMapping("/v6/request-param")
public String paramV6(@RequestParam Map<String, String> paramMap) {
    log.info("name={}, age={}", paramMap.get("name"), paramMap.get("age"));
    return "success";
}

여러 파라미터를 한 번에 받아올 때 유용
→ 값이 여러 개인 경우는 MultiValueMap<String, String> 사용

@RequestParam MultiValueMap<String, String> paramMap

🔹 @ModelAttribute

  • 파라미터들을 객체의 필드에 자동으로 매핑해 주는 방식
    주로 POST + x-www-form-urlencoded 요청에서 사용

📌 기본 개념

  • 기존 방식:
@PostMapping("/v1/tutor")
public String createTutor(@RequestParam String name, @RequestParam int age) {
    Tutor tutor = new Tutor();
    tutor.setName(name);
    tutor.setAge(age);
    ...
}
  • @ModelAttribute 사용 시:
@PostMapping("/v2/tutor")
public String createTutor(@ModelAttribute Tutor tutor) {
    ...
}

→ Spring이 Tutor 객체를 만들고, 필드 이름과 동일한 파라미터를 찾아 setter()로 자동 주입
→ 필드 이름과 파라미터 키 이름이 완전히 일치해야 함

✨ 생략 가능

@PostMapping("/v3/tutor")
public String createTutor(Tutor tutor) {
    ...
}
  • 기본형(primitive): @RequestParam 처리
  • 객체: @ModelAttribute로 자동 처리됨

⚠️ 예외 상황
1. setter 없음

@Getter
public class Tutor {

	private String name;
	private int age;

}

→ 객체 필드에 값이 set 되지 않음 값 → 바인딩 실패 → null

2. 파라미터 타입 불일치
ex) http://localhost:8080/v2/tutor + x-www-form-urlencoded

POST /v2/tutor
content-type: application/x-www-form-urlencoded

name=wonuk&age=nbcamp

BindException 발생 → Validation(검증) 필요

0개의 댓글