2 분 소요


HTTP 요청 데이터 조회

클라이언트에서 서버로 요청 데이터를 전달할 때 사용하는 3가지 방법
HTTP요청 데이터

RequestParamController

@Slf4j
@Controller
public class RequestParamController {

    @RequestMapping("/request-param-v1")
    public void requestParamV1(HttpServletRequest request, HttpServletResponse  response) throws IOException {

        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        log.info("username={}, age={}", username, age);

        response.getWriter().write("ok");
    }
}

GET 실행
http://localhost:8080/request-param-v1?username=hello&age=20

HTML Form은 생략

HTTP 요청 파라미터 - @RequestParam

requestParamV2

@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
                    @RequestParam("username") String memberName,
                    @RequestParam("age") int memberAge) {
    log.info("username={}, age={}", memberName, memberAge);
    return "ok";
}
  • @RequestParam: 파라미터 이름으로 바인딩
  • @ResponseBody: View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력

requestParamV3

@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
                @RequestParam String username,
                @RequestParam int age) {
    log.info("username={}, age={}", username, age);
    return "ok";
}

HTTP 파라미터 이름이 변수 이름과 같으면 RequestParam(name="xx") 생략가능

requestParamV4

@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
    log.info("username={}, age={}", username, age);
    return "ok";
}

String,int,Integer 등의 단순 타입이면 @RequestParam도 생략 가능

주의
@RequestParam애노테이션을 생략하면 스프링 MVC는 내부에서 require=false를 적용한다.

requestParamRequired

@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
                @RequestParam(required = true) String username,
                @RequestParam(required = false) Integer age) {
    log.info("username={}, age={}", username, age);
    return "ok";
}
  • @RequestParam.required
    • 파라미터 필수 여부
    • 기본값이 파라미터 필수(true)이다.
  • /request-param 요청
    • username이 없으므로 400 예외가 발생한다.

주의!

  • request-param?username=
  • 파라미터 이름만 있고, 값이 없는 경우 -> “” 문자로 통과

주의!

  • /request-param 요청
  • @RequestParam(required = false) int age
  • nullint에 입력하는 것은 불가능(500예외 발생)
  • 따라서, null을 받을 수 있는 Integer로 변경하거나, defaultValue 사용

requestParamDefault

@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
                @RequestParam(required = true, defaultValue = "guest") String username,
                @RequestParam(required = false, defaultValue = "-1") int age) {
    log.info("username={}, age={}", username, age);
    return "ok";
}
  • 이미 기본 값이 설정되었기 때문에 required는 의미가 없다.
  • defaultValue는 빈 문자의 경우에도 설정한 기본값이 적용된다.
  • request-param?username=

requestParamMap

@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
    log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
    return "ok";
}

파라미터를 Map, MultiValueMap으로 조회할 수 있다.

  • @RequestParam Map
    • Map(key=value)
  • @Requestparam MultiValueMap
    • MultiValueMap(key=[value1, value2, ...])

HTTP 요청 파라미터 - @ModelAttribute

기존 코드

@RequestParam String username;
@RequestParam int age;

HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);

스프링은 이 과정을 자동화해주는 @ModelAttribute 기능을 제공한다.

HelloData

import lombok.Data;

@Data
public class HelloData {
    private String username;
    private int age;
}
  • @Data
    • @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 자동 적용.

modelAttributeV1

@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
    log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
    return "ok";
}
  • HelloData 객체 생성
  • 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다.
  • 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
  • Ex) 파라미터 이름이 username이면 setUsername()메서드를 찾아서 호출해 값을 입력.

프로퍼티
객체에 getUsername(), setUsername()메서드가 있으면, 이 객체는 username이라는 프로퍼티를 가지고 있다.

modelAttributeV2

@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData) {
    log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
    return "ok";
}

@ModelAttribute는 생략할 수 있다.

  • String, int, Integer 같은 단순 타입 -> @RequestParam
  • 나머지 -> @ModelAttribute(argument resolver로 지정해둔 타입 외)


<출처 : 인프런 - 스프링 MVC 1편 : 백엔드 웹 개발 핵심 기술(김영한)>

댓글남기기