[Spring] @ReqeustParam, @RequestBody, @ReqeustPart

오형상·2023년 6월 27일
0

RecipeFriend

목록 보기
2/8
post-thumbnail

쇼핑몰 토이 프로젝트에서 이미지 업로드를 기능 추가 중 @RequestPart를 사용하게 되었다.
@RequestPart는 처음 사용해 보는 거라 @RequestPart에 대해 공부하면서 @RequestParm, @RequestBody에 대해서도 같이 정리 해보고자 한다.


@ReqeustParm

1개의 파라미터를 받기 위해 사용한다.
파라미터 여부가 default로 required = true 이므로 반드시 파라미터가 전송되어야 한다.
파라미터가 없다면 Bad Request 400 에러가 발생한다.
(required = false로 변경하면 파라미터가 없어도 동작한다.)

@RequestParam 또한 @RequestPart와 같이 MultipartFile을 받을 때 사용할 수 있다.

@RequestParm 사용 예시

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/brands")
public class BrandController {

    private final BrandService brandService;

    @Tag(name = "Brand", description = "브랜드 API")
    @Operation(summary = "브랜드 단건 조회")
    @GetMapping
    public Response<BrandInfo> getBrand(@RequestParam Long brandId) {

        BrandInfo brandInfo = brandService.getBrandInfo(brandId);

        return Response.success(brandInfo);
    }

@ReqeustBody

@ReqeustBody는 HttpMessageConverter가 HTTP Request Body 내의 데이터를 객체로 역직렬화하는 애노테이션이다.

선택적으로 @Valid를 추가하여 자동 유효성 검사를 적용할 수도 있다.
실패 시 MethodArgumentNotValidException을 던진다.

@RequestBody 사용 예시

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/accounts")
public class AccountController {

    private final AccountService accountService;

    @Tag(name = "Account", description = "계좌 API")
    @Operation(summary = "계좌 등록")
    @PostMapping
    public Response<AccountCreateResponse> createAccount(@Valid @RequestBody AccountCreateRequest request, Authentication authentication) {

        String email = authentication.getName();
        log.info("email:{}", email);

        AccountCreateResponse response = accountService.saveAccount(request, email);

        return Response.success(response);
    }

@ReqeustPart

Content-type이 multipart/form-data와 관련된 경우에 사용한다.

MultipartFile이 포함되는 경우에 MutliPartResolver가 동작하여 역직렬화를 하게 됨.

MultipartFile이 포함되지 않는 경우는 @RequestBody와 같이 HttpMessageConverter가 동작하게 된다.

@RequestPart 사용 예시

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/brands")
public class BrandController {

    private final BrandService brandService;

    @Tag(name = "Brand", description = "브랜드 API")
    @Operation(summary = "브랜드 등록")
    @PostMapping
    public Response<BrandCreateResponse> createBrand(@Valid @RequestPart BrandCreateRequest request, @RequestPart MultipartFile multipartFile) {

        BrandCreateResponse response = brandService.saveBrand(request, multipartFile);

        return Response.success(response);
    }

번외) HttpMessageConverter

spring-web 모듈은 HttpMessageConverter를 기본적으로 포함하고 있으며, InputStream에서 HTTP request의 body를 읽는 역할 & OutputStream에서 HTTP response의 body에 데이터를 쓰는 역할을 담당한다.

HttpMessageConverter(인터페이스)의 구현체는 MIME 타입에 의해 정해진다.

RequestMappingHandlerAdapter가 이를 판단하고 적절한 HttpMessageConverter를 사용할 수 있게 해준다.

MIME

text/* -> StringHttpMessageConverter

application/x-www-form-urlencoded -> FormHttpMessageConverter

application/json -> MappingJackson2HttpMessageConverter

MappingJackson2HttpMessageConverter

Jackson 라이브러리의 ObjectMapper를 사용해서 JSON을 읽거나 쓰도록 만들어주는 HttpMessageConverter 구현체


Reference

0개의 댓글