Spring Boot에서 GET 및 POST 요청 파라미터 수신 방법 완벽 정리

GET 요청 파라미터 처리 방식

1. 단일 파라미터 직접 바인딩

파라미터가 소수일 경우, 메서드 인수로 직접 받는 것이 간편하다. 이때 요청 쿼리 파라미터 이름과 메서드 매개변수 이름이 일치해야 한다.

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @GetMapping("/search")
    public void findUser(String username, Integer birthYear) {
        log.info("사용자명: {}", username);
        log.info("출생년도: {}", birthYear);
    }
}

2. @RequestParam 어노테이션 사용

보다 명시적인 제어가 필요할 때 @RequestParam을 활용한다. 필수 여부와 커스텀 파라미터 이름 지정이 가능하다.

@GetMapping("/search")
public void findUser(
    @RequestParam(value = "username", required = true) String user,
    @RequestParam(value = "birthYear", required = false) Integer year) {
    
    log.info("사용자: {}, 출생년도: {}", user, year);
}

3. DTO 객체를 통한 데이터 수집

여러 필드를 포함하는 경우, 전용 데이터 전송 객체(DTO)를 사용하면 코드의 가독성과 유지보수성이 향상된다. GET 요청에서는 @RequestParam 생략 가능.

@GetMapping("/search")
public void findUser(UserQueryDto query) {
    log.info("검색 조건 - 이름: {}, 나이: {}", query.getName(), query.getAge());
}

// 별도 클래스 또는 내부 정적 클래스
static class UserQueryDto {
    private String name;
    private Integer age;
    
    // getter/setter or Lombok @Data
}

4. HttpServletRequest 직접 활용

표준 서블릿 API를 사용해 파라미터를 수동으로 추출할 수 있다. 유연하지만 타입 변환은 개발자가 직접 처리해야 한다.

@GetMapping("/search")
public void findUser(HttpServletRequest request) {
    String name = request.getParameter("name");
    String ageStr = request.getParameter("age");
    Integer age = ageStr != null ? Integer.parseInt(ageStr) : null;

    log.info("이름: {}, 나이: {}", name, age);
}

5. 경로 변수(@PathVariable) 사용

RESTful 스타일의 URL에서 특정 값을 경로 일부로 포함하고 싶을 때 사용한다.

@GetMapping("/profile/{userId}/{category}")
public void getUserProfile(@PathVariable String userId, 
                           @PathVariable String category) {
    log.info("사용자 ID: {}, 카테고리: {}", userId, category);
}

6. 배열 및 컬렉션 파라미터 수신

같은 이름의 파라미터가 여러 개 전달될 수 있으며, 이를 배열이나 리스트 형태로 받을 수 있다. 컬렉션은 반드시 @RequestParam 선언이 필요하다.

@GetMapping("/tags")
public void getTags(@RequestParam String[] tags) {
    Arrays.stream(tags).forEach(tag -> log.info("태그: {}", tag));
}

@GetMapping("/categories")
public void getCategories(@RequestParam List<String> categories) {
    categories.forEach(cat -> log.info("카테고리: {}", cat));
}

POST 요청 파라미터 처리 전략

1. 평문 또는 폼 데이터 바인딩

폼 형식(application/x-www-form-urlencoded) 데이터는 GET과 동일한 방식으로 처리 가능하다.

@PostMapping("/register")
public void createUser(String email, String password) {
    log.info("이메일: {}, 비밀번호 길이: {}", email, password.length());
}

2. @RequestParam을 통한 명시적 선언

@PostMapping("/register")
public void createUser(
    @RequestParam("email") String userEmail,
    @RequestParam(value = "agreeTerms", defaultValue = "false") Boolean agreed) {
    
    log.info("동의 여부: {}", agreed);
}

3. HttpServletRequest 기반 수신

모든 포스트 파라미터를 동적으로 처리해야 할 때 유용하다.

@PostMapping("/submit")
public void handleForm(HttpServletRequest request) {
    Enumeration<String> paramNames = request.getParameterNames();
    while (paramNames.hasMoreElements()) {
        String key = paramNames.nextElement();
        String value = request.getParameter(key);
        log.info("{} = {}", key, value);
    }
}

4. DTO를 이용한 구조적 데이터 수신

form-data 또는 x-www-form-urlencoded 형식의 요청 본문에 대해 자동 바인딩이 가능하다.

@PostMapping("/create")
public void createStudent(StudentInfo info) {
    log.info("학생 정보 - 이름: {}, 학년: {}", info.getName(), info.getGrade());
}

static class StudentInfo {
    private String name;
    private Integer grade;
    // getter, setter
}

5. JSON 요청 본문 수신 (@RequestBody)

API 통신에서 가장 일반적인 방식으로, 클라이언트가 application/json 타입으로 전송한 데이터를 역직렬화한다.

@PostMapping("/batch")
public void updateUsers(@RequestBody List<UserInfo> users) {
    users.forEach(u -> log.info("업데이트 대상: {}", u.getName()));
}

@PostMapping("/raw")
public void receiveRawJson(@RequestBody String rawJson) {
    log.info("원시 JSON 문자열: {}", rawJson);
}

6. Map을 통한 유연한 파라미터 수신

구조가 고정되지 않은 입력을 처리하거나, 다이나믹한 필드를 받아야 할 때 유용하다.

@PostMapping("/dynamic")
public void processInput(@RequestParam Map<String, Object> input) {
    input.forEach((key, value) -> log.info("{}: {}", key, value));
}

태그: Spring Boot HTTP 요청 RequestParam RequestBody PathVariable

5월 28일 02:10에 게시됨