[스프링] 요청에 쓰이는 어노테이션 정리 @RequestBody, @ModelAttribute, @RequsetParam

코린이서현이·2024년 2월 15일
0

백엔드 공부

목록 보기
11/14
post-thumbnail

🤔들어가면서🤔

@RequsetParam과 @RequestBody의 차이는 무엇일까?
@RequestBody 로 객체가 만들어지는 원리는 무엇일까?
HttpMessageConverter 의 역할은 무엇일까?

@RequsetParam

메소드의 매개변수가 웹 요청 매개변수에 바인딩되어야한다는 어노테이션이다.
이때 여러개의 매개변수를 받을 수는 있지만 단일값만으로만 받을 수 있다. 객체는 받을 수 없다.
Spring MVCSpring WebFlux에서 각각 다르게 작동한다.

Spring MVC에서 요청 매개변수는 쿼리데이터와 폼데이터형식을 받을 수 있다.
Servlet API가 쿼리데이터와 폼데이터를 동일한 방식으로 다루기 때문이다.

Spring WebFlux에서 요청 매개변수는 쿼리데이터만 받을 수 있다. 만약 폼데이터나 멀티파트 데이터를 처리하고 싶다면, ModelAttribute를 사용할 수 있다.

🧐 Spring MVCSpring WebFlux의 차이

  • Spring MVC를 사용 --> spring-web 모듈의 의존성
  • Spring WebFlux를 사용--> spring-webflux 모듈의 의존성

    포스팅 보러가기

@RequsetParam의 속성

📑 공식문서

  • defaultValue : 요청 파라미터가 값이 없을 때 사용할 문자열 값을 지정한다. 타입이 String이다.
  • name : 바인딩할 매개변수의 이름이다.
  • required : 매개변수의 필수 여부를 지정한다. 기본값이 true이기 때문에 따로 지정하지 않으면 true이다. 이때 해당 요청값이 없으면 익셉션이 발생한다.
  • value : name과 같은 역할을 한다.

실습 코드

@RestController
public class RequestTest {

  @GetMapping("/requestest/RequestParam")
  public String RequestParam(@RequestParam(value = "name")String name,
  									@RequestParam(value = "age")int age) {
    return name+"님! 당신은 " + age + "살이군요?";
  }
  • spring-boot-starter-web으로 Spring MVC를 사용한다.

Get 요청으로 쿼리데이터를 받아보자.

🙆 쿼리데이터를 정상적으로 받는다.

Spring MVC는 폼데이터도 사용할 수 있다.

🙆 쿼리데이터를 정상적으로 받는다. (다만 JSON 데이터는 받을 수 없다.)

required 속성을 사용해보자

@RestController
public class RequestTest {

  @GetMapping("/requestest/RequestParam")
  public String RequestParam(@RequestParam(value = "name")String name,@RequestParam(value = "age")int age,@RequestParam(required = false) String nickname) {
    if (nickname == null){
      return name+"님! 당신은 " + age + "살이군요?";
    }else {
      return name+"님! " +nickname+ "이란 별명이 귀여워요! 당신은 " + age + "살이군요?";
    }
  }
}

@RequsetParam 최종정리

@RequsetParam은 단순한 변수하나하나를 받을 수 있다.
Spring MVC에서는 쿼리데이터와 폼데이터를 받을 수 있고,
Spring WebFlux에서는 쿼리 데이터를 받을 수 있다. 
required = false 일 때는, 값이 비어도 인셉션이 나지 않는다.

@ModelAttribute

🤔 만약 폼으로 데이터를 받는데, 파라미터 개수가 너무 많으면 코드가 너무 길어지겠지...?

스프링은 이런 불편함을 줄이기 위해서 요청 파라미터의 값을 커맨더 객체에 담아줄 수 있는 기능을 제공한다. 👉 @ModelAttribute

@ModelAttribute은 HTTP Body내용과 HTTP파라미터의 값들을 생성자와 Getter와 Setter를 통해 주입할 때 사용한다.

만약 폼데이터를 자바코드에서 자바객체로 받는다면 @ModelAttribute가 생략된 코드이다.

  @PostMapping("/request/object")
  public Book requestTestObject(@ModelAttribute Book user){
    System.out.println("user = " + user);
    return user;
  }

커멘드 객체란?

스프링 MVC에서 폼 데이터를 받거나 전달하기 위해 사용되는 객체이고, 필수로 getter, setter를 가진다.

참고 자료

@RequestBody

JSON 형식의 요청 데이터를 자바 객체로 변환해 받을 수 있도록 하는 어노테이션이다.
이 어노테이션이 붙어있으면 MessageConverterJackson라이브러리가 자바객체로 변환시켜준다.


참고자료

@RequsetParam의 속성 name vs value

profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

1개의 댓글

comment-user-thumbnail
2024년 2월 16일

습관적으로 썼던 어노테이션들의 차이를 확실히 알게 됐어요! 잘 보고 갑니당ㅎㅎ

답글 달기

관련 채용 정보