minOS

스프링 MVC 기본 기능 - @RequestParam,@ModelAttribute 본문

TIL/김영한의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

스프링 MVC 기본 기능 - @RequestParam,@ModelAttribute

minOE 2024. 7. 28. 15:41
728x90

@RequestParam

스프링이 제공하는 `@RequestParam` 을 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다.

1) @RequestParam 어노테이션을 사용한 요청 파라미터 처리 예제
 @ResponseBody
    @RequestMapping("/request-param-v2")
    public String requestParamV2(
            @RequestParam("username") String myName,
            @RequestParam("age") int myAge) {
        // 로그로 myName과 myAge 출력
        log.info("username = {} , age = {}", myName, myAge);
        return "ok";
    }​

 

@RequestParam : 파라미터 이름으로 바인딩
@ResponseBody : View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력


2) @RequestParam 어노테이션 사용시 파라미터 이름을 생략한 예제 , 변수명과 요청 파라미터 네임이 같아야 함
    @ResponseBody
    @RequestMapping("/request-param-v3")
    public String requestParamV3(
            @RequestParam String username,
            @RequestParam int age) {
        // 로그로 username과 age 출력
        log.info("username = {} , age = {}", username, age);
        return "ok";
    }




3)@RequestParam 어노테이션 없이 요청 파라미터 처리 예제

@ResponseBody
    @RequestMapping("/request-param-v4")
    public String requestParamV4(String username, int age) {
        // 변수명이 요청 파라미터 이름과 동일해야 한다
        // 로그로 username과 age 출력
        log.info("username = {} , age = {}", username, age);
        return "ok";
    }

 

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



4) 필수 요청 파라미터 처리 예제

    @ResponseBody
    @RequestMapping("/request-param-required")
    public String requestParamRequired(
            @RequestParam(required = true) String username,
            @RequestParam(required = false) Integer age) {
        // age는 요청 파라미터에서 빠질 수 있음
        // 빠질 경우 null 값이 들어가야 하기 때문에 Integer로 선언
        log.info("username = {} , age = {}", username, age);
        return "ok";
    }

 


필수 파라미터인 username이 빠진 경우

 

@RequestParam.required
-
파라미터 필수 여부
- 기본값이 파라미터 필수( `true` )이다.

주의! - 파라미터 이름만 사용
/request-param-required?username=`

파라미터 이름만 있고 값이 없는 경우 빈문자로 통과

 


5) 요청 파라미터 기본 값 설정 예제

 @ResponseBody
    @RequestMapping("/request-param-default")
    public String requestParamDefault(
            @RequestParam(required = true, defaultValue = "guest") String username,
            @RequestParam(required = false, defaultValue = "-1") Integer age) {
        // 기본 값이 설정된 경우 파라미터가 없을 때 기본 값을 사용
        log.info("username = {} , age = {}", username, age);
        return "ok";
    }

- 파라미터에 값이 없는 경우 `defaultValue` 를 사용하면 기본 값을 적용할 수 있다. 이미 기본 값이 있기 때문에 `required` 는 의미가 없다.

-`defaultValue` 는 빈 문자의 경우에도 설정한 기본 값이 적용된다.

6) 요청 파라미터를 Map으로 처리하는 예제

 @ResponseBody
    @RequestMapping("/request-param-map")
    public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
        // 요청 파라미터를 Map으로 받아서 처리
        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, ...]
    ex) (key=userIds, value=[id1,
id2])`

- 파라미터의 값이
1개가 확실하다면 `Map` 을 사용해도 되지만, 그렇지 않다면 `MultiValueMap` 을 사용하자.

 

 

@ModelAttribute

개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다. 보통 다음과 같이 코드를 작성할 것이다.
import lombok.Data;

@Data //`@Getter` , `@Setter` , `@ToString` , `@EqualsAndHashCode` , `@RequiredArgsConstructor`를 자동으로 적용해준다.
public class HelloData {
    private String username;
    private int age;
}​

@ModelAttribute 사용하지 않는 경우
  //@ModelAttribute 사용x
  @ResponseBody
    @RequestMapping("/model-attribute-v0")
    public String modelAttributeV1(@RequestParam String username,
                                  @RequestParam int age){
        HelloData helloData =new HelloData();
        helloData.setUsername(username);
        helloData.setAge(age);
        log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge());

        return "ok";
    }




@ModelAttribute 사용하는경우
    @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttributeV2(@ModelAttribute HelloData helloData){
        log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge());
        return "ok";
    }
마치 마법처럼 `HelloData` 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다.
스프링MVC는 `@ModelAttribute` 가 있으면 다음을 실행한다. `HelloData` 객체를 생성한다. 요청 파라미터의 이름으로 `HelloData` 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
예) 파라미터 이름이 `username` 이면 `setUsername()` 메서드를 찾아서 호출하면서 값을 입력한다.


프로퍼티

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

username 프로퍼티의 값을 변경하면 `setUsername()` 이 호출되고, 조회하면 `getUsername()` 이 호출된다.


@ModelAttribute 생략하는 경우
 @ResponseBody
    @RequestMapping("/model-attribute-v2")
    public String modelAttributeV3( HelloData helloData){
        log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge());
        return "ok";
    }


스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
`String` , `int` , `Integer` 같은 단순 타입 = `@RequestParam`
나머지 = `@ModelAttribute` (argument resolver 로 지정해둔 타입 외)

 

728x90