Java & Spring/Spring

스프링 MVC - 기본기능

DJ.Kang 2025. 4. 18. 01:46

□ HTTP 요청 파라미터

참고사항

  • @ModelAttribute 생략 가능
  • String, int 같은 단순 타입 = @RequestParam
  • argument resolver 로 지정해둔 타입 외 = @ModelAttribute

- @RequestParam

  • HTTP 요청 파라미터(query string 또는 form data)를 메서드 파라미터에 바인딩할 때 사용.
  • 단일 파라미터나 간단한 자료형에 주로 사용됨.
@GetMapping("/hello")
public String hello(@RequestParam String name) {
    return "Hello " + name;
}

 

- @ModelAttribute

  • 폼 객체나 커맨드 객체처럼, 파라미터가 객체일 경우 사용.
  • 요청 파라미터들을 객체의 필드에 바인딩함 (자동 setter 호출).
  • 주로 POST 요청에서 폼 데이터 받을 때 사용하지만, GET도 가능.
@PostMapping("/register")
public String register(@ModelAttribute User user) {
    String userName = user.getName()
    String userEmaing = user.getEmail() // 등 사용 가능
    return "success";
}

 

□ HTTP 단순 텍스트

- Input, Output 스트림, Reader

@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
    String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
    log.info("messageBody={}", messageBody);
    responseWriter.write("ok");
}

 

스프링 MVC는 다음 파라미터를 지원한다.

  • InputStream(Reader): HTTP 요청 메시지 바디의 내용을 직접 조회
  • OutputStream(Writer): HTTP 응답 메시지의 바디에 직접 결과 출력

- HttpEntity : HTTP header, body 정보를 편리하게 조회

  • 메시지 바디 정보를 직접 조회
  • 요청 파라미터를 조회하는 기능과 관계 없음(@RequestParam X, @ModelAttribute X)
  • HttpMessageConverter 사용 → StringHttpMessageConverter 적용

- 응답에서도 HttpEntity 사용 가능

  • 메시지 바디 정보 직접 반환(view 조회X)
  • HttpMessageConverter 사용 → StringHttpMessageConverter 적용

- HttpEntity 를 상속받은 다음 객체들도 같은 기능을 제공한다.

  • RequestEntity : HttpMethod, url 정보가 추가, 요청에서 사용
  • ResponseEntity : HTTP 상태 코드 설정 가능, 응답에서 사용
return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED)

 

- @RequestBody

  • @RequestBody를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.
  • 헤더 정보가 필요하다면 HttpEntity를 사용하거나 @RequestHeader를 사용하면된다.


□ HTTP 요청 메시지 - JSON

@Slf4j
@Controller
public class RequestBodyJsonController {
    private ObjectMapper objectMapper = new ObjectMapper();
    @PostMapping("/request-body-json-v1")

    public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ServletInputStream inputStream = request.getInputStream();

        String messageBody = StreamUtils.copyToString(inputStream, 
        StandardCharsets.UTF_8);
         log.info("messageBody={}", messageBody);

        HelloData data = objectMapper.readValue(messageBody, HelloData.class);
        log.info("username={}, age={}", data.getUsername(), data.getAge());
        response.getWriter().write("ok");
    }
}
  • HttpServletRequest를 사용해서 직접 HTTP 메시지 바디에서 데이터를 읽어와 문자로 변환
  • 문자로 된 JSON데이터를 objectMapper를 사용해서 자바 객체로 변환
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
    HelloData data = objectMapper.readValue(messageBody, HelloData.class);
     log.info("username={}, age={}", data.getUsername(), data.getAge());

    return "ok";
}
  • @RequestBody 를 사용해서 HTTP 메시지에서 데이터를 꺼내고 messageBody에 저장한다.
  • 문자로 된 JSON 데이터인 messageBody 를 objectMapper 를 통해서 자바 객체로 변환한다.
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data) {
    log.info("username={}, age={}", data.getUsername(), data.getAge());

    return "ok";
}
  • @RequestBody는 생략 불가능, 생략하게 되면 @ModelAttribute가 적용된다.

 

- @RequestBody 요청

  • JSON 요청  →  HTTP 메시지 컨버터  →  객체

- @ResponseBody 응답

  • 객체  →  HTTP 메시지 컨버터  →  JSON 응답

 

□ HTTP 응답 - 정적 리소스, 뷰 템플릿

  1. 정적 리소스 : 웹 브라우저에 정적인 HTML, css, js를 제공할 때는, 정적 리소스를 사용한다.
  2. 뷰 템플릿 사용 : 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다.
  3. HTTP 메시지 사용 : HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로,
                                   HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.