본문 바로가기
Back-end/Spring MVC 개념

14. Request - URL parameter 조회방법

by devraphy 2022. 3. 14.

0. 개요

- Request Parameter는 Client의 요청을 통해 Server에게 전달하는 URL parameter를 의미한다.

 

- Web은 다음 3가지 방식으로 데이터를 전달한다. 

  1. GET 방식을 이용한 URL parameter를 전달하는 방식 

  2. HTML의 Form 태그를 이용한 POST 방식( URL parameter가 HTTP message body에 담아서 전달)

  3. POST 방식을 이용한 HTTP message body에 데이터를 담아 전달하는 방식

 

- GET 방식은 URL parameter를 사용하여 데이터를 Server에게 전달한다.

- Form 태그의 POST 방식은 URL parameter를 Request Body에 담아서 Server에게 전달한다.

 

- 이 두 가지 방식은 URL parameter라는 동일한 데이터 형식을 사용하므로,

   HttpServletRequest.getParameter()를 통해 데이터를 조회할 수 있다.

 

- POST 방식의 경우, Request Body에 데이터를 JSON 형식으로 담아서 Server에게 전달한다. 

 

- 이번 포스팅에서는 Spring MVC에서 URL parameter를 조회하는 방법에 대해서 알아보자. 


1. HttpServlet을 이용한 방법

- 만약 Client로부터 다음과 같은 주소가 들어온다고 가정해보자.

   → httpservletrequest?username="devraphy"&age=20

@Controller
public class UrlParameterController {

    @RequestMapping("/httpservletrequest")
    public void usingSerlvet(HttpServletRequest request, HttpServletResponse response) throws IOException {

        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        
    }
}

- 위의 예시 코드처럼 request가 들어오면 HttpServletRequest를 이용하여 넘어오는 URL parameter를 조회할 수 있다.


2. @RequestParam을 이용한 방법

- 만약 Client로부터 다음과 같은 주소가 들어온다고 가정해보자.

   → requestparam?username="devraphy"&age=20

@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/requestparam")
    public String usingRequestParam1(
                                              @RequestParam("username") String userName, 
                                              @RequestParam("age") int userAge) {
            
        System.out.println("username = " + userName);
        System.out.println("userAge = " + userAge);
            
        return "@RequestParam 사용하기";
    }
}

- @RequestParam을 사용하면 HttpServlet을 사용하지 않고 URL parameter를 받아올 수 있다.

 

* @ResponseBody

  → Spring은 @Controller가 부착된 컨트롤러의 메서드가 반환하는 return 값을 viewname으로 인식한다.

  → 그러나 @ResponseBody를 부착하면 return 값을 String으로 처리한다. 

a) @RequestParam 축약형

- 만약 Client로부터 다음과 같은 주소로 요청이 들어온다고 가정해보자.

   → requestparam/abb?username="devraphy"&age=20

@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/requestparam/abb")
    public String usingRequestParam2(
                                            @RequestParam String username, 
                                            @RequestParam int age) {
            
        System.out.println("username = " + username);
        System.out.println("age = " + age);
            
        return "@RequestParam 축약형";
    }
}

- @RequestParameter의 매개변수로 URL parameter의 속성(key) 값을 매핑하여 사용한다.

- 그러나 URL parameter를 받는 변수의 이름이 속성(key) 값과 동일한 경우, 이를 생략할 수 있다.

b) @RequestParam 생략

- 만약 Client로부터 다음과 같은 주소가 들어온다고 가정해보자.

   → requestparam/omit?username="devraphy"&age=20

@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/requestparam/omit")
    public String usingRequestParam3(String username, int age) {
            
        System.out.println("username = " + username);
        System.out.println("age = " + age);
            
        return "@RequestParam 생략";
    }
}

- Spring에서는 URL parameter의 속성 값과  매개변수의 이름이 동일하고 매개변수의 자료형이 단순 자료형인 경우

   @RequestParam 자체를 생략할 수 있다.

 

- 여기서 단순 자료형이란 primitive 또는 Wrapper 클래스의 자료형을 의미한다.

- 만약 매개변수의 자료형으로 Generic을 사용한 경우라면 이와 같은 생략은 불가능하다. 

 

- 그러나 이처럼 생략하는 방식은 코드의 가독성이 떨어지므로 잘 사용하지 않는다.

c) 필수 파라미터 설정

- @RequestParam의 required 옵션을 사용하여, 특정 URL parameter를 필수로 설정할 수 있다.

@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/requestparam/required")
    public String usingRequired(
                                                   @RequestParam(required = true) String username, 
                                                   @RequestParam(required = false) Integer age) {
        
        return "필수 파라미터 설정하기";
    }
}

- 위의 코드처럼 required 옵션을 사용하면 request의 URL에 반드시 해당 parameter를 포함해야 한다.

d) defaultValue 설정

- @RequestParam의 defaultValue 옵션을 사용하여, 특정 URL parameter의 기본값을 설정할 수 있다.

@Controller
public class UrlParameterController {
   @ResponseBody
   @ReqeustMapping("/requestparam/default")
   public String usingDefaultValue (
                                                    @ReqeustParam(required = false, defaultValue = "guest") String username,
                                                    @ReqeustParam(required = false, defaultValue = "-1") int age) {
                                      
       return "@RequestParam의 DefaultValue 설정"
   }
}

- 만약 Client로부터 다음과 같은 주소로 요청이 들어온다고 가정해보자.

   → requestparam/default

 

- 위의 요청 주소에는 아무런 URL parameter가 없는 상태이다.

- @RequestParam의 default 옵션은 Null 값이나 빈 문자열("")을 모두 defaultValue로 처리한다.

e) Map을 사용한 URL parameter 조회

- 요청 URL에 포함된 모든 parameter를 한 번에 받는 방법이다.

- 동일한 URL 속성(key) 값에 다수의 Value가 할당된 경우 Map을 사용한다.

- 다만, 동일한 URL 속성에 다수의 Value를 할당하는 경우는 매우 드물다.

@Slf4j
@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/requestparam/multi")
    public String usingMap(@RequestParam MultiValueMap<String, Object> paramMap) {
    
     	log.info("username = {}, age = {}", paramMap.get("username"), paramMap.get("age"));
        
        return "MultiValueMap을 사용하여 모든 request parameter 조회하기";
    }
}
@Slf4j
@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/requestparam/multi")
    public String usingMultiMap(@RequestParam MultiValueMap<String, Object> paramMap) {
    
     	log.info("username = {}, age = {}", paramMap.get("username"), paramMap.get("age"));
        
        return "MultiValueMap을 사용하여 모든 request parameter 조회하기";
    }
}

3. Model을 이용한 방법

a) Manual 한 방식

- 우선 다음과 같은 Model 클래스를 작성한다.

public class UserData {
    private String username;
    private int age;
}

 

- 그리고 위에서 작성한 UserData 클래스를 이용하여 URL parameter를 받아온다.

@Slf4j
@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/model/manual")
    public String usingModel(@RequestParam String username, @RequestParam int age) {
        UserData userData = new UserData();
        userData.setUsername(username);
        userData.setAge(age);

        log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());
        log.info("userData = {}", userData);

        return "ModelAttribute Manual";
    }
}

b) @ModelAttribute

- Model 클래스를 @ModelAttribute와 함께 사용하기 위해서 @Data를 부착한다.

@Data
public class UserData {
    private String username;
    private int age;
}

 

- 그리고 다음과 같이 @ModelAttribute를 설정한다.

- @ModelAttribute는 Model 객체를 알아서 생성해주고 URL parameter와 매핑된 변수에 값을 주입시킨다.

@Slf4j
@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/model/attribute")
    public String usingModelAttribute1(@ModelAttribute UserData userData) {
        
        log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());
        log.info("userData = {}", userData);

        return "ModelAttribute annotation";
    }
}

c) @ModelAttribute 생략

- @RequestParam과 마찬가지로, Spring은 단순한 자료형을 사용하는 경우 @ModelAttribute를 생략할 수 있다.

@Slf4j
@Controller
public class UrlParameterController {

    @ResponseBody
    @RequestMapping("/model/attribute/omit")
    public String usingModelAttribute2(UserData userData) {
    
        log.info("username = {}, age = {}", userData.getUsername(), userData.getAge());
        log.info("userData = {}", userData);

        return "ModelAttribute omit";
    }
}

'Back-end > Spring MVC 개념' 카테고리의 다른 글

16. Request - JSON 조회방법  (0) 2022.03.16
15. Request - message Body 조회방법  (0) 2022.03.15
13. Annotation 기반의 URL 매핑  (0) 2022.03.10
12. Annotation 기반의 Spring MVC  (0) 2022.03.09
11. Spring MVC의 특징  (0) 2022.03.08

댓글