[Spring Boot] 35. 스프링부트 블로그 v2 (JPA) (5) 게시글 쓰기

김주희's avatar
Apr 06, 2025
[Spring Boot] 35. 스프링부트 블로그 v2 (JPA) (5) 게시글 쓰기

1. board/save-form.mustache

  1. isPublic 체크박스 input 태그 value="true” 삭제하기
    1. 삭제하지 않을 경우 서버로 항상 "isPublic=true”가 전달된다.
 

2. BoardRequest

  1. toEntity(User user) : saveDTO를 통해 title, content, isPublic 값은 들어오지만 user 객체는 존재하지 않기 때문에 User를 따로 주입해주어야 한다.
package shop.mtcoding.blog.board; import lombok.Data; import shop.mtcoding.blog.user.User; public class BoardRequest { @Data public static class SaveDTO { private String title; private String content; private String isPublic; // insert는 toEntity가 필요하다. // query가 아니라 객체로 만들어서 집어넣을 것이므로 toEntity를 만들어야한다. public Board toEntity(User user) { return Board.builder() .title(title) .content(content) // null 아니면 무조건 true가 됨 .isPublic(isPublic == null ? false : true) .user(user) // user 객체 필요 -> 이전에는 session으로 id를 받아왔지만 session 객체 그대로 넣으면 됨 .build(); } } }
 

3. controller

  1. 글쓰기 화면으로 들어오는 것과 글쓰기는 로그인한 유저만 가능하므로 인증 체크가 필요하다.
  1. board entity를 보면 user 객체가 필드로 포함되므로 service로 sessioUser 또한 전달해야한다.
@PostMapping("/board/save") public String save(BoardRequest.SaveDTO saveDTO) { User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) throw new RuntimeException("인증이 필요합니다."); boardService.글쓰기(saveDTO, sessionUser); return "redirect:/"; } @GetMapping("/board/save-form") public String saveForm() { User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) throw new RuntimeException("인증이 필요합니다."); return "board/save-form"; }
 

4. BoardRepository

  1. PC에 board 객체가 담기게 되고 이때 user 객체가 없으면 fk로 들어가는 값이 없게 된다.
    1. 비영속 객체 상태일 때 getter로 값을 가져와서 insert하게 되는데 user 객체가 없으면 user는 null이고 getId를 통해 id를 가져올 수 없다.
public class BoardRepository { private final EntityManager em; public void save(Board board) { em.persist(board); } }
 

5. BoardService

  1. saveDTO를 entity로 만들때 user에 대한 정보가 필요하므로 controller로부터 받은 sessionUser 객체를 toEntity메서드에 전달한다.
public class BoardService { private final BoardRepository boardRepository; @Transactional public void 글쓰기(BoardRequest.SaveDTO saveDTO, User sessionUser) { Board board = saveDTO.toEntity(sessionUser); boardRepository.save(board); }
 

6. 게시글 쓰기 시 발생하는 query

notion image
Share article

jay0628