[스프링부트] 글쓰기

익명 블로그 V1 - 12
이나겸's avatar
Nov 25, 2024
[스프링부트] 글쓰기

[익명 게시글을 쓰는 블로그 만들기 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 클래스

  • BoardRepositorysave 메서드를 구현하여 게시글의 titlecontent를 DB에 저장
  • save 메서드는 titlecontent를 매개변수로 받아 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 데이터를 boardRepositorysave 메서드를 사용하여 DB에 저장
  • @Transactional
    • 메서드 실행이 완료되면 커밋하고, 예외 발생 시 롤백하여 트랜잭션을 관리하는 어노테이션
@RequiredArgsConstructor @Service public class BoardService { private final BoardRepository boardRepository; @Transactional public void 게시글쓰기(BoardRequest.SaveDTO saveDTO) { boardRepository.save(saveDTO.getTitle(), saveDTO.getContent()); } }
 

글쓰기 테스트

  • 폼에 제목과 내용을 입력하고 글쓰기 버튼을 클릭하여 폼 데이터 전송
    • notion image
  • 게시판 목록으로 리다이렉트 되는지 확인 가능
  • 게시글이 정상적으로 작성되었는지 확인 가능
    • notion image
 
Share article

Nakyeom's Study