이제까지는 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으로
확인을 해보았다.
테스트 결과

- 해당 테스트로 다른 데이터들은 수정이 되는것을 확인하였는데 isPublic이 수정이 안되는 것을 확인.
DTO에서는
isPublic이 String타입으로 선언되어 있고, toEntity() 메서드에서는 isPublic이 null이 아닌 경우 무조건 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 데이터로 입력한 값이 모두 정상적으로 수정이 되는 것을 확인 할 수 있다.

Share article