v3 - 게시글 수정하기

coding S's avatar
Mar 15, 2024
v3 - 게시글 수정하기

DTO에서 하나씩 뽑아서 쓰자!

notion image
notion image
findByUsernameAndPassword를 로그인 할 때 말고도 사용할 수 있다. 그렇기 때문에 이런 식으로, reqDTO.getUsername() 여러군데에서 사용하게 되면 dto를 직접 넘기는 것 보단, 꺼내서 사용하는게 더 좋다! -> 그러나... 서비스 레이어가 있으면 아무 상관없다! 컨트롤러에서 이렇게 넘기면 되기 때문!
 

[ 더티 체킹 할 거니까 조회부터 하자 ]

@RequiredArgsConstructor @Repository public class BoardRepository { private final EntityManager em; @Transactional public void updateById(int id, String title, String content) { Board board = findById(id); board.setTitle(title); board.setContent(content); //더티체킹 }
💡
만약, 2개를 업데이트하고 싶으면 2개에 대한 쿼리문을 짜야하고, 1개를 업데이트하고 싶으면 1개에 대한 쿼리문을 이렇게 새로 짜야하는데 update board_tb set title = ? where id = ? update board_tb set content = ? where id = ? update board_tb set title = ?, content = ? where id = ? 이런식으로 계속 쿼리를 만들어줘야 하는데, set을 사용해서 이렇게 안해도 된다. → 3가지 경우의 수를 다 고려해서 짠 것임.
💡
setter를 사용하지 말고, Board에 의미 있는 메소드를 만들어주자! 근데 지금은 setter 하고… 나중에 리팩토링 하자!
notion image
💡
의미 있는 메소드. 이런거… 알지?
 

[ 단위 테스트 해보기 ]

@Import(BoardRepository.class) @DataJpaTest public class BoardRepositoryTest { @Autowired private BoardRepository boardRepository; @Autowired private EntityManager em; @Test public void updateById_test() { //given int id = 1; String title = "title1"; String content = "content1"; //when boardRepository.updateById(id, title, content); em.flush(); //업데이트가 된 건지 확인이 안 되기 때문에 (트랜젝션 종료 후 쿼리가 날아가서) //실제 코드는 작성할 필요가 없다. 트랜젝션 종료될 거라! //em.flush를 꼭 해줘야함! //then }
notion image
 

이제 수정하자!

💡
수정은 2가지 로직이 있다. 페이지를 줘! → get 요청 업데이트 해줘! → action 요청
 

[ GET 요청부터 손 보자 - BoardController ]

@GetMapping("/board/{id}/update-form") public String updateForm(@PathVariable Integer id, HttpServletRequest request){ Board board = boardRepository.findById(id); request.setAttribute("board", board); return "board/update-form"; }

[ update-form.mustache ]

notion image
💡
가방에는 board 객체가 들어있다. 그 안에 있는 건 다 뿌릴 수 있다. → 프런트랑 일할 때에는 DTO 만들어서 정확하게 필요한 데이터만 넘기자
 

[ POST 요청하자! ]

💡
TITLE, CONTENT를 받는 DTO 필요

[ BoardRequest- DTO 생성 ]

@Data public static class UpdateDTO { private String title; private String content; }

[ BoardController ]

@PostMapping("/board/{id}/update") public String update(@PathVariable Integer id, BoardRequest.SaveDTO requestDTO){ boardRepository.updateById(id, requestDTO.getTitle(), requestDTO.getContent()); return "redirect:/board/"+id; }
 

[ 화면 확인 ]

notion image
 
Share article

codingb