[v2] Spring 게시판 조금 알고 따라하기 - 8

게시판(Board) 기능 리팩토링
HootJem's avatar
Aug 23, 2024
[v2] Spring 게시판 조금 알고 따라하기 - 8

게시판(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 예외를 던집니다.
notion image
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 는 이미 트랜잭션이 들어간 상태입니다. 트랜잭션내부에서 검사를 하는 동안 다른 요청은 대기가 걸리기 때문에 로그인 여부와 같이 컨트롤러에서 검사할 수 있는 것은 컨트롤러에서 처리하도록 합니다.
notion image
notion image
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

[HootJem] 개발 기록 블로그