request queryParamater를 읽는 여러가지 방법

gwjeon·2021년 10월 23일
1


학습참조
인프런-스프링 MVC 1편 백엔드 웹 개발 핵심 기술(김영한님)


✅ Servlet 방식

    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");
    }
  • 가장 기본적인 서블릿 방식의 request.getParameter를 사용한 방식.

✅ @RequestParam 애노테이션 방식

☑ 가장 기본적인 형태

    public String requestParamV2(
            @RequestParam("username") String userName,
            @RequestParam("age") int userAge) {

        log.info("username={} age={}", userName, userAge);
        return "ok";
    }

☑ 애노테이션 @Request(name="")을 생략한 형태

    public String requestParamV3(
            @RequestParam String username,
            @RequestParam int age) {

        log.info("username={} age={}", username, age);
        return "ok";
    }
  • 위와 같이 생략 할 경우 변수이름이 paramter 이름과 동일 해야함.

☑ 애노테이션 자체를 생략한 형태

    public String requestParamV4(String username, int age) {

        log.info("username={} age={}", username, age);
        return "ok";
    }
  • parameter value type이 primitive 형태(int, long, float, double 등) 인 경우 생략 가능.

☑ required 옵션

    public String requestParamRequired(
            @RequestParam(required = true) String username,
            @RequestParam(required = false) Integer age) {

        log.info("username={} age={}", username, age);
        return "ok";
    }
  • default는 true이며 생략가능하고 true일 경우 반드시 해당 parameter가 담긴상태로 요청해야 한다. 이를 어길 경우 Bad Request 400 error 발생함.
  • parameter의 value가 빈 문자일 경우 null이 아닌 공백("")이 적용됨.
  • ...../username= 와 같은 요청이 들어왔을 경우 username은 ""이며 age는 null. int타입은 null을 가질수 없으므로 Integer 타입으로 선언되어야 한다.

☑ defaultValue 옵션

    public String requestParamDefault(
            @RequestParam(defaultValue = "guest") String username,
            @RequestParam(defaultValue = "-1") int age) {

        log.info("username={} age={}", username, age);
        return "ok";
    }
  • parameter가 지정되지 않아도 자동으로 default 값을 가지며 username은 "geust", age는 -1 가 됨.

☑ Map을 이용한 모든 parameter 가져오기

    public String requestParamMap(@RequestParam Map<String, Object> paramMap){

        log.info("username={} age={}", paramMap.get("username"), paramMap.get("age"));
        return "ok";
    }
  • 요청받은 모든 parameter들을 map에 저장하고 get을 통해 가져옴.

☑ MultiValueMap을 이용한 중복된 parameter명 처리

    public String requestParamMap(@RequestParam MultiValueMap<String, Object> paramMap){
        //MultiValueMap={key=[value1, value2, ...], key=[value1, value2, ...]}
        log.info("MultiValueMap={}", paramMap);
        return "ok";
    }
  • parameter name이 중복 될 경우 사용 할 수 있음.
  • MultiValueMap={key=[value1, value2, ...], key=[value1, value2, ...]} 와 같은 형태가 됨.

✅ @ModelAttribute를 이용한 만들어진 객체로 받기

☑ 예시를 위한 HelloData 객체

import lombok.Data;

@Data //@Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgConstructor 자동 적용
public class HelloData {
    private String username;
    private int age;
}
  • paramter를 전달받을 객체를 HelloData 객체 정의.

☑ 가장 기본적인 형태

    public String modelAttributeV1(@ModelAttribute HelloData helloData) {
        log.info("helloData={}", helloData);

        return "ok";
    }
  • parameter에 @ModelAttribute 애노테이션 넣어줌으로써 스프링이 자동으로 HelloData 객체를 생성하고 요청받은 Data를 주입함.

☑ @ModelAttribute 애노테이션 생략 형태

    public String modelAttributeV2(HelloData helloData) {
        log.info("helloData={}", helloData);

        return "ok";
    }
  • 애노테이션이 생략되어도 가능하다.

profile
ansuzh

0개의 댓글