-
@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부터 내일 개념 좀 찾아봐야겠다.
앞으로 계속 쓸텐데 너무 헷갈리네.
'HangHae99 > TIL-hanghae99' 카테고리의 다른 글
[IntelliJ] .gitignore 파일에 application.properties 민감 정보 안나오게 하기 (1) 2021.04.16 [IntelliJ] 인텔리제이 단축키 모음 (window) (1) 2021.04.05 [IntelliJ] 간단하게 JSON 라이브러리 추가하는 방법 (0) 2021.03.26 Port 8080 was already in use. (0) 2021.03.25 03/25(Thu) 포트포워딩이 안될 때 (0) 2021.03.25