코딩/자바

[Spring] 기초 5주차

yoney 2025. 1. 23. 11:35

HTTP 요청 데이터

 

client에서 server로 data를 전달하는 방법 1. query parameter  2. http 폼 데이터  3. RequestBody

 

1. GET + Query Parameter(=Query String) -> HttpServletRequest 사용

http://localhost:8080/request-params?key1=value1&key2=value2

 

@Slf4j
@Controller
public class RequestParamController {

    @GetMapping("/request-params")
    public void params(
			HttpServletRequest request,
			HttpServletResponse response
			) throws IOException {
															 
        String key1Value = request.getParameter("key1");
		String key2Value = request.getParameter("key2");
				
		log.info("key1Value={}, key2Value={}", key1Value, key2Value);
        response.getWriter().write("success");
    }
}
  • response.getWriter().write()
    • HttpServletResponse를 사용해서 응답값을 직접 다룰 수 있다.
    • @Controller 지만 @ResponseBody를 함께 사용한 것과 같다.

 

2. POST + HTML Form(x-www-form-urlencoded) -> http RequestBody에 전달

POST /form-data
content-type: application/x-www-form-urlencoded

key1=value1&key2=value2

 

 

3. http RequestBody

  • 데이터(JSON, TEXT, XML 등)를 직접 HTTP Message Body에 담아서 전달한다.
  • 주로 @RestController에서 사용하며, 대부분 JSON 형식으로 데이터를 전달한다.
    • POST, PUT, PATCH Method에서 사용한다.
    • GET, DELETE Method는 Body에 데이터를 담는것을 권장하지 않는다.
package com.example.springbasicannotation.controller;

import com.example.springbasicannotation.entity.Board;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.PostMapping;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@Slf4j
@Controller
public class RequestBodyController {

    // JSON을 객체로 변환해주는 Jackson 라이브러리
    private ObjectMapper objectMapper = new ObjectMapper();

    @PostMapping("/request-body")
    public void requestBody(
            HttpServletRequest request,
            HttpServletResponse response
    ) throws IOException {

        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        log.info("messageBody={}", messageBody);

        Board board = objectMapper.readValue(messageBody, Board.clss);

        log.info("board.getTitle()={}, board.getContent()={}", board.getTitle(), board.getContent());

        response.getWriter().write("success");

    }
    
}

Spring 요청 데이터

 

RequestParam

Spring 기초 4주차에 정리한대로 url에서 파라미터 값과 이름을 함께 전달하면 RequestParam을 사용해서 파라미터 값에 쉽게 접근할 수 있다.

 

1. required 속성 설정

@RequestParam(required = true) String name, // 필수
				@RequestParam(required = false) int age	// 필수가 아님

파라미터를 필수로 받을지 안받을지를 required=true/false로 지정할 수 있다.

디폴트 값은 true인데 true 상태에서 url에 파라미터가 없는 경우 400 에러가 발생한다.

 

2. Map 사용

파라미터를 map 형태(key=value)로 조회할 수 있다.

MultiValueMap 형태(key=[value1, value2])로 조회할 수 있다.

ex) http://localhost:8080/v6/request-param?name=sparta&age=100
@ResponseBody
@GetMapping("/v6/request-param")
public String requestParamV6(
        @RequestParam Map<String, String> map
) {
    // logic
    log.info("name={}", map.get("name"));
    log.info("age={}", map.get("age"));

    return "success";
}

 

http://localhost:8080/v6/request-param?name=sparta&name=wonuk&name=tutor&age=100
@ResponseBody
@GetMapping("/v6/request-param")
public String requestParamV6(
        @RequestParam MultiValueMap<String, String> map
) {
    // logic
    log.info("name={}", map.get("name"));
    log.info("age={}", map.get("age"));

    return "success";
}


@ModelAttribute

http 요청의 파라미터를 객체에 바인딩해서 해당 객체를 컨트롤러 매서드의 매개변수로 전달하거나 모델에 추가하는데 사용된다.

public class User {
    private String name;
    private String email;

    // getter, setter
}

@Controller
public class UserController {

    @PostMapping("/submitForm")
    public String submitForm(@ModelAttribute User user) {
        // user 객체는 폼에서 전달된 데이터로 자동 바인딩됨
        return "userInfo";
    }
}
<form method="POST" action="/submitForm">
    <input type="text" name="name" />
    <input type="email" name="email" />
    <button type="submit">Submit</button>
</form>

name과 email 필드가 자동으로 User 객체의 속성에 바인딩된다.

http 요청 파라미터의 이름과 객체의 필드명이 일치해야 한다.

 

 

HttpEntity

 

역할

  1. Http Request Body Message를 직접 조회한다
  2. Request 뿐만 아니라 Response도 사용할 수 있도록 만들어준다.
  3. Response Header 또한 사용할 수 있다.
  4. Request Parameter를 조회하는 기능들과는 아무 관계가 없다.
  5. View를 반환하지 않는다.

 

HttpEntity와 RequestEntity, ResponseEntity의 차이

  • HttpEntity는 요청과 응답 모두에서 사용 가능한 일반적인 클래스.
  • RequestEntity: HttpEntity를 상속받으며, HTTP 요청에서만 사용됩니다. 추가적으로 HTTP 메서드와 URL 정보까지 포함한다.
  • ResponseEntity: HttpEntity를 상속받으며, HTTP 응답에서만 사용됩니다. HTTP 상태 코드(status code)를 포함한다.
@Controller
public class RequestBodyStringController {
	
	@PostMapping("/v4/request-body-text")
  public HttpEntity<String> requestBodyTextV4(RequestEntity<String> httpEntity) {

      // HttpMessageConverter가 동작해서 아래 코드가 동작하게됨
      String body = httpEntity.getBody();
      // url, method 사용 가능

      return new ResponseEntity<>("response = " + body, HttpStatus.CREATED); // Body Data, 상태코드
  }

}

 

 

@RequestBody, @ResponseBody

HttpEntity를 사용하는 것보다 Spring에서 @RequestBody, @ResponseBody 어노테이션을 사용하면 각각 Request, Response 객체의 Body에 편하게 접근하여 사용할 수 있다.

@Controller // @RestController = @Controller + @ResponseBody
public class RequestBodyStringController {
	
  @ResponseBody
  @PostMapping("/v5/request-body-text")
  public String requestBodyTextV5(
          @RequestBody String body,
          @RequestHeader HttpHeaders headers
  ) {
      // HttpMessageConverter가 동작해서 아래 코드가 동작하게됨
      String bodyMessage = body;

      return "request header = " + headers + " response body = " + bodyMessage;
  }
}

 

@RequestBody  @ResponseBody 차이점

특징 @RequestBody @ResponseBody
역할 HTTP 요청 본문을 Java 객체로 변환 Java 객체를 HTTP 응답 본문으로 변환
데이터 흐름 방향 클라이언트 → 서버 서버 → 클라이언트
주요 용도 요청 데이터(예: JSON, XML)를 매핑 응답 데이터(예: JSON, XML)를 반환
적용 위치 컨트롤러 메서드의 매개변수 컨트롤러 메서드의 반환값
     
기술 사용 HttpMessageConverter를 사용해 본문 데이터를 객체로 변환 HttpMessageConverter를 사용해 객체를 본문 데이터로 변환

 

 

  • 요약
    1. 요청 파라미터, HTML Form Data에 접근하는 경우
      • @RequestParam, @ModelAttribute 를 사용한다. (생략 가능)
    2. Http Message Body에 접근하는 경우
      • @RequestBody를 사용한다. (JSON, XML, TEXT) (생략 불가능) , HttpEntity도 사용 가능(값을 꺼내서 사용해야 함. httpEntity.getBody())

Spring 응답 데이터

 

server에서 client로 data를 전달하는 방법

1. 정적 리소스

경로: src/main/resources ->/static

 

2. view Template

경로: src/main/resources/templates

 

3. http message body

직접 http response message를 만들어서 전달한다.

  • HTTP Message Body
    1. HttpServletResponse 사용
    2. ResponseEntity<> 사용
    3. @ResponseBody(TEXT, JSON) 사용
    4. ResponseEntity<Object>(JSON)

정리

  •  요청
    • @RequestParam, @ModelAttribute, @RequestBody
  • 응답
    • 정적 리소스, View Template(@Controller), @ResponseBody, ResponseEntity<Object>

 

'코딩 > 자바' 카테고리의 다른 글

[Spring] 기초 6주차  (0) 2025.01.23
[Spring] HTTP API 설계 기본  (0) 2025.01.23
[Spring] 기초 4주차  (1) 2025.01.22
[Spring] 기초 2주차  (0) 2025.01.21
[Spring] 기초 1주차  (0) 2025.01.21