Hello

71. 댓글 작성시 Dto 사용해보기

by 볼빵빵오춘기

지난강의에서..

  • 데이터를 받을 때 dto없이 넘겨왔다.
  • 하지만 데이터 받을 때 컨트롤러에서 dto를 만들어서 받는게 좋다.
  • 이 강의서 dto를 받지않은 이유는 OAuth 흐름을 알기위한 미니 프로젝트이기때문이다.

 

ReplySaveRequestDto

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ReplySaveRequestDto {
    private int userId;
    private int boardId;
    private String content;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class ResponseDto<T> {
        // HttpStatus status;
        int status;
        T data;


    }
}

 

BoardApiController

  • 지난번에 매개변수에 @PathVariable int boardId,@RequestBody Reply reply, 따로 따로 가져왔는데 ReplySaveRequestDto를 만듦으로써 ReplySaveRequestDto로 매개변수를 받는것으로 변경한다.
  • 그러면 기존에 사용자 정보를 detail.jsp에서 넘겨서 받아와야한다.
    ⇒ detail.jsp 에 input type=”hidden” 으로 해서 사용자 정보 받아온다.
@PostMapping("/api/board/{boardId}/reply")
public ReplySaveRequestDto.ResponseDto<Integer> replaySave(@RequestBody ReplySaveRequestDto replySaveRequestDto){

    return new ReplySaveRequestDto.ResponseDto<Integer>(HttpStatus.OK.value(),1);
}

 

detail.jsp

<div class="card">
    <form>
        <input type="hidden" id="userId" value="${principal.user.id}">
        <input type="hidden" id="boardId" value="${board.id}">
        <div class="card-body">
            <textarea id="reply-content" rows="2" class="form-control"></textarea>
        </div>
        <div class="card-footer">
            <button type="button" id="btn-reply-save" class="btn btn-primary">등록</button>
        </div>
    </form>
</div>

 

board.js

replySave: function () {
    let data = {
        userId : $("#userId").val(),
        boardId : $("#boardId").val(),
        content: $("#reply-content").val(),
    };

    $.ajax({
        type: "POST",
        url: `/api/board/${data.boardId}/reply`, // 참고로 여기서 따옴표가 아니라 백틱이다!
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
    }).done(function (resp) {
        alert("댓글작성이 완료되었습니다.");
        location.href = `/board/${data.boardId}`;
    }).fail(function (error) {
        alert(JSON.stringify(error));
    });
},

 

BoardApiController

※ 댓글쓰기의 매개변수도 변경됐으므로 BoardService 에가서 수정해야한다.

@PostMapping("/api/board/{boardId}/reply")
public ReplySaveRequestDto.ResponseDto<Integer> replaySave(@RequestBody ReplySaveRequestDto replySaveRequestDto){
            boardService.댓글쓰기2(replySaveRequestDto);
    return new ReplySaveRequestDto.ResponseDto<Integer>(HttpStatus.OK.value(),1);
}

 

BoardService

  • 지난 강의에서는 User의 정보는 principle에 저장되어있는 값을 가져왔기 때문에 따로 영속화하지않았지만 이번엔 매개변수로 받아오므로 user도 영속화해줘야한다.
  • 방법1처럼 넣을 수도있지만 Reply에 방법2update() 함수를 만들어 값을 넣을 수도 있다.
@Autowired
private UserRepository userRepository;
@Transactional
public void 댓글쓰기2(ReplySaveRequestDto replySaveRequestDto){

    User user= userRepository.findById(replySaveRequestDto.getUserId()).orElseThrow(()->{
        return new IllegalArgumentException("댓글 찾기 실패 : 유저 id를 찾을 수 없습니다.");
    }); // 영속화 완료

    Board board= boardRepository.findById(replySaveRequestDto.getBoardId()).orElseThrow(()->{
        return new IllegalArgumentException("댓글 찾기 실패 : 게시글 id를 찾을 수 없습니다.");
    }); // 영속화 완료

// 방법1
//        Reply reply = Reply.builder()
//                .user(user)
//                .board(board)
//                .content(replySaveRequestDto.getContent())
//                .build();

// 방법2
    Reply reply = new Reply();
    reply.update(user,board,replySaveRequestDto.getContent());

    replyRepository.save(reply);
}

 

Reply

public void update(User user, Board board, String content){
    setUser(user);
    setBoard(board);
    setContent(content);
}

 

'강의 따라하기 > blog' 카테고리의 다른 글

73. @Autowired의 원리  (1) 2024.01.11
72. 댓글 작성시 네이티브 쿼리 사용해보기  (0) 2024.01.11
70. 댓글 작성하기  (0) 2024.01.10
69. 댓글 목록 뿌리기  (1) 2024.01.10
68. 댓글 디자인하기  (0) 2024.01.10

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기