게시글 쓰기
[ BoardService ]
package shop.mtcoding.blog.board; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import shop.mtcoding.blog.user.User; @RequiredArgsConstructor @Service public class BoardService { private final BoardJPARepository boardJPARepository; @Transactional public void 글쓰기(BoardRequest.SaveDTO requestDTO, User sessionUser) { boardJPARepository.save(requestDTO.toEntity(sessionUser)); } }
작성자 정보가 필요해서 sessionUser로 받은 듯?
이거 Board 객체 봐서 User 있나 확인 해봐야 할 것 같은…?
[ BoardController ]
@RequiredArgsConstructor @Controller public class BoardController { private final BoardService boardService; private final BoardRepository boardRepository; private final HttpSession session; @PostMapping("/board/save") public String save(BoardRequest.SaveDTO requestDTO) { User sessionUser = (User) session.getAttribute("sessionUser"); //권한 체크는 생략 boardService.글쓰기(requestDTO, sessionUser); return "redirect:/"; }
게시글 수정 (update) / 글 조회 (update-form)
업데이트는 update(Post)와 update-form(Get) 둘 다 필요
1. 글 수정 - update
[ BoardService ]
글 수정하려면 글 번호부터 받아야 함!
→ 기억나지요? update와 delete는 조회하고 들어가란 말…
@RequiredArgsConstructor @Service public class BoardService { private final BoardJPARepository boardJPARepository; @Transactional public void 글수정(int boardId, int sessionUserId, BoardRequest.UpdateDTO requestDTO) { //1. 더티체킹 하기 위해 조회하고 예외처리 Board board = boardJPARepository.findById(boardId) .orElseThrow(() -> new Exception404("게시글을 찾을 수 없습니다")); //2. 권한 처리 if (sessionUserId != board.getUser().getId()) { throw new Exception403("게시글을 수정할 권한이 없습니다"); } //3. 실제 글 수정 (더티체킹 함) board.setTitle(requestDTO.getTitle()); board.setContent(requestDTO.getContent()); }
게시글 수정은 세션값이랑 비교해서 맞을 때만 실행되어야 함 → sessionUserId도 같이 받아야 함
캡슐화 할 수도 있지만…
캡슐화 할 수도 있지만 연습을 해야하니 이렇게 하지 마라!
[ BoardController ]
@PostMapping("/board/{id}/update") public String update(@PathVariable Integer id, BoardRequest.UpdateDTO requestDTO) { User sessionUser = (User) session.getAttribute("sessionUser"); boardService.글수정(id, sessionUser.getId(), requestDTO); return "redirect:/board/" + id; }
세션 어노테이션을 만들어서
막 이렇게... 이런 어노테이션을 붙여서 sessionUser 코드도 삭제 할 수 있음! (저번에 어노테이션도 한 번 만들어봤지? 그렇게 만드는 듯?) 점점점점 더 코드가 줄어든다.
2. 글 조회 (게시글 수정폼?) update-form - 단순한 조회랑은 좀 다름
@RequiredArgsConstructor @Service public class BoardService { private final BoardJPARepository boardJPARepository; public Board 글조회(int boardId){ Board board = boardJPARepository.findById(boardId) .orElseThrow(() -> new Exception404("게시글을 찾을 수 없습니다")); return board; }
글 수정 폼으로 가는 것도 권한 체크가 필요 → 게시글 수정 페이지로 갈 권한도 없어야 함!
[ BoardController ]
@GetMapping("/board/{id}/update-form") public String updateForm(@PathVariable Integer id, HttpServletRequest request) { Board board = boardService.글조회(id); request.setAttribute("board", board); return "board/update-form"; }
게시글 수정은 직접 해보고 해당 기능이 맞는지, 제대로 구현되는지 확인 필요!
→ 왔다갔다 하면서 필기가 좀 섞였음
글 삭제
해당 부분 필요 없음! 지워주자!!
[ BoardController ]
@PostMapping("/board/{id}/delete") public String delete(@PathVariable Integer id) { User sessionUser = (User) session.getAttribute("sessionUser"); boardService.글삭제(id, sessionUser.getId()); return "redirect:/"; }
코드가 간단해짐~
[ BoardService ]
@Transactional public void 글삭제(Integer boardId, Integer sessionUserId) { //삭제와 업데이트는 조회하고 들어가기! Board board = boardJPARepository.findById(boardId) .orElseThrow(() -> new Exception404("게시글을 찾을 수 없습니다.")); if (sessionUserId != board.getUser().getId()) { throw new Exception403("게시글 삭제 권한 없음!"); } boardJPARepository.deleteById(boardId); }
이렇게 삭제가 되어도 한 트랜젝션 내에 걸려있기 때문에 어느 하나라도 실패하면 롤백!
게시글 목록 조회
[ BoardController ]
@GetMapping("/") public String index(HttpServletRequest request) { List<Board> boardList = boardService.글목록조회(); request.setAttribute("boardList", boardList); return "index"; }
[ BoardService ]
public List<Board> 글목록조회() { Sort sort = Sort.by(Sort.Direction.DESC, "id"); //여기... return에 sort 객체 안 넣어주면 DESC 안 됨 return boardJPARepository.findAll(sort); }
나중엔 이 사이사이에 들어가야 할 로직이 엄청 많기 때문에 이 파트가 제일 복잡할 것!
글 목록 조회할 때엔, 날짜도 예쁘게 파싱해서 주는 등 이 List가 들고 있는 모든 데이터를 포맷해서 프런트한테 주는.. 그런 가공을 여기서 다 함. 프런트가 순수하게 뿌려야 할 데이터만 가공해서 줘야함. 백엔드에게 중요한 덕목…
→ 화면을 위한 DTO… RestAPI… 무조건 DTO를 만들어서 줘야함.
Share article