Spring/Lombok

@RequestParam, @ModelAttribute

JWonK 2022. 8. 1. 15:39
728x90
반응형

@RequestParam과 @ModelAttribute 모두 클라이언트로부터의 전달값을 핸들러의 매개변수로 매핑할 때 사용한다.

각각의 차이가 무엇인지 알아야한다.

 

 

@RequestParam


@RequestParam은 클라이언트에서 전송하는 전달값을 1:1로 매핑한다고 생각하면 된다.

 

예를 들어,

http://localhost:8080/name=kim?age=20

이런 식으로 전달값이 넘어왔다고 가정해보자.

 

우리는 HTTP Body에서 2개의 전달값을 추출할 수 있다. { "name" : "kim"과 "age" : 20 }이다.

이것들을 하나 하나 추출할 때 @RequestParam을 사용하는 것이다.

 

사용법을 확인해보면

@Controller
public class testController{
    
    @GetMapping("/")
    public class getPage(@RequestParam("name") String name, @RequestParam("age") int age){
    	
        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
        
        return "test";
    }
}

이런식으로 @ReqeustParam 뒤 괄호 안에 우리가 추출해야할 전달값의 이름을  넣어주고, 이를 받아줄 자바 변수를 뒤에 받아주면 된다.

 

이렇게 하나 하나 받는 경우도 좋지만 만약 받아야할 전달값이 5~6개이며, 이는 하나의 객체로 표현된다면?

@RequestParam으로 모두 사용하기에는 무리가 있다. 그래서 등장한 것이 @ModelAttribute이다.

 

 

 

@ModelAttribute


실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다. 위에서 사용한 @RequestParam을 사용한다면

@RequestParam String name;
@RequestParam int age;

ExData data = new ExData();
data.setName(name);
data.setAge(age);

이런식으로 표현될 것이다. 하지만 스프링은 이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다.

 

먼저 요청 파라미터를 바인딩 받을 객체를 만들어야한다.

@Data
public class ExData{
    private String name;
    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")
public String modelAttribute(@ModelAttribute ExData exData){

    System.out.println("username = {}, age = {}", exData.getName(), exData.getAge());
    
    return "ok";
}

ExData 객체가 생성되고, 요청 파라미터의 값도 모두 바인딩되어 존재한다.

 

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

  • ExData객체를 생성한다.
  • 요청 파라미터의 이름으로 ExData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 바인딩한다. setter를 호출하여 파라미터 값을 바인딩하므로 @Data를 사용하지 않으면 @Setter를 무조건 선언해주어야 한다.

 

728x90
반응형

'Spring > Lombok' 카테고리의 다른 글

빈 등록 어노테이션 @Bean @Configuration @Component  (0) 2022.05.15
@PostConstruct @PreDestroy  (0) 2022.05.08
@Data  (0) 2022.05.03
@RestController @Requestbody @Responsebody  (0) 2022.05.03
@Transactional  (0) 2022.04.29