Spring/MVC

HTTP 요청 파라미터 - @RequestParam @ModelAttribute

JWonK 2022. 7. 7. 15:59
728x90
반응형

HTTP 요청 파라미터 - @RequestParam

 

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


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

 

http://localhost:8080/request-param-v2?username=mvc&age=22

 

@RequestParam 사용 - 파라미터 이름으로 바인딩

@ResponseBody 추가 - View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력

 

  • @RequestParam의 name(value) 속성이 파라미터 이름으로 사용
  • @RequestParam("username") String username
  • -> request.getParameter("username")

 

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

-> 생략 가능하나, 명확하게 욫요청 파라미터에서 데이터를 읽는다는 것을 나타내는 것이 더 좋은 방법

 


HTTP 요청 파라미터 - @ModelAttribute

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

@RequestParam String username;
@RequestParam int age;

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

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

 

 

 

 

먼저 요청 파라미터를 바인딩 받을 객체를 만들자

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

 

 

롬복 @Data가 무엇인지는 아래 게시글로 알 수 있다.

https://wonsjung.tistory.com/388?category=1013361 

 

@Data

▶ @Data @Data 어노테이션은 @Getter / @Setter, @ToString, @EqualAndHashCode와 @RequiredArgsConstructor를 모두 다 합쳐놓은 큰 범주의 세트라고 할 수 있다. POJO(Plain Olde Java Objects)와 bean과 관련된..

wonsjung.tistory.com

 

 

@ModelAttribute 적용

@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute ExData exData) {
    log.info("username = {}, age = {}", exData.getUsername(), exData.getAge());
    return "ok";
}

 

마치 마법처럼 ExData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가있다.

 

스프링 MVC는 @ModelAttribute 가 있으면 다음을 실행한다.

  • ExData 객체를 생성한다.
  • 요청 파라미터의 이름으로 ExData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
  • ex) 파라미터의 이름이 username이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.

 

프로퍼티 ?

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

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

 

 

더보기

참고 : <인프런> 김영한 : 스프링 MVC - 기본 기능

 
728x90
반응형