1. Repository
public void save(String title, String content) {
Query q = em.createNativeQuery("insert into board_tb(title, content, created_at) values(?, ?, now())");
q.setParameter(1, title);
q.setParameter(2, content);
q.executeUpdate(); // insert하고 commit해라
}
주의 : createdAt이 아니라 created_at이다!!
RepositoryTest
@Test
public void save_test(){
//given
String title = "제목6";
String content = "내용6";
//when
boardRepository.save(title, content);
//eye
Board board = boardRepository.findById(6);
System.out.println(board.getId());
System.out.println(board.getTitle());
System.out.println(board.getContent());
} // rollback(@Transactional) -> @DataJpaTest의 meta@에 @Transactional이 존재

2. BoardController
@PostMapping("/board/save")
public String save(BoardRequest.SaveDTO saveDTO) {
// x-www 는 클래스로 받을 수 있다 -> BoardRequest.SaveDTO에 바로 바인딩
//원래는 request.getparameter로 받아야한다.
//@Data는 내부에 toString을 재정의해서 구현해준다. -> saveDTO만 적어도 saveDTO.toString한 결과가 나온다.
System.out.println(saveDTO);
boardService.게시글쓰기(saveDTO);
return "redirect:/";
}
redirect 알아보기
response.setStatus


302는 header에서 Location key값을 찾아서 이동한다(프로토콜)
BoardRequest
public class BoardRequest {
// form에서 보낸 값을 바로 받아와야하기 때문에 name의 키값과 동일하게 필드 작성해야한다
@Data
public static class SaveDTO{
private String title;
private String content;
}
}
3. Service
@Transactional
public void 게시글쓰기(BoardRequest.SaveDTO saveDTO) {
boardRepository.save(saveDTO.getTitle(), saveDTO.getContent());
} // @Transactional이 commit 해준다 -> 메서드 내에 여러개가 있을 때 하나라도 실패하면 롤백 다 성공하면 커밋해줌
Share article