티스토리 뷰

이걸로 Board의 등록/조회/수정/삭제가 다 끝났다. 마지막인 삭제 얘기.

CASCADE가 진짜로 동작하는지 확인
Comment, Files는 Board를 ON DELETE CASCADE로 참조하게 만들어뒀었다 (2주차 첫 글에서 다룬 내용). 게시글 하나를 지우면, 거기 달린 댓글/파일도 자동으로 같이 지워지는지 이번에 실제로 확인한 셈이다. Board만 지우는 코드를 짰는데도 DB가 알아서 정리해준다.

// BoardMapper.xml
<delete id="deleteBoard">
    DELETE FROM Board WHERE id = #{id}
</delete>

DELETE에 비밀번호를 어떻게 실어 보낼지
수정은 body로 값을 보냈는데, DELETE는 관례상 body를 잘 안 쓴다. 그래서 이번엔 쿼리 파라미터로 보내기로 했다.

 

`DELETE /api/boards/1?password=1234`

@DeleteMapping("/api/boards/{id}")
public void deleteBoard(@PathVariable Long id, @RequestParam String password) {
    boardService.deleteBoard(id, password);
}

@RequestParam은 URL 뒤에 붙는 ?key=value 값을 받아오는 어노테이션.

 

다음은 서비스

public void deleteBoard(Long id) {
    boardMapper.deleteBoard(id);
}

처음 짤때는 아무 생각없이 대충 이렇게 짰다 이상한것도 못느꼈고 말이다..(ㅋㅋㅋㅋ)

컴파일도 되고 실행도 잘 됐다. 근데 이거 비밀번호를 몰라도 아무나 남의 글을 지울 수 있는 상태였다

 

public void deleteBoard(Long id, String password) {
    BoardEntity board = boardMapper.selectBoardDetail(id);

    if (!board.getPassword().equals(password)) {
        throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
    }

    boardMapper.deleteBoard(id);
}

수정 로직에서 비밀번호 검증 로직을 떼와서 넣어줬다.

 

트러블 슈?팅

물론 사소한 복붙으로 한번 컴파일 오류가 있었지만 사소하니까 넘어가겠다.

라고하면 안되겠지?

// 수정 API용 코드를 그대로 복붙 (에러남)
if (!board.getPassword().equals(request.password())) { ... }

수정 API 비밀번호 검증을 그대로 가져다 썼더니 당연히 에러가 떴다.

이유는 간단했는데 수정 API는 비밀번호가 request라는 객체 안에 들어있어서 request.password()로 꺼내야 했는데, 삭제 API는 비밀번호가 그냥 String password로 바로 들어온다. 그래서 request라는 게 존재하지 않아 에러가 난 것이다 위에서 봤던것처럼 board.getPassword().equals(password)로 바꾸니 깔끔하게 해결되었다

 

 

결과


Postman으로 비밀번호 없이 호출하면 막히고 맞는 비밀번호로 호출하면 삭제되는것을 확인했다

이렇게 Board CRUD 전체적인 마무리가 되었다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함