

게시글 쓰기
[ 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