@RequestBody, @RequestParam, @ModelAttribute의 차이

강우엉·2023년 11월 30일
0

study

목록 보기
30/44

💡 @RequestBody이란?

@RequestBody는 클라이언트가 전송하는 JSON 형태의 HTTP Body를 Java 객체로 변환 시켜주는 역할을 한다.

값을 주입하지 않고 값을 변환 시키므로, 변수들의 생성자, Getter, Setter가 없어도 정상적으로 할당된다.

📌 사용 예시

    @PostMapping("/api/v1/styles")
    public ApiResponse<?> save(@RequestBody @Valid SaveStyleRequest request) {
        // TODO: member 작업 이후 argument resolver로 받기
        Long memberId = 1L;

        UpsertStyleParam param = request.toParam(memberId);
        styleService.save(param);

        return ApiResponse.of(ReturnCode.SUCCESS);
    }

클라이언트측에서 넘어오는 JSON 형식의 데이터를 SaveStyleRequest 객체로 변환시켜주는 역할을 한다.

💡 @RequestParam이란?

@RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.

@RequestParam은 필수 여부가 true이기 때문에 반드시 해당 파라미터가 전송되어야 하며, 파라미터가 전송되지않으면 400에러가 발생한다.

반드시 필요한 값이 아니라면 required false로 설정해주면 되고, defaultValue 옵션을 사용하면 기본값 역시 지정할 수 있다.

📌 사용 예시

@ResponseBody
@RequestMapping("/request-param-v1")
public String requestParamV2(
		@RequestParam("username") String memberName,
		@RequestParam("age") int memberAge) {
	log.info("username={}, age={}", memberName, memberAge);
	return "ok";
}
  • Http 요청 파라미터의 이름으로 바인딩하여 그 값을 변수에 저장한다.
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV3(
		@RequestParam String username,
 		@RequestParam int age) {
 	log.info("username={}, age={}", username, age);
 	return "ok";
}
  • HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam의 value를 생략 가능하다.
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV4(String username, int age) {
 	log.info("username={}, age={}", username, age);
 	return "ok";
}
  • String, int, Integer 등의 단순 타입이면 @RequestParam을 생략 가능하다.

💡 @ModelAttribute란?

@ModelAttribute는 클라이언트가 전송하는 폼(form) 형태의 HTTP Body와 요청 파라미터들을 생성자나 Setter로 바인딩하기 위해 사용된다.

@ModelAttribute에는 매핑시키는 파라미터의 타입이 객체의 타입과 일치하는지 등을 포함한 다양한 검증작업이 진행된다.

📌 사용 예시

@Getter
@Setter
public class UserSearchForm {
    private int id;
    private String name;
    private String email;
    private String phone;
}


@RestController
public class TestController {
    @GetMapping("/")
    public String getTestPage(@ModelAttribute UserSearchForm userSearchForm,
                              Model model) {
        List<User> userList = userService.search(userSearchForm);
        model.addAttribute("userList", userList);
        return "test";
    }
}
  • 만약 검색 조건이 추가되는 경우, UserSearchForm의 필드를 추가해주면된다.

Reference

profile
우엉이의 코딩 성장일기💻

0개의 댓글