본문 바로가기
Develop/Spring

[Spring Web MVC] Handler Methods - MethodArgument

by 준팍(junpak) 2023. 4. 17.

@RequestParam

  • Servlet 요청 파라미터(query parameter 또는 form data)를
    메소드의 파라미터에 바인딩할 때 사용되는 어노테이션 (주로 단일 요청 파라미터)
  • 동작 원리
    • @RequestParam("petId") int idrequest.getParameter("username")
  • 쿼리 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
  • String , int , Integer 등의 단순 타입이면 @RequestParam 도 생략 가능
    • String이 아닌 경우 자동으로 타입 변환(Type Conversion) 적용
  • 파라미터 타입을 배열이나 리스트로 선언 가능
  • required 옵션
    • 파라미터 필수 여부를 결정한다. (기본값 = true)
    • required = false 혹은 java.util.Optional 래퍼 사용 시
    • 매개 변수가 없어도 예외를 던지지 않는다.
    • null 값은 기본형에 입력이 불가능하므로 defaultValue 혹은 래퍼클래스를 이용해야한다.
  • defaultValue 옵션
    • 파라미터에 값이 없을 때, defaultValue 를 사용하면 기본 값 적용 가능
    • 쿼리 파라미터가 빈 문자인 경우에도 적용된다.
    • 기본 값이 존재하기 때문에 required 옵션 여부는 의미가 없다.
  • requestParamMap
    • 파라미터를 Map, MultiValueMap으로 조회 가능
    • 어노테이션에 매개변수 이름이 지정되지 않은 경우에도, Map에서 꺼내쓸 수 있다.
    • 파라미터의 값이 1개가 확실하면 Map, 그렇지 않다면 MultiValueMap 사용

 

@ModelAttribute

  • Servlet 요청 파라미터(query parameter 또는 form data)를
    도메인 모델이나 DTO와 같은 복합 객체에 바인딩할 때 사용되는 어노테이션
  • 동작 원리
    • 객체 생성
    • 요청 파라미터의 이름으로 객체의 프로퍼티를 찾고, setter를 호출해서 파라미터의 값을 입력
  • 프로퍼티
    • 객체에 getA(), setA() 메서드가 있으면, 해당 객체는 a라는 프로퍼티를 가지고 있다.
    • a 프로퍼티의 값 변경 시 setA() 호출, 조회시 getA() 호출
  • 어노테이션 생략 시, @ModelAttribute 적용
    • String , int , Integer 등의 단순 타입 혹은 argument resolver로 지정해둔 타입 제외
  • 바인딩 오류
    • 적절한 타입을 입력하지 않으면 BindException 발생
    • BindingResult에 에러 저장

@RequestBody

  • 클라이언트로부터 전달된 request body의 데이터를
    메서드의 파라미터로 바인딩하는 데 사용되는 어노테이션
  • HTTP 메시지 바디 정보를 편리하게 조회 가능
    • 헤더 정보가 필요한 경우 HttpEntity 혹은 @RequestHeader 사용
  • request body 데이터 - 자바 객체 변환
    • objectMapper를 통해서 문자로 된 JSON 데이터인 messageBody를 자바객체로 변환
    • 객체 파라미터 : 직접 만든 객체 지정
      ex) @RequestBody HelloData data
    • HttpEntity 사용
  • 어노테이션 생략 불가
    • 어노테이션 생략 시 @ModelAttribute 적용
      • HTTP 메시지 바디가 아니라 요청 파라미터 처리
  • 주의 사항
    • HTTP 요청 시, content-typeapplication/json만 가능
    • JSON을 처리할 수 있는 HTTP 메시지 컨버터가 실행되기 때문에