프로젝트/Trend-Pick

@RequestParam과 @RequestBody의 차이점

chanhee01 2023. 7. 22. 17:42
@PostMapping("/create_post") // 글쓰기 페이지에서 저장을 누르는거
public CreatePostResponse savePost(@RequestParam CreatePostDto createPostDto) throws Exception {

    Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
    Post post = new Post(member, createPostDto.getTitle, createPostDto.getContent, LocalDateTime.now());
    Long postId = postService.savePost(post);

    if (imgInPost != null) {
        postImgService.save(createPostDto.getImgInPost, post);
    }

    return new CreatePostResponse(postId);
}

처음에는 @RequestParam으로 Dto를 받아와서 postman으로 결과를 관찰하려 했었다.

Dto에는 title, content, imgInPost라는 변수가 들어있었고, 타입도 잘 맞았는데 400(Bad Requeset)에러가 계속 발생했었다.

 

오류의 이유는 @RequestParam은 Dto로 받아오지 못하기 때문이다.

Dto로 받아오고 반환을 하기 위해서는 @RequestBody를 사용해야 한다.

 

복잡한 데이터 : @RequestBody에서 Dto를 사용한 데이터 전달

간단한 데이터 : @RequestParam을 통한 요청, 응답

 

하지만 사진을 보내는 것은 @RequestParam을 통해서만 접근이 가능하기 때문에 @RequestParam으로 title, content, imgInPost를 잘 받아올 수 있었다.

 

@PostMapping("/create_post") // 글쓰기 페이지에서 저장을 누르는거
public CreatePostResponse savePost(@RequestParam String title,
                                   @RequestParam String content,
                                   @RequestParam(required = false) MultipartFile imgInPost) throws Exception {

    Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
    Post post = new Post(member, title, content, LocalDateTime.now());
    Long postId = postService.savePost(post);

    if (imgInPost != null) {
        postImgService.save(imgInPost, post);
    }
    
    return new CreatePostResponse(postId);
}

위와 같이 하나씩 파라미터로 받아오는 것으로 해결했다.

 

 

별거 아닌 문제였지만 '400에러'라고만 표시되기 때문에 어떤 부분이 잘못된 지 몰라서 해결하기 어려웠다.

결국 @RequestParam과 @RequestBody의 차이점을 제대로 인지하지 못하고 사용했기 때문에 이와 같은 상황이 발생했을 때 바로 해결하지 못하고 시간을 지체한 것이라고 생각한다.

 

많이 사용하는 메서드, 애노테이션일 수록 그 의미와 기능을 잘 숙지하고 사용하는 것이 중요하다는 것을 알게 되었다.