inblog logo
|
{CODE-RYU};
    Javascript

    [Spring] 자바스크립트 - AJAX 통신을 활용한 게시글 수정

    Feb 29, 2024
    [Spring] 자바스크립트 - AJAX 통신을 활용한 게시글 수정
    Contents
    1. View 확인2. 게시글 데이터 가져오기3. DTO 만들기4. API 컨트롤러5. 레파지토리6. AJAX 통신하기7. 결과 확인
     

    1. View 확인

     
    board/saveForm.mustache
    <button type="button" onclick="btnUpdate()" class="btn btn-primary form-control">글수정완료</button>
     
    수정 페이지의 버튼이다. 버튼을 누르면 onclick 이 실행되면서 btnUpdate() 함수가 실행된다.
     
    board/saveForm.mustache
    <script> function btnUpdate(){ alert("클릭"); } </script>
     
    notion image
     
     
    버튼이 정상적으로 작동한다.
     
    게시글 수정은 기존 작성글이 있기 때문에 수정 전 데이터를 가져와야 한다.
     

    2. 게시글 데이터 가져오기

     
    BoardController
    @GetMapping("/board/{id}/updateForm") public String updateForm(@PathVariable int id, HttpServletRequest request) { Board board = boardRepository.selectOne(id); request.setAttribute("board",board); return "board/updateForm"; }
     
    BoardRepository
    public Board selectOne(int id){ Query query = em.createNativeQuery("select * from board_tb where id = ?", Board.class); query.setParameter(1, id); try { Board board = (Board) query.getSingleResult(); return board; } catch (Exception e) { return null; } }
     
    DB에서 게시글의 데이터를 가져와 리퀘스트 객체에 담는다.
     
    board/updateForm.mustache
    <div class="container p-5"> <div class="card"> <div class="card-header"><b>익명 글수정 화면입니다</b></div> <div class="card-body"> <form"> <div class="mb-3"> <input type="text" class="form-control" placeholder="Enter author" name="author" value="{{board.author}}"> </div> <div class="mb-3"> <input type="text" class="form-control" placeholder="Enter title" name="title" value="{{board.title}}"> </div> <div class="mb-3"> <textarea class="form-control" rows="5" name="content">{{board.content}}</textarea> </div> <button type="button" onclick="btnUpdate()" class="btn btn-primary form-control">글수정완료</button> </form> </div> </div> </div>
     
    리퀘스트 객체로 가져온 데이터를 화면에 출력한다.
     
     
    notion image
     

    3. DTO 만들기

     
    BoardRequest
    @Data public static class UpdateDTO{ private String title ; private String content; private String author; }
     
    클라이언트에게 입력받은 데이터를 받는다.
     

    4. API 컨트롤러

     
    BoardApiController
    @PutMapping("/api/boards/{id}") public ApiUtil<?> update(@PathVariable Integer id,@RequestBody BoardRequest.UpdateDTO requestDTO){ boardRepository.update(requestDTO,id); return new ApiUtil<>(null); }
     
    클라이언트가 입력한 데이터를 레파지토리에 전달한다. 게시글의 번호를 통해 데이터를 찾기 때문에 id를 함께 전달한다.

    5. 레파지토리

     
    @Transactional public void update(BoardRequest.UpdateDTO requestDTO, Integer id) { Query query = em.createNativeQuery("update board_tb set title=?,content=?,author=? where id=?"); query.setParameter(1,requestDTO.getTitle()); query.setParameter(2,requestDTO.getContent()); query.setParameter(3,requestDTO.getAuthor()); query.setParameter(4,id); query.executeUpdate(); }
     
    클라이언트가 입력한 데이터를 받아 데이터를 업데이트 한다.
     

    6. AJAX 통신하기

     

    6.1 데이터 가지고 오기

     
    <script> function btnUpdate(){ let id= $("#id").val(); let board={ title:$("#title").val(), content:$("#content").val(), author:$("#author").val() }; } </script>
     

    6.2 데이터 JSON으로 변환

     
    url:"/api/boards/{{board.id}}", type:"put", data:JSON.stringify(board), contentType:"application/json; charset=utf-8"
     

    6.3 AJAX 통신

     
    <script> function btnUpdate(){ let id= $("#id").val(); let board={ title:$("#title").val(), content:$("#content").val(), author:$("#author").val() }; $.ajax({ url:`/api/boards/${id}`, type:"put", data:JSON.stringify(board), contentType:"application/json; charset=utf-8" }).done((res)=>{ location.href="/"; }).fail((res)=>{ alert(res.responseJSON.msg); }); }; </script>
     
    통신이 완료되면 메인 페이지, 실패하면 오류 팝업을 띄운다.
     
     

    7. 결과 확인

     
    notion image
     
    index.mustache
    <form action="/board/${board.id}/updateForm" method="get">
     
    게시글 수정 버튼에 게시글 번호를 표시한다.
     
    updateForm.mustache
    {{> layout/header}} <div class="container p-5"> <div class="card"> <div class="card-header"><b>익명 글수정 화면입니다</b></div> <div class="card-body"> <form> <input type="hidden" id="id" value="{{board.id}}"> <div class="mb-3"> <input type="text" class="form-control" id="author" value="{{board.author}}"> </div> <div class="mb-3"> <input type="text" class="form-control" id="title" value="{{board.title}}"> </div> <div class="mb-3"> <textarea class="form-control" rows="5" id="content">{{board.content}}</textarea> </div> <button type="button" onclick="btnUpdate()" class="btn btn-primary form-control">글수정완료</button> </form> </div> </div> </div> <script> function btnUpdate(){ let id= $("#id").val(); let board={ title:$("#title").val(), content:$("#content").val(), author:$("#author").val() }; $.ajax({ url:`/api/boards/${id}`, type:"put", data:JSON.stringify(board), contentType:"application/json; charset=utf-8" }).done((res)=>{ location.href="/"; }).fail((res)=>{ alert(res.responseJSON.msg); }); }; </script> {{> layout/footer}}
     
    notion image
    notion image
     
    정상적으로 게시글이 수정되었다.
    Share article

    {CODE-RYU};

    RSS·Powered by Inblog