ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @RequestBody 는 언제 붙이는 걸까?
    HangHae99/TIL-hanghae99 2021. 3. 27. 21:40

     

     

     

     

     

    인텔리제이 화면을 두 개로 나누고 여러 개의 Controller 사이를 왔다갔다 하다가 문득 어떤 메서드에는 @RequestBody 어노테이션이 있는데, 왜 다른 메서드에는 없지..? @RequestBody 이 녀석은 언제 붙이는 거였지 라는 의문이 들었다.

     

     

    UserController

    // 회원 가입 요청 처리
        @PostMapping("/user/signup")
        public String registerUser(SignupRequestDto requestDto) {
            userService.registerUser(requestDto);
            return "redirect:/";
        }

     

     

    ProductController

        // 신규 상품 등록
        @PostMapping("/api/products")
        public Product createProduct(@RequestBody ProductRequestDto requestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
            // 로그인 되어 있는 ID
            Long userId = userDetails.getUser().getId();
    
            Product product = productService.createProduct(requestDto, userId);
            // 응답 보내기
            return product;
        }

     

     

    @RequestBody를 구글링 하니

    프론트엔드에서 AJAX 요청을 할 때 데이터 형식이 JSON으로 돼있는데, 이 JSON 형식의 데이터를 서버 쪽에서 받을 때 @RequestBody 어노테이션을 사용한다고 한다.

    @RequestBody 어노테이션을 사용하면 HTTP 요청 Body부분을 통째로 자바 객체로 전달 받을 수 있다.

     

     

     

    ProductController에서 @PostMapping("@PostMapping("/api/products") 여기와 연결 돼있는 부분을 살펴보자.

    function addProduct(itemDto) {
        $.ajax({
            type: "POST",
            url: '/api/products',
            contentType: "application/json",
            data: JSON.stringify(itemDto),
            success: function (response) {
                $('#container').addClass('active');
                targetId = response.id;
            }
        })
    }

    js 파일에 보면 클라이언트가 ajax요청을 하면서 json타입의 데이터를 넘겨주고 있다.

    컨트롤러에서 이 데이터를 자바 객체로 전달을 받아야 하니까 @RequestBody 어노테이션을 사용해서 ProductRequestDto에 넣어주고 있다.

     

     

     

    반면에, UserController는 @RequestBody 어노테이션을 사용하지 않고 있는데, 이 컨트롤러에 요청하고 있는 클라이언트는 Ajax로 요청을 하고 있는 게 아닌가? 살펴보자.

    <form action="/user/signup" method="post">
        <div class="login-id-label">Username</div>
        <input type="text" name="username" placeholder="Username" class="login-input-box">
    
        <div class="login-id-label">Password</div>
        <input type="password" name="password" class="login-input-box">
    
        <div class="login-id-label">E-mail</div>
        <input type="text" name="email" placeholder="E-mail" class="login-input-box">
    
        <div>
        <input id="admin-check" type="checkbox" name="admin" onclick="onclickAdmin()" style="margin-top: 40px;">관리자
        <input id="admin-token" type="password" name="adminToken" placeholder="관리자 암호" class="login-input-box" style="display:none">
        </div>
     </form>

    ...의문이 풀렸다.

     

    클라이언트에서 컨트롤러로 요청을 할 때 그 데이터를 받으려면 @RequestBody를 써야하는 거구나 하고 넘어갔었는데, 차이를 오늘 알게 됐다.

     

     

     

     

    # update

    슬랙에 스프링 선택하신 항해 크루원분이 답변 달아주신 내용:

    data가 반환되어야 하면 RestController와 함께 RequestBody를 사용하고, view가 반환되어야 하면 Controller를 사용하는 것으로 보입니다.

     


     

     

    ...RestController랑 Controller부터 내일 개념 좀 찾아봐야겠다.

    앞으로 계속 쓸텐데 너무 헷갈리네. 

    댓글