[Day 31 | Spring] Spring Web MVC - HTTP 요청 파라미터 처리

y♡ding·2024년 11월 25일

데브코스 TIL - Spring

목록 보기
30/46

Spring MVC에서는 폼 데이터에서 파라미터를 가져오는 다양한 방식을 지원합니다. HTTP 요청 데이터를 처리하는 방법은 요청의 유형(GET, POST 등), 데이터의 위치(쿼리 파라미터, 폼 데이터, JSON 등), 그리고 개발자가 필요로 하는 데이터 구조에 따라 달라질 수 있습니다.


1. @RequestParam

폼 데이터 또는 쿼리 파라미터 값을 가져올 때 사용합니다.

  • 주로 사용하는 경우:
    • GET 요청 쿼리 파라미터
    • POST 요청의 application/x-www-form-urlencoded 데이터
  • 특징:
    • 요청 파라미터 이름과 메서드 매개변수 이름이 같아야 자동 매핑됩니다.
    • 필수 여부(required)와 기본값(defaultValue)을 지정할 수 있습니다.

예제

@GetMapping("/search")
public String search(@RequestParam String keyword) {
    return "Search keyword: " + keyword;
}

주요 옵션

속성설명예시
value요청 파라미터 이름 지정 (필수)@RequestParam(value = "id")
required요청 파라미터가 필수인지 여부 (기본값: true)@RequestParam(value = "id", required = false)
defaultValue파라미터가 없을 때 사용할 기본값@RequestParam(value = "id", defaultValue = "0")

2. @PathVariable

URL 경로의 변수 값을 가져올 때 사용합니다.

  • 주로 사용하는 경우:
    • RESTful URL 설계에서 동적 경로 매핑
  • 특징:
    • @RequestMapping 또는 @GetMapping 등과 함께 사용하여 경로 변수를 매핑합니다.

예제

@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id) {
    return "User ID: " + id;
}

주요 옵션

속성설명예시
valueURL 경로 변수 이름 지정@PathVariable(value = "userId")
required경로 변수 필수 여부 (기본값: true)@PathVariable(value = "userId", required = false)

3. @RequestBody

HTTP 요청 본문 데이터를 가져오고 객체로 변환할 때 사용합니다.

  • 주로 사용하는 경우:
    • 클라이언트가 JSON, XML 형식의 데이터를 전송
    • 요청 데이터가 구조화된 객체 형태일 때
  • 특징:
    • 요청 본문 데이터를 Java 객체로 변환(JSON → 객체).
    • Jackson 라이브러리를 사용해 JSON 직렬화/역직렬화가 수행됩니다.

예제

@PostMapping("/users")
public String createUser(@RequestBody User user) {
    return "Created user: " + user.getName();
}

주요 옵션

속성설명예시
required요청 본문 필수 여부 (기본값: true)@RequestBody(required = false)

4. @ModelAttribute

폼 데이터를 객체로 바인딩하거나, 뷰에 데이터를 전달할 때 사용합니다.

  • 주로 사용하는 경우:
    • HTML 폼 데이터를 Java 객체로 매핑
    • GET 또는 POST 요청 모두에서 사용 가능
  • 특징:
    • 요청 파라미터 이름과 객체의 필드 이름이 같으면 자동으로 매핑됩니다.
    • 객체 생성 후 바인딩 및 검증을 수행합니다.

예제

@PostMapping("/register")
public String register(@ModelAttribute User user) {
    return "Registered user: " + user.getName();
}

5. Servlet API를 직접 사용

Spring MVC를 통해 HTTP 요청 객체에 직접 접근할 수도 있습니다.

  • 주로 사용하는 경우:
    • 복잡한 요청 처리
    • Spring의 기본 매핑 방식을 벗어난 특별한 요청 로직 필요
  • 방법:
    • HttpServletRequest, HttpServletResponse 객체를 주입받아 사용합니다.

예제

@PostMapping("/submit")
public String submit(HttpServletRequest req) {
    String name = req.getParameter("name");
    return "Submitted name: " + name;
}

6. @RequestHeader

HTTP 요청 헤더 값을 가져옵니다.

  • 주로 사용하는 경우:
    • 인증 토큰, User-Agent, Custom Header 등 헤더 정보 처리
  • 특징:
    • 특정 헤더가 없을 경우 기본값을 설정 가능

예제

@GetMapping("/headers")
public String getHeaders(@RequestHeader("User-Agent") String userAgent) {
    return "User-Agent: " + userAgent;
}

7. @CookieValue

쿠키 값을 가져옵니다.

  • 주로 사용하는 경우:
    • 세션 관리, 사용자 정보 저장 등
  • 특징:
    • 특정 쿠키가 없을 경우 기본값을 설정 가능

예제

@GetMapping("/cookies")
public String getCookie(@CookieValue(value = "sessionId", defaultValue = "unknown") String sessionId) {
    return "Session ID: " + sessionId;
}

8. Multipart 데이터 처리 (@RequestParam + MultipartFile)

파일 업로드 데이터를 처리할 때 사용합니다.

  • 주로 사용하는 경우:
    • 이미지, 문서 파일 등 멀티파트 요청 처리
  • 특징:
    • Spring의 MultipartResolver를 사용해 업로드 데이터를 처리

예제

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
    return "Uploaded file name: " + file.getOriginalFilename();
}

9. 복합적인 데이터 처리: 객체와 기본 타입 혼합

위의 방식을 조합해 여러 데이터 소스를 한 번에 처리할 수 있습니다.

예제

@PostMapping("/submit")
public String handleForm(
        @RequestParam String name,
        @RequestParam int age,
        @ModelAttribute Address address,
        @RequestHeader("User-Agent") String userAgent) {
    return String.format("Name: %s, Age: %d, Address: %s, User-Agent: %s",
                         name, age, address.toString(), userAgent);
}

각 방식의 활용 목적 요약

방식목적주요 특징
@RequestParam폼 파라미터 또는 쿼리 데이터 처리단일 값 또는 기본 타입 데이터 처리에 적합
@PathVariableURL 경로 변수 처리RESTful URL 설계에 적합
@RequestBody요청 본문 데이터를 객체로 매핑JSON 데이터와 객체 간 직렬화/역직렬화 지원
@ModelAttribute폼 데이터를 객체로 바인딩자동 필드 매핑 및 검증 지원
@RequestHeaderHTTP 헤더 값 처리인증, 사용자 정보 등의 헤더 데이터 처리
@CookieValue쿠키 데이터 처리사용자 세션 관리
MultipartFile파일 업로드 처리멀티파트 데이터 (이미지, 파일) 처리

0개의 댓글