요청 받아야 하는 파라미터(@RequestParam)이 많으면
일일이 다 작성을 해줘야 하는가?
상황
--
쇼핑몰 프로젝트에서 상품 목록을 조회하는 API를 작성하는데
HTTP 메서드가 GET이기 때문에 파라미터를 통해서 데이터를 받아와야 한다.
여기서 받아와야 하는 데이터
- String itemSort : 정렬
- Long categoryId : 카테고리
- itemName : 상품명
- nowPage : 현재 페이지
이를 코드로 작성하면
@GetMapping("/itemList")
public ItemDto.SimpleItemPageResponse showItems(@RequestParam("itemSort") String itemSort, @RequestParam("categoryId") Long categoryId, @RequestParam("itemName") String itemName, @RequestParam("nowPage") int nowPage){
ItemDto.SimpleItemPageResponse itemPageDto = itemService.showItems(itemSort, categoryId, itemName, nowPage);
return itemPageDto;
}
위와 같이 @RequestParam을 이용해서 하나씩 작성했다.
--
의문
--
위 처럼 코드를 작성할 때 의문이 들었다.
파라미터의 개수가 몇개 없을 때는 괜찮을 것 같지만
만약 파라미터의 개수가 많아진다면 모두 위와 같이 모두 작성을 해줘야하는가?
@RequestBody 처럼 DTO(클래스)로 한번에 받아오는 방법은 없을까?
--
@ModelAttribute 사용하기
--
@ModelAttribute는
Spring에서 컨트롤러 메서드의 매개변수에 사용되는 어노테이션으로
주로 HTTP 요청의 데이터를 자바 객체에 바인딩하는 데에 사용된다.
예시 코드
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class SearchDto {
private String itemSort = "new";
private Long categoryId = null;
private String itemName = null;
private int nowPage = 1;
}
@GetMapping("/itemList")
public ItemDto.SimpleItemPageResponse showItems(@ModelAttribute SearchDto request){
ItemDto.SimpleItemPageResponse itemPageDto = itemService.showItems(request);
return itemPageDto;
}
HTTP 요청의 데이터를 가지고 SearchDto 객체를 생성하고 필드에 요청 받은 데이터를 자동으로 매핑해준다.
--
요청 받은 데이터와 객체의 필드가 일치하지 않은 경우에는?
--
요청 파라미터 중에서 해당 필드가 없는 경우에는
매핑 되지 않는 필드의 값을 null로 설정된다.
요청 파라미터 중에서 필드에는 없는 데이터가 있는 경우에는
해당 요청 받은 데이터는 매핑 될 때 무시되어 없어진다.
--
매개변수에 DTO를 사용할 때 기본 동작
--
Spring은 컨트롤러 메서드의 매개변수로 DTO를 사용할 때,
요청 파라미터를 해당 DTO 객체의 필드에 자동으로 매핑해준다.
이것은 Spring MVC의 내부 동작 방식 중에 하나로 요청 파라미터의 이름과 DTO의 필드 이름이 일치하는 경우
자동으로 매핑이 이루어 진다.
그래서 이 기본 동작을 활용하면
코드를 작성할 때 @ModelAttribute를 생략하여 작성해도 정상 동작을 한다.
@GetMapping("/itemList")
public ItemDto.SimpleItemPageResponse showItems(SearchDto request){
ItemDto.SimpleItemPageResponse itemPageDto = itemService.showItems(request);
return itemPageDto;
}
--
'Self Q&A' 카테고리의 다른 글
[Spring Boot] API 요청 시 URI에 작성된 id가 본인이 맞는지 어떻게 검사할까? (0) | 2024.05.02 |
---|---|
DTO를 깔끔하게 정리하는 방법이 없을까? (0) | 2024.04.25 |
JWT를 사용할 때 보안을 높이는 방법은 무엇이 있을까? (0) | 2024.04.19 |
로그인 인증 Session과 JWT 중에 무엇을 사용할까? (0) | 2024.04.17 |