Spring/강의

[📕 기초 Spring] 5-1. 요청 데이터(클라이언트 → 서버)와 처리 방법

가지코딩 2025. 5. 4. 17:03

📕 목차

  1. 요청데이터 (Request Data)
  2. Query Parameter
  3. HTTP Form Data
  4. Request Body
  5. 어노테이션별 사용법 정리

1. 요청 데이터 (Request Data)

요청 데이터(Request Data)

  • 클라이언트(Client)가 서버(Server)에 HTTP 요청을 보낼 때, 원하는 작업을 수행하거나 정보를 전달하기 위해 함께 보내는 데이터를 의미한다.
  • 요청 데이터 전달 방식은 크게 세가지가 있다.
    • Query Parameter
    • HTTP Form Data
    • HTTP Request Body
전달 방식 전송 위치 사용 용도 특징
Query Parameter URL 검색, 필터링 데이터 노출됨
HTTP Form Data Body 로그인, 회원가입 등 HTML 폼에 최적화
HTTP Request Body Body API 호출, JSON 전송 구조화된 데이터 전송

2. Query Parameter

Query Parameter

  • URL에 데이터를 key=value 형식으로 붙여 전달하는 방식
  • 주로 GET 요청에서 사용
  • 데이터가 주소창에 노출된다.
GET /hello?name=kim&age=25

 

 

Spring 요청 처리 예시 (Controller)

@GetMapping("/hello")
public String hello(@RequestParam String name, @RequestParam int age) {
    return "Hello " + name + ", age: " + age;
}

3. HTTP Form Data

HTTP Form Data

  • HTML <form> 태그를 통해 데이터를 전달하는 방식
  • 주로 POST, PUT 요청에서 사용
  • application/x-www-form-urlencoded 방식으로 전송됨
<form method="post" action="/submit">
  <input type="text" name="username">
  <input type="password" name="password">
  <button type="submit">Submit</button>
</form>
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded

username=kim&password=1234

 

 

Spring 요청 처리 예시

@PostMapping("/submit")
public String submit(@RequestParam String username, @RequestParam String password) {
    return "Username: " + username;
}

 

또는

// 객체로 받기
@PostMapping("/submit")
public String submit(@ModelAttribute LoginForm form) {
    return "Username: " + form.getUsername();
}

public class LoginForm {
    private String username;
    private String password;
    // getters/setters
}

4. HTTP Request Body

HTTP Request Body

  • 요청 본문(Body)에 데이터를 담아 전달하는 방식
  • 주로 POST, PUT, PATCH 요청에서 사용
  • JSON, XML, TEXT 등의 포맷 사용
  • application/json, text/plain 등의 Content-Type
POST /json
Content-Type: application/json

{
  "title": "hello",
  "content": "world"
}

 

 

Spring 요청 처리 예시

@PostMapping("/json")
public String json(@RequestBody ArticleDto article) {
    return "Title: " + article.getTitle();
}

public class ArticleDto {
    private String title;
    private String content;
}

5. 어노테이션별 사용법 정리

어노테이션 주 용도 데이터 위치 변환 대상
@RequestParam 단일 파라미터 추출 Query / Form 기본 타입
@ModelAttribute 폼 데이터 → 객체 바인딩 Form 객체
@RequestBody Body 데이터 → 객체 바인딩 JSON, TEXT 등 객체
HttpEntity<T> Body + Header 받기 전체 요청 객체 or 문자열
@ResponseBody 객체 → 응답 본문 JSON 등 응답 객체

 

 

@RequestParam

  • Query Parameter 또는 Form Data에서 단일 값 추출 시 사용
@GetMapping("/hello")
public String hello(@RequestParam String name, @RequestParam int age) {
    return "Hello " + name + ", age: " + age;
}
GET /hello?name=kim&age=30

 

 

@ModelAttribute

  • Form Data를 객체로 바인딩할 때 사용
  • 내부적으로 @RequestParam을 필드별로 적용한 것과 유사
@PostMapping("/login")
public String login(@ModelAttribute LoginForm form) {
    return "User: " + form.getUsername();
}
public class LoginForm {
    private String username;
    private String password;
    // getters/setters
}

 

 

@RequestBody

  • HTTP 요청 본문(Body)에 담긴 JSON, XML, TEXT 등을 자바 객체로 변환
  • HttpMessageConverter가 자동으로 변환 처리
@PostMapping("/article")
public String postArticle(@RequestBody ArticleDto dto) {
    return "Title: " + dto.getTitle();
}
public class ArticleDto {
    private String title;
    private String content;
    // getters/setters
}
POST /article
Content-Type: application/json

{
  "title": "Spring",
  "content": "Framework"
}

 

 

HttpEntity<T>

  • 요청 전체(Request Header + Body)를 포함한 객체로 받고 싶을 때 사용
@PostMapping("/raw")
public String rawRequest(HttpEntity<String> httpEntity) {
    String body = httpEntity.getBody();
    return "Received: " + body;
}

 

 

@ResponseBody

  • 메서드 반환값을 뷰 이름이 아니라 HTTP 응답 본문으로 직접 전달
  • 주로 JSON 응답 시 사용
@GetMapping("/data")
@ResponseBody
public ArticleDto data() {
    return new ArticleDto("Title", "Content");
}

 

 

* @RequestBody와 @ResponseBody는 모두 HttpMessageConverter에 의존하여 동작한다.

  • HttpMessageConverter: 데이터 → Java 객체 변환, Java 객체 →  데이터 변환하는 역할. (데이터는 보통 JSON)