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


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 하고… 나중에 리팩토링 하자!

의미 있는 메소드. 이런거… 알지?
[ 단위 테스트 해보기 ]
@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
}

이제 수정하자!
수정은 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 ]

가방에는 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;
}
[ 화면 확인 ]

Share article