[REST API] 14. Blog v3 : Board

문정준's avatar
May 09, 2025
[REST API] 14. Blog v3 : Board

REST API 서버는 데이터만 돌려주는 서버

  • 변경된 값을 항상 다시 돌려줘야 함
  • GET, POST, PUT, DELETE
 

1. 글 리스트 보기

  • BoardController
@GetMapping({"/", "/api/board"}) public @ResponseBody Resp<?> list(@RequestParam(required = false, value = "page", defaultValue = "0") Integer page, @RequestParam(required = false, value = "keyword", defaultValue = "") String keyword) { User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.ListDTO respDTO; if (sessionUser == null) { respDTO = boardService.글목록보기(null, page, keyword); } else { respDTO = boardService.글목록보기(sessionUser.getId(), page, keyword); } return Resp.ok(respDTO); }
  • BoardService
public BoardResponse.ListDTO 글목록보기(Integer userId, Integer page, String keyword) { if (userId == null) { Long totalCount = boardRepository.totalCount(keyword); List<Board> boards = boardRepository.findAll(page, keyword); return new BoardResponse.ListDTO(boards, page, totalCount.intValue(), keyword); } else { Long totalCount = boardRepository.totalCount(userId, keyword); List<Board> boards = boardRepository.findAll(userId, page, keyword); return new BoardResponse.ListDTO(boards, page, totalCount.intValue(), keyword); } }

2. 글 상세보기

  • BoardController
@GetMapping("/api/board/{id}/detail") public @ResponseBody Resp<?> getBoardDetail(@PathVariable("id") Integer id) { User sessionUser = (User) session.getAttribute("sessionUser"); Integer sessionUserId = (sessionUser == null ? null : sessionUser.getId()); BoardResponse.DetailDTO detailDTO = boardService.글상세보기(id, sessionUserId); return Resp.ok(detailDTO); }
  • BoardService
@Transactional public BoardResponse.DetailDTO 글상세보기(Integer id, Integer userId) { Board boardPS = boardRepository.findByIdJoinUserAndReplies(id) .orElseThrow(() -> new ExceptionApi404("자원을 찾을 수 없습니다")); Love love = loveRepository.findByUserIdAndBoardId(userId, id) .orElseThrow(() -> new ExceptionApi404("자원을 찾을 수 없습니다")); Long loveCount = loveRepository.findByBoardId(id); Integer loveId = love == null ? null : love.getId(); Boolean isLove = love == null ? false : true; BoardResponse.DetailDTO detailDTO = new BoardResponse.DetailDTO(boardPS, userId, isLove, loveCount.intValue(), loveId); return detailDTO; }

3. 글 작성하기

  • BoardController
@PostMapping("/s/api/board") public @ResponseBody Resp<?> save(@Valid @RequestBody BoardRequest.SaveDTO reqDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.DTO respDTO = boardService.글쓰기(reqDTO, sessionUser); return Resp.ok(respDTO); }
  • BoardService
@Transactional public BoardResponse.DTO 글쓰기(BoardRequest.SaveDTO reqDTO, User sessionUser) { Board board = reqDTO.toEntity(sessionUser); Board boardPS = boardRepository.save(board); return new BoardResponse.DTO(boardPS); }

4. 글 수정하기

  • BoardController
@PutMapping("/s/api/board/{id}") public @ResponseBody Resp<?> update(@PathVariable("id") Integer id, @Valid @RequestBody BoardRequest.UpdateDTO reqDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.DTO respDTO = boardService.글수정하기(reqDTO, id, sessionUser.getId()); return Resp.ok(respDTO); }
  • BoardService
@Transactional public BoardResponse.DTO 글수정하기(BoardRequest.UpdateDTO reqDTO, Integer id, Integer sessionUserId) { Board boardPS = boardRepository.findById(id) .orElseThrow(() -> new ExceptionApi404("자원을 찾을 수 없습니다")); if (!boardPS.getUser().getId().equals(sessionUserId)) { throw new ExceptionApi403("권한이 없습니다"); } boardPS.update(reqDTO.getTitle(), reqDTO.getContent(), reqDTO.getIsPublic()); return new BoardResponse.DTO(boardPS); } // 더티 체킹 (상태 변경해서 update)

5. 글 삭제하기

  • BoardController
  • BoardService
@Transactional public void 글삭제(Integer id, Integer sessionUserId) { Board boardPS = boardRepository.findById(id) .orElseThrow(() -> new ExceptionApi404("자원을 찾을 수 없습니다")); if (!boardPS.getUser().getId().equals(sessionUserId)) { throw new ExceptionApi403("권한이 없습니다"); } boardRepository.deleteById(id); }
Share article

sxias