[RestAPI 개발기] 2. JSON형태로 받기 위해 Controller 수정

편준민's avatar
May 06, 2025
[RestAPI 개발기] 2. JSON형태로 받기 위해 Controller 수정
이제까지는 View를 만들었기 때문에 x-www-form를 반환하는 코드를 작성하였다. 하지만 지금부터는 View를 직접 만들지 않고, JSON 데이터를 반환하는 코드로 수정을 하는 작업이다.
  • 기존 코드(HTML 파일을 반환해줌)
@PostMapping("/board/{id}/update") public String update(@PathVariable("id") Integer id, @Valid BoardRequest.UpdateDTO reqDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.DTO respDTO = boardService.글수정하기(reqDTO, id, sessionUser.getId()); return "redirect:/board/" + id; }

1️⃣ 기존 코드에서 수정하는 방법

💡

1. URL 수정

💡
기존 코드
@PostMapping("/board/{id}/update")
수정 코드
@PutMapping("/board/{id}")
  • 이전까지는 form 태그를 사용하여 데이터를 받아왔기 때문에 GET, POST만 사용이 가능했다. POST에서 insert, update, delete를 모두 처리 했다. 하지만 구분이 어렵기 때문에 URL에 어떤 것을 처리하는지 동사를 추가하여 구분하였다. ex) /board/delete
  • 하지만 이제는 form 태그를 사용하여 데이터를 받지 않기 때문에 GET, POST, PUT, DELETE를 사용하여서 구분을 하였다.

2. 매개변수를 JSON데이터로 받아오기

💡
기존 코드
public String update(@PathVariable("id") Integer id, @Valid BoardRequest.UpdateDTO reqDTO, Errors errors)
수정 코드
public String update(@PathVariable("id") Integer id, @Valid @RequestBody BoardRequest.UpdateDTO reqDTO, Errors errors)
  • 받아오는 DTO를 기존에는 x-www-form으로 받았지만, 이제부터는 JSON으로 받아야하기 때문에, 받아올 매개변수 앞에 어노테이션 @RequestBody를 붙여서 JSON 데이터로 받아오게 설정

3. HTML 파일 말고 데이터 반환하기

💡
기존 코드
return "redirect:/board/" + id;
수정 코드
return Resp.ok(respDTO);
  • 기존에는 HTML 파일을 반환하였지만, Rest API는 데이터를 반환해야하기 때문에 기존에 DTO에 저장한 데이터를 반환해주면 된다.

4. 데이터 타입 일치

💡
기존 코드
@PostMapping("/board/{id}/update") public String update(@PathVariable("id") Integer id, @Valid BoardRequest.UpdateDTO reqDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.DTO respDTO = boardService.글수정하기(reqDTO, id, sessionUser.getId()); return "redirect:/board/" + id; }
수정 코드
@PutMapping("/board/{id}") public @ResponseBody Resp<?> update(@PathVariable("id") Integer id, @Valid @RequestBody BoardRequest.UpdateDTO reqDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.DTO respDTO = boardService.글수정하기(reqDTO, id, sessionUser.getId()); return Resp.ok(respDTO); }
  • return을 할 때에 타입이 일치하지 않아서 오류가 나는데 클래스의 타입을 일치시켜주어 오류를 해결
  • @ResponseBody를 붙여야지만 Json으로 반환해줌

수정 완료한 코드

@PutMapping("/board/{id}") public @ResponseBody Resp<?> update(@PathVariable("id") Integer id, @Valid @RequestBody BoardRequest.UpdateDTO reqDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.DTO respDTO = boardService.글수정하기(reqDTO, id, sessionUser.getId()); return Resp.ok(respDTO); }
 

2️⃣ 테스트

💡
수정한 코드가 정상적으로 JSON 데이터를 받아서 DB데이터가 수정이 되는지 POSTMAN으로 확인을 해보았다.

테스트 결과

notion image
  • 해당 테스트로 다른 데이터들은 수정이 되는것을 확인하였는데 isPublic이 수정이 안되는 것을 확인.
💡
DTO에서는 isPublicString타입으로 선언되어 있고, toEntity() 메서드에서는 isPublicnull이 아닌 경우 무조건 true를 반환한다. false문자열을 보내도 null이 아니므로 true로 저장되기 때문에 수정이 되지 않는 문제를 발견.
@Data public static class UpdateDTO { @NotEmpty(message = "제목을 입력하세요") private String title; @NotEmpty(message = "내용을 입력하세요") private String content; private String isPublic; public Board toEntity(User user) { return Board.builder() .title(title) .content(content) .isPublic(isPublic == null ? false : true) .user(user) // user객체 필요 .build(); } }
해당 문제는 isPublic을 Boolean 타입으로 선언을 하고 toEntity 메서드에서는 로직 처리 없이 값을 그대로 넘겨주면 된다.

수정 후 테스트 결과

💡
JSON 데이터로 입력한 값이 모두 정상적으로 수정이 되는 것을 확인 할 수 있다.
notion image
Share article

YunSeolAn