logoStephen's 기술블로그

포스트 검색

제목, 태그로 포스트를 검색해보세요

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

#블로그만들기_14 #게시글 삭제
SpringWebApp
성훈 김
2024년 2월 9일
목차

1️⃣ 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) 등으로 사용된다.
 
 

2️⃣ View 확인

💡
🔹 폼 태그 사용자가 입력한 데이터를 서버에 전송하기 위해서 사용되는 태그이다. 🔹 삭제를 누르면 action이 발동하고 post요청을 하게 된다. 🔹 action은 /board/{{id}}/delete를 호출한다.
Java
{{#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}}
 
 

3️⃣ 컨트롤러 확인

💡
컨트롤러에서 책임을 부여! 🔹 그 책임이란, 유효성 검사 → 인증권한 그외 여러가지 🔹 부가로직을 구현하느라 핵심로직을 놓치지 말자!!! 🔹 모델 위임 → DB와 상호작용은 넘겨준다. 🔹 view로 반환 해준다 → PRG 패턴 중요!!
Java
@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:/";
    }
PRG 패턴이란??? → Post>>Redirect>> Get 🔹 사용자가 현재의 DB를 변경하는 Post 요청을 하는 페이지에서 새로 고침을 하게 되면 중복 요청을 방지하기 위해서 사용하는 패턴다. 🔹 Post 요청이 완료되면 Redirect 로 Get 요청 페이지로 안내되어 새로 고침을 해도 Get을 재요청하게 되므로 중복post요청을 하지못하게 한다.
 

🔹 인증로직 모듈화

💡
인증이 필요할 때 그냥 가져다 쓰면 된다. (위에 delete메소드 안에 구현된 코드이다. )
Java
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";
}
 

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

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

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

💡
DB에 변경이 일어나므로 꼭 @Transactional 어노테이션을 달아야한다.
Java
@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();
    }
}
 
 

5️⃣ 테스트 확인

🔹 Postman 내부에서 로긴하기

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

🔹 Postman으로 삭제 요청

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

💡추가노트

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