Search
📙

#블로그만들기_14 #게시글 삭제

HTTP 프로토콜의 발전 (삭제를 들어가기전에..)

삭제를 들어가기 전에 프로토콜에 대한 발전부터 가볍게 알아보자. HTTP 프로토콜이 Get요청만 지원했던 처음 단계에서 부터 삭제가 가능하게 된 건 HTTP 1.1
HTTP 프로토콜의 발전
HTTP 최초 : 원래 HTTP는 단순한 요청-응답 프로토콜로 시작. 주로 HTML 문서를 요청하는 데 사용되는 GET 메서드만을 지원.
HTTP 1.0 : 이 버전에서는 GET 외에도 POST 메서드가 도입되어, 사용자의 입력(예: 회원가입, 글쓰기)을 서버로 전송할 수 있게 됨.
HTML5에서의 확장 : HTML5는 form 태그에서 GET과 POST 메서드를, a 태그에서는 GET 메서드를 사용할 수 있게됨.
HTTP 1.1: 이 버전에서는 요청의 의미가 더 세분화됨. POST는 삽입(INSERT), DELETE는 삭제(DELETE), PUT은 업데이트(UPDATE) 등으로 사용된다.

View 확인

폼 태그 사용자가 입력한 데이터를 서버에 전송하기 위해서 사용되는 태그이다. 삭제를 누르면 action이 발동하고 post요청을 하게 된다. action은 /board/{{id}}/delete를 호출한다.
{{#pageOwner}} // pageOwner가 참 일때 해당 버튼이 표시된다. <div class="d-flex justify-content-end"> <button class="btn btn-warning me-1">수정</button> // 삭제 버튼에 form태그를 달아서 기능을 주입한다. // 삭제를 클릭하게 되면 id를 mustache변수로 할당하고 post요청을 하게 된다. <form actoin="/board/{{id}}/delete" method="post"> <button class="btn btn-danger">삭제</button> </form> </div> {{/pageOwner}}
Java
복사

컨트롤러 확인

컨트롤러에서 책임을 부여! 그 책임이란, 유효성 검사 → 인증권한 그외 여러가지 부가로직을 구현하느라 핵심로직을 놓치지 말자!!! 모델 위임 → DB와 상호작용은 넘겨준다. view로 반환 해준다 → PRG 패턴 중요!!
@RequiredArgsConstructor @Controller public class BoardController { private final HttpSession session; private final BoardRepository boardRepository; @PostMapping("/board/{id}/delete") public String delete(@PathVariable int id, HttpServletRequest request) { // 1. 인증 안되면 나가 User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { // 401 return "redirect:/loginForm"; } // 2. 권한 없으면 나가 Board board = boardRepository.findById(id); if (board.getUserId() != sessionUser.getId()) { request.setAttribute("status", 403); request.setAttribute("msg", "게시글을 삭제할 권한이 없습니다"); return "error/40x"; } // 핵심 로직 boardRepository.delete(id); return "redirect:/"; }
Java
복사
PRG 패턴이란??? → Post>>Redirect>> Get 사용자가 현재의 DB를 변경하는 Post 요청을 하는 페이지에서 새로 고침을 하게 되면 중복 요청을 방지하기 위해서 사용하는 패턴다. Post 요청이 완료되면 Redirect 로 Get 요청 페이지로 안내되어 새로 고침을 해도 Get을 재요청하게 되므로 중복post요청을 하지못하게 한다.

인증로직 모듈화

인증이 필요할 때 그냥 가져다 쓰면 된다. (위에 delete메소드 안에 구현된 코드이다. )
User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { System.out.println("로그인되지 않았습니다. 400") return "redirect:/loginForm"; }
Java
복사

권한 로직 모듈화

권한이 있는 지 확인할 때 항상 쓰는 코드이다. 반복숙달해서 생각안하고 만들때 까지!
// 권한 인증 로직 Board board = boardRepository.findById(id); //객체를 id로 조회 if (board.getUserId() != sessionUser.getId()) { // 세션사용자와 게시물 사용자 비교 request.setAttribute("status", 403); request.setAttribute("msg", "게시글을 삭제할 권한이 없습니다"); return "error/40x"; }
Java
복사

URL을 직관적으로 만들어야 한다!!!

URL의 주소를 읽었을 때 그 목적이 직관적으로 이해할 수 있어야된다.
// board의 1번 게시물을 업데이트해! POST /BOARD/1/UPDATE // board의 1번 게시물을 삭제해! POST /BOARD/1/DELETE
Java
복사

DB연결 - delete () 메소드 작성

DB에 변경이 일어나므로 꼭 @Transactional 어노테이션을 달아야한다.
@RequiredArgsConstructor @Controller public class BoardRepository { private final EntityManager em; @Transactional // DB에 변경을 하게되는 메소드는 꼭 Transactional 어노테이션을 달아야한다. public void delete (int id){ Query query = em.createNativeQuery("delete from board_tb where id = ?"); query.setParameter(1, id); query.executeUpdate(); } }
Java
복사

테스트 확인

Postman 내부에서 로긴하기

Post 요청이기 때문에 Postman을 실행한다. Postman브라우저에는 session키가 없을수도 있으므로, Postman 내부에서 로그인을 먼저한다. Post 요청 설정 URL은 localhost:8080/login 설정 Body 데이터로 보내야되기 때문에 Body 체크 LoginDTO에 담을 키=밸류 설정 username=ssar, password=1234 하단 브라우저 preview를 통해서 결과 확인

Postman으로 삭제 요청

삭제 테스트 확인 Post요청으로 설정 3번을 삭제할려면 URL에 localhost:8080/board/3/delete 설정 삭제 요청이기 때문에 바디데이터가 없으므로 바로 send클릭! 하단 브라우저에서 잘 삭제가 되었는지 체크

추가노트

백엔드 개발과 CRUD CRUD의 정의 : CRUD는 Create(생성), Read(읽기), Update(갱신), Delete(삭제)의 약자로, 데이터를 관리하는 네 가지 기본적인 작업을 나타낸다. CRUD와 HTTP 메서드:
Create: 데이터를 생성하는 작업, 일반적으로 HTTP의 POST 메서드와 연결된다.
Read: 데이터를 조회하는 작업, HTTP의 GET 메서드로 수행된다.
Update: 데이터를 수정하는 작업, HTTP의 PUT 또는 PATCH 메서드에 해당한다.
Delete: 데이터를 삭제하는 작업, HTTP의 DELETE 메서드로 이루어진다.