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));
}