우리는 DELETE도 POST요청으로 삭제할 것이다. WHY? 자바 스크립트를 안 배웠으니까^^!
1. 삭제 버튼 클릭
주소에 동사를 적지 않는다. HTTP 메서드를 적기 때문. 그런데 우리는.... 지금 자바 스크립트 없이 만들기 때문에... POST로만 구분해야해서 동사를 적었습니다. * POST /BOARD/SAVE (추가해) * POST /BOARD/1/UPDATE * POST /BOARD/UPDATE -> 이렇게 적으면 뭘 업데이트 해야 할 지 모른다. 뭘 업데이트 할 지 모르면 WHERE을 못 적기 때문에 1번을 주소에 넣는다 * POST /BOARD/1/DELETE * DELETE를 쓸 수 있으면 DELETE /BOARD/1 라고 쓴다.
WHERE절은 주소에 넣는다
이 id를 삭제할 것
* PK라 쿼리스트링 안 씀 * 전송할 데이터가 없어서 input 태그 필요 없음 (삭제만 할거라…)
+)
이거보단
이게 훨씬 좋음
2. 인증 체크
[ BoardController ]
// 1. 인증 안되면 나가 User sessionUser = (User) session.getAttribute("sessionUser"); if(sessionUser == null){ // 401 return "redirect:/loginForm"; }
3. 권한 체크
조회 코드 findById. 그런데... findById는 join이다… 근데 지금건 join할 필요 없는데… join하면 느려지는데… 그래서 메소드를 하나 더 만든다
오버로딩 실패…
그래서 join하는 findById를 findByIdWithUser로 바꿔주고, 우린 순수하게 Board만 조회하는 findById를 만들어줌!
join은 for문이 돌기 때문에 성능에 영향을 준다.
[ BoardRepository ]
[ BoardController ]
바디 데이터 없으니 유효성 검사 x !! 그러나 인증 검사는 해야 함
권한 체크를 위해선 db 조회가 필요
4. 삭제하기
삭제하기 전에 조회를 먼저 하면 좋은 점 : 트랜젝션 시간이 줄어든다
없는걸 삭제해서 들어가느니, 한 번 조회해서 데이터 있나, 없나 확인 해 보는게 낫다.
write는 최소화 시키는게 좋다.
ex. 맛집 방문 전, 문 열었는지 전화해보고 가는 것과 같다.
[ BoardRepository ]
@Transactional public void deleteById(int id) { Query query = em.createNativeQuery("delete from board_tb where id = ?"); query.setParameter(1, id); query.executeUpdate(); }
write는 다 @Transactional
[ BoardController ]
5. 삭제 결과
게시글 3번이 삭제 되었다.
Share article