[익명 게시글을 쓰는 블로그 만들기 12]
save-form.mustache 파일
- 모든 input 태그를 form 태그로 감싸서 데이터를 한 번에 전송할 수 있도록 함
- action 속성에 데이터를 전송할 URL 주소 설정
- Spring 연습을 위해 JavaScript 없이 HTML 1.0 버전으로 상정하여 연습
- GET과 POST만 사용할 수 있기때문에 save를 추가
- mothod를 post로 설정하여 데이터를 서버에 전송할 방식 지정
- enctype을 application/x-www-form-urlencoded로 설정하여 데이터가 URL-edcoded 형식으로 전송되도록 함
- input 태그의 name 속성은 전송되는 데이터의 키값, 사용자가 입력한 값이 해당 키값의 밸류
- 제출을 위한 submit 버튼 생성하여 데이터 전송 가능하게 함
{{> layout/header}}
<section>
<form action="/board/save" method="post" enctype="application/x-www-form-urlencoded">
<input type="text" name="title" placeholder="제목"><br>
<input type="text" name="content" placeholder="내용"><br>
<button type="submit">글쓰기</button>
</form>
</section>
</body>
</html>BoardRepository 클래스
BoardRepository에save메서드를 구현하여 게시글의title과content를 DB에 저장
save메서드는title과content를 매개변수로 받아insert쿼리를 생성하고,executeUpdate메서드를 호출해 DB에 쿼리를 실행
@RequiredArgsConstructor
@Repository
public class BoardRepository {
private final EntityManager entityManager;
public void save(String title, String content) {
Query q = entityManager.createNativeQuery("insert into board_tb(title,content,created_at) values(?,?,now())");
q.setParameter(1, title);
q.setParameter(2, content);
q.executeUpdate();
}
}BoardRepostioryTest 클래스 - 테스트 클래스
BoardRepository에서 구현한save메서드를 테스트
@DataJpaTest어노테이션은 테스트 후 트랜잭션을 롤백해 DB 상태를 원래대로 복원하여 독립적인 테스트 환경을 제공
- given
- 테스트를 위한 입력값 설정 단계
- DB에 저장할 title과 content값 설정
- when
- 테스트할 메서드 실행
boardRepository.save()메서드를 호출하여 DB에 데이터를 저장
- then
- 결과 검증 ⇒ 출력으로 결과 검증하는 방식 채택
@Import(BoardRepository.class)
@DataJpaTest
public class BoardRepositoryTest {
@Autowired
BoardRepository boardRepository;
@Test
public void save_test() {
// given
String title = "제목6";
String content = "내용6";
// when
boardRepository.save(title, content);
// then(eye)
Board board = boardRepository.findById(6);
System.out.println(board.getId());
System.out.println(board.getTitle());
System.out.println(board.getContent());
System.out.println(board.getCreatedAt());
}
}BoardRequest 클래스 - SaveDTO 클래스
- 폼에서 입력받은 데이터를 저장하기 위한 SaveDTO 생성
public class BoardRequest {
@Data
public static class SaveDTO {
private String title;
private String content;
}
}BoardController 클래스
- save () 메서드
@PostMapping을 통해/board/save경로로 들어오는 POST 요청을save메서드에서 처리BoardRequest.SaveDTO객체로 폼 데이터를 입력받음boardService에서게시글쓰기메서드를 호출하여saveDTO의 정보를 DB에 저장"redirect:/"값을 반환하여/경로로 리다이렉트- 리다이렉트 방식 참고
- Spring MVC:
return "redirect:/";를 사용하여 리다이렉트를 처리 - 서블릿:
response.sendRedirect("/");메서드를 사용하여 리다이렉트를 처리 - 직접 설정:
response.setStatus(302);⇒response.setHeader("Location", "/");를 사용하여 리다이렉트를 처리 - saveForm() 메서드
@GetMapping을 통해/save-form경로로 들어오는 GET 요청을saveForm메서드에서 처리saveForm메서드는"save-form"뷰를 반환하여 폼을 표시
@RequiredArgsConstructor
@Controller
public class BoardController {
private final BoardService boardService;
@PostMapping("/board/save")
public String save(BoardRequest.SaveDTO saveDTO) {
boardService.게시글쓰기(saveDTO);
return "redirect:/";
// response.sendRedirect("/");
// response.setStatus(302);
// response.setHeader("Location", "/");
}
@GetMapping("/save-form")
public String saveForm() {
return "save-form";
}
}BoardService 클래스
게시글쓰기메서드를 구현하여,saveDTO데이터를boardRepository의save메서드를 사용하여 DB에 저장
- @Transactional
- 메서드 실행이 완료되면 커밋하고, 예외 발생 시 롤백하여 트랜잭션을 관리하는 어노테이션
@RequiredArgsConstructor
@Service
public class BoardService {
private final BoardRepository boardRepository;
@Transactional
public void 게시글쓰기(BoardRequest.SaveDTO saveDTO) {
boardRepository.save(saveDTO.getTitle(), saveDTO.getContent());
}
}글쓰기 테스트
- 폼에 제목과 내용을 입력하고 글쓰기 버튼을 클릭하여 폼 데이터 전송

- 게시판 목록으로 리다이렉트 되는지 확인 가능
- 게시글이 정상적으로 작성되었는지 확인 가능

Share article