본문 바로가기

Back-End/Spring-MVC

HTTP 요청 데이터

1. @RequestParam

  • URL 쿼리 파라미터나 HTML Form의 데이터를 매핑할 때 사용한다. 주로 HTTP 통신 Method 중 GET 방식의 통신을 할 때 사용.
  • 상황
    • 간단한 파라미터를 받을 때
    • Ex. 검색 키워드나 페이징 번호
  • 예시
"요청 URL : /search?keyword=spring&page=1"

@GetMapping("/search")
public String search(@RequestParam String keyword, @RequestParam int page) {
	return "Searching for: " + keyword + ", Page: " + page;
}

2. @ModelAttribute

  • HTML Form 데이터나 URL 쿼리 파라미터를 객체로 바인딩
  • 상황 
    • 여러 필드를 가진 객체를 받아야 할 때
    • Ex. 회원가입 양식 데이터를 한 번에 객체로 전달
  • 예시
"요청 데이터 : name=John&email=john@example.com"

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


@RequestParam, @ModelAttributeGET + Query ParameterPost HTML Form Data를 바인딩하는 법이다


3. @RequestBody

  • HTTP 요청 본문(body)에 담긴 데이터를 Java객체로 변환
  • Object를 Mapping 할 수 있다.
  • HTTP Request Body(JSON Data) -> Converter(Jackson) -> Object
    Request Header -> Content - Type : application/json(전달할 데이터 형식)
  • 상황
    • 클라이언트가 JSON이나 XML로 데이터를 보낼 때
    • Ex. REST API에서 데이터를 받을 때.
  • 예시
"Json
{
    "name": "John",
    "email": "john@example.com"
}"

@PostMapping("/api/user")
public ResponseEntity<User> saveUser(@RequestBody User user) {
	User userName = user.getName();
	return ResponseEntity<>(userName, HttpStatus.OK);
}

그럼 약간 궁금할 수도 있다. @RequestBody에서 JSON 데이터를 어떻게 JAVA 객체로 변환 시키는걸까??
그럼 동작 순서를 파해쳐보자!

1. 클라이언트 요청
클라이언트가 HTTP 요청 본문에 JSON 데이터를 담아 서버로 전송.

"JSON"
{
  "name": "박병천",
  "age": 25
}

2. 컨트롤러에서 @RequestBody로 받기
- @RequestBody 역할 : 요청 본문을 Java 객체로 변환

@PostMapping("/user")
public ResponseEntity<String> createUser(@RequestBody User user) {
	String username = user.getName();
    return ResponseEntity<>("User name: " + username, HttpStatus.OK);
}

1 ~ 2로 변환될 때 내부 동작 과정

  1. Spring의 DispatcherServlet
    • HTTP 요청을 컨트롤러로 전달.
    • 요청 본문(JSON)을 읽고 변환해야 하는 파라미터를 찾는다.(클라이언트가 보낸 JSON 데이터를 받는 변수 위 코드에서는 user)이다.
  2. HandlerMethodArgumentResolver
    • 컨트롤러 메서드의 파라미터를 확인하고(쉽게 POST /user 요청에 매핑된 메서드를 찾는다 라고 생각), @RequestBody 애노테이션이 있는지 탐지.
    • 변환이 필요하다고 판단
  3. HttpMessageConverter
    • 요청 본문(JSON)을 Java 객체로 변환하는 역할.
    • MappingJackson2HttpMessageConverter 실행:
      1. JSON 데이터를 읽음.
      2. Jackson ObjectMapper를 사용하여 Java 객체 생성.
  4. Jackson 라이브러리의 ObjectMapper
    • JSON 문자열을 Java 객체로 매핑.
    • Java 클래스의 필드와 JSON 키를 매핑하며, 이름이 동일해야 함.

3. Jackson의 역할

Jackson ObjectMapper의 기본 동작:

  1. JSON 키와 Java 객체의 필드 이름 매핑.
  2. JSON 값의 타입을 필드 타입에 맞게 변환.
  3. Getter/Setter 메서드를 사용해 값을 주입.

@RequestBody 동작 방식 요약

  1. 클라이언트가 JSON 데이터를 보냄
  2. @RequestBody와 Spring의HttpMessageConverter가 요청 본문을 읽음.
  3. Jackson ObjectMapper가 JSON을 Java 객체로 변환.
  4. 컨트롤러 메서드에서 Java 객체를 사용.

'Back-End > Spring-MVC' 카테고리의 다른 글

HTTP 요청 / 응답 조합 상황별 사용  (0) 2024.12.02
HTTP 응답 데이터  (1) 2024.12.02
@RequestMapping  (0) 2024.12.01
@Controller 와 @RestController 요약 정리  (0) 2024.12.01
Spring MVC 구조 흐름  (0) 2024.11.30