게시판(Board) 기능 리팩토링
1. 게시글 쓰기 Board Service 작성
public void 게시글쓰기(BoardRequest.SaveDTO saveDTO, User sessionUser) {
boardRepository.save(saveDTO.toEntity());
}
이때 saveDTO.toEntity 는 DTO 를 엔티티객체로 변환시키는 역할입니다.
2. 게시글 목록 보기
- 서비스
public List<Board> 게시글목록보기() {
List<Board> boardList = boardRepository.findAll();
return boardList;
}
- 컨트롤러
@GetMapping("/board")
public String list(HttpServletRequest request) {
List<Board> boardList = boardService.게시글목록보기();
request.setAttribute("models", boardList);
return "board/list";
}
3. 게시글 삭제
게시글 삭제를 위해서 거쳐야 하는 과정은 다음과 같습니다.
1. 이 게시글이 존재하는가
2. 해당 게시글 작성자와 삭제 요청하는 이가 같은가
3. 삭제
적절한 예외 처리가 필요해 보입니다.
@Transactional
public void 게시글삭제(int id, User userSession) {
// 1. 컨트롤러로 부터 게시글 id 받기
// 2. 게시글 존재 여부 확인 (404)
Board board = boardRepository.findById(id);
// 3. 내가 쓴 글인지 확인 (권한없음 403)
// if (board.getUser().getId() != userSession.getId()) 동일함
if (!board.getUser().getId().equals(userSession.getId())) {
throw new Exception403("본인이 작성한 게시글이 아닙니다");
}
// 4. 게시글 삭제
boardRepository.deleteById(id);
}
위 코드를 통해 게시글이 존재하지 않으면
404
작성자와 로그인 유저가 다르면 403
예외를 던집니다.
BoardController
에서 세션에 접근하고 있기 때문에 @PostMapping("/board/{id}/delete")
public String deltete(@PathVariable("id") int id) {
User sessionUser = (User) session.getAttribute("sessionUser");
if (sessionUser == null) {
throw new Exception401("로그인 되지 않은 사용자입니다.");
}
boardService.게시글삭제(id, sessionUser);
return "redirect:/board";
}
컨트롤러에서 게시글 삭제 요청을 보낼 때 session을 매개변수로 전달하면 됩니다.
이때 권한 검증을 Service 에서 했는데 어떻게 생각하시나요?
Service 는 이미 트랜잭션이 들어간 상태입니다. 트랜잭션내부에서 검사를 하는 동안 다른 요청은 대기가 걸리기 때문에
로그인 여부와 같이 컨트롤러에서 검사할 수 있는 것은 컨트롤러에서 처리하도록 합니다.


GlobalExceptionHandler
을 통해 던져진 에러를 함께 관리한다.if (sessionUser == null) {
throw new Exception401("로그인 되지 않은 사용자입니다.");
}
이 코드가 로그인이 필요한 코드마다 작성되고 있습니다. 중복이 엄청나다는 의미죠
이를 개선하기 위해
프록시 패턴
을 활용하여 특정 URL 요청일 경우 자동으로 인가를 검사하도록 수정할 계획입니다!
V2 마무리 까지 파이팅😁스프링부트 게시판 시리즈 v2 -1. https://inblog.ai/hj/27190 (User 테이블 생성 및 쿼리 수정) -2. https://inblog.ai/hj/27193 (User, Board 테이블 조인 과 JPQL) -3. https://inblog.ai/hj/27224 (회원 가입) -4. https://inblog.ai/hj/27225 DTO 를 통한 리팩토링 -5. https://inblog.ai/hj/27310 로그인, 로그아웃 -6. https://inblog.ai/hj/27316 서비스 레이어 추가 및 DTO 활용 -7. https://inblog.ai/hj/27430 예외처리 핸들러 설정과 User 서비스 리팩토링 -8. https://inblog.ai/hj/27431 Board 기능 리팩토링 -9. https://inblog.ai/hj/27560 게시글 수정, 더티체킹(flush) -10. https://inblog.ai/hj/27561 인터셉터, AOP 사용 / 마무리
Share article