[spring 토이프로젝트] 게시판 crud, 검색, 페이징 구현- 4. 게시글 수정/삭제

이건회·2022년 7월 28일
0

spring게시판1

목록 보기
4/6

레퍼런스 : https://velog.io/@max9106/Spring-Boot-JPA-MySQL-%EA%B2%8C%EC%8B%9C%EA%B8%80-%EC%88%98%EC%A0%95-%EC%82%AD%EC%A0%9C

프로젝트 전체 소스코드 : https://github.com/rawfishthelgh/boardcrud.git

  • detail 템플릿에서 수정 버튼을 누르면 /post/edit/{게시글(boardDto)id} 값으로 url 요청이 날아간다.

  • 역시 컨트롤러에서 url매핑을 해준다. 이때 detail 매핑을 했던 것과 같은 로직으로 작동하므로 getPost를 그대로 사용하고, update.html로 렌더링해주면 된다.

  • update.html 의 input value에 수정하려는 boardDto 객체 정보가 표시되어 있으므로

  • 이렇게 해당 게시글 정보가 그대로 유지된 채 수정 화면이 렌더링된다.

  • 이제 실제로 업데이트요청이 되도록 하는 Put요청 매핑 url을 작성한다. Service의 savePost 로직을 그대로 활용해서 db에 저장하고 메인페이지로 redirect를 해준다.
  • 그런데 PostMapping으로 해도 수정이 제대로 되던데, 이를 Put이 아닌 Post 요청을 했을 때 생기는 문제는 무엇일까...?(단순 rest api 규칙 지키기 때문...?)


  • (질문필요)redirect를 활용하는 이유를 잠깐 짚고 넘어가면 만약 위와 같은 식으로 redirect가 아닌 render를 쓸 경우 url 요청이 /post/edit/게시글 id로 넘어가고 list.html 템플릿을 띄우기만 할 뿐이며 저장한 게시글 정보가 나타나지 않는다. 따라서 아예 메인페이지로 새로운 url 요청을 보내는 redirect를 사용한다.(그런데 왜 이 때 저장한 게시글 정보가 템플릿에 나타나지 않는지는 확실히 모르겠다)

  • 또 Put 요청을 사용하려면 이 HiddenHttpMethodFilter를 메인 클래스에 생성해야 한다. 왜냐면 html form에서는 오직 post,get 요청만 지원하므로
  • 이런식으로 form 태그 내부에 hidden타입 설정을 통해 이 요청이 put임을 알려주는데 스프링 내부에 이 post 요청을 put으로 변환하는 필터가 빈으로 등록 되어야하기 때문이다. 따라서 HiddenHttpMethodFilter를 빈으로 등록해야만 put 요청을 처리할 수 있다.(참고 : https://imbf.github.io/spring/2020/05/03/Spring-HiddenHttpMethodFilter.html)

  • 이제 수정 시 정보가 정상적으로 등록된다.

  • detail 에서 삭제버튼을 누르면 post/게시글id 값으로 delete value의 요청이 들어온다. 이 역시 원래 html form에서는 post,get 요청만 허용하므로 HiddenHttpMethodFilter 빈 등록 시에만 작동한다.

  • 이제 컨트롤러에 @DeleteMapping 을 통해 게시글 삭제 요청을 매핑하는데, service에 deletePost(id) 메소드를 구현해 로직을 처리할 것이다.

  • deletePost를 구현하기는 매우 쉽다. deleteById 가 이미 JpaRepository의 CrudRepository에 구현되어 있으므로 인자로 넘겨받은 id 값에 해당하는 객체를 레포지토리에서 삭제할 수 있다.


  • 이제 삭제 버튼을 누르면 게시글이 정상적으로 삭제된다.
profile
하마드

0개의 댓글