HangHae99/TIL-hanghae99

@RequestBody 는 언제 붙이는 걸까?

kellykang 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부터 내일 개념 좀 찾아봐야겠다.

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