HTTP 프로토콜의 발전 (삭제를 들어가기전에..)
삭제를 들어가기 전에 프로토콜에 대한 발전부터 가볍게 알아보자. HTTP 프로토콜이 Get요청만 지원했던 처음 단계에서 부터 삭제가 가능하게 된 건 HTTP 1.1
HTTP 프로토콜의 발전
View 확인
{{#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을 직관적으로 만들어야 한다!!!
// 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 내부에서 로긴하기
Postman으로 삭제 요청
삭제 테스트 확인
Post요청으로 설정
3번을 삭제할려면 URL에 localhost:8080/board/3/delete 설정
삭제 요청이기 때문에 바디데이터가 없으므로 바로 send클릭!
하단 브라우저에서 잘 삭제가 되었는지 체크 
추가노트
백엔드 개발과 CRUD
CRUD의 정의 :
CRUD는 Create(생성), Read(읽기), Update(갱신), Delete(삭제)의 약자로, 데이터를 관리하는 네 가지 기본적인 작업을 나타낸다.
CRUD와 HTTP 메서드: