[블로그 만들기] 5. 글쓰기 기능 만들기 (4)

데이터베이스와의 상호작용이 올바르게 이루어지는지, 단위 테스트(Unit Test) 만들기
Sep 08, 2024
[블로그 만들기] 5. 글쓰기 기능 만들기 (4)

5-5. 테스트 파일 만들기

 
단위 테스트는 특정 기능이 독립적으로 잘 동작하는지 확인하는 테스트이다.
 
Repository 에서 메서드를 만들고 나서
실행 전, 테스트 먼저 해볼 수 있는 BoardRepositoryTest 파일을 test 폴더에 만들자.
편의를 위해 board 폴더를 먼저 만들고 Test 클래스 만들기.
notion image
notion image
 
Repository 에서 만든 메서드와 연결이 필요하니, @Import 와 @DataJpaTest 를 아래와 같이 넣어준다.
@Autowired private BoardRepository boardRepository;
 
테스트 메서드에서는 매개변수를 사용할 수 없기 때문에,
// given 에서 가짜로 매개변수를 만들어서 테스트 해보면 된다.
테스트 메서드 명은 실제 메서드명_test() 로 만든다. 이것은 컨벤션이기 때문에 지켜주삼.
notion image
package shop.mtcoding.blog.board; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; //@SpringBootTest // C R e h2 -> 모든 레이어를 메모리에 다 올리고 테스트할 때 사용하는 어노테이션 // 다 띄울 필요가 없으니 주석처리, 나는 지금 Repository 이후로 테스트 할거거든 @DataJpaTest // h2, em @Import(BoardRepository.class) // br public class BoardRepositoryTest { // 뒤에 Test 붙이는것도 컨벤션 @Autowired private BoardRepository boardRepository; // 테스트 메서드에서는 매개변수를 사용할 수 없다. // 메서드명_test : 컨벤션(약속이라는 뜻) @Test public void save_test() { //given (매개변수를 강제로 만들기) String title = "제목1"; String content = "내용1"; // when boardRepository.save(title, content); // eye (눈으로 확인) } }
 
임포트하는 단축키는 alt + enter
실행하고 뜨는 에러가 있다면 내용을 확인해야 한다. (실행을 못해보면 테스트도 못해보기 때문에, 항상 실행 먼저 해보고 문제가 없을 때 테스트 실행)
 
공부는 이렇게 하도록 한다.
  1. 튜토리얼을 보내면 실행해보는 것
  1. 반복해서 내꺼로 만들어야 하는 것
  1. 이 코드는 뭐지 분석하는 것
  1. 이론적인 공부를 하는 것
  1. 깊게 공부하는 것 내부를 뜯어보는 것
 
테스트에서 아래와 같이 뜨면 성공!
notion image
 

5-6. 글쓰기 화면 <form> 수정

 
테스트 파일을 만들었다면, 글쓰기 화면을 이어서 진행하자.
 
title 과 content 에다 dd 를 입력하고 글쓰기완료 버튼을 눌렀는데도,
화면 전환이 일어나지 않고 주소에 아래와 같이 뜬다면 method=”get” 으로 요청되어있기 때문이다.
 
notion image
 
save-form 파일로 가서 form method=”post” 로 바꾼다.
key=value&key=value 는
notion image
request.getParameter 를 사용하는 것과 같다. (ex. String value = request.getParameter(”key”);)
notion image
notion image
form 에서 보내는 name 과 받는 곳에서 파라미터로 들어오는 이름이 서로 같아야 한다.
title<>title, content<>content
notion image
 
만약 name 다르게 넣어놓고 save-form 에서 post 하면
notion image
notion image
아래와 같이 insert 했다고 콘솔에는 뜨지만,
notion image
 
DB 에서 확인해보면 안들어와있다.
notion image
 
레파지토리 테스트 save_test() 를 끝내고, 실행했을 때 null 이 뜬다면 DB의 문제가 아니라는 것을 알 수 있다. 빠르게 디버깅 가능.
 

지금까지 한 거 몇 개 바꿔서도 만들어보기

 
아래와 같이 직접 만들어보자.
notion image
 
notion image
notion image
 
mustache 템플릿을 이용하기 때문에 static 의 html 은 헷갈리니까 삭제해도 된다.
notion image
notion image
 
로그에서 우클릭 > clear All 한다음에 테스트 해야 내가 실행한 것을 볼 수 있다. 완전 다 분리시켜서 테스트해야 한다.
 
notion image
 
notion image
 
단위테스트가 되면 분리해서 에러를 잡아낼 수 있다. 화면에서의 문제인지, SQL 문의 문제인지
notion image
notion image
notion image
notion image
 
코드 바꾸고나서 재실행 해봐야한다. 이것은 기본.
repository 에서 해결되고 에러안나서 끝난 줄 알았는데..!
진짜 데이터가 들어갔는지 보러갔더니, 값이 들어가 있지 않다.
notion image
 
제약조건을 안걸었으니 당연히 null 이 들어가지, 아래와 같이 제약 조건을 넣자.
notion image
이제 조건 걸었으니, null 로 값 바꾸면 에러가 떠야 정상이다.
데이터베이스 문제이기 때문에 굳이 화면 켤 필요없음, 단위테스트에서 실행해보자.
notion image
 
제약조건 잘 걸려있군 테스트로 확인. 굿.
notion image
notion image
 
제약조건이 걸린 것을 확인했으면, repository 는 완벽하니까 컨트롤러를 간다.
DB를 보면 안돼~!
notion image
완성
notion image
 

지금까지를 빠르게 재정리

 
save-form 에서 form 수정
form action=”/board/save” 글쓰기 완료를 누르면 post 로 “/board/save”로 가게
method=”post”
enctype=“application/x-www-form-urlencoded” 전송방식 확인.
notion image
 
컨트롤러가서 파라미터로 form 에서 보낸 title 과 content 를 받고,
@Controller public class BoardController { @PostMapping("/board/save") public String save(@RequestParam("title") String title, @RequestParam("content") String content) { return "redirect:/board"; } }
notion image
 
boardRepository 와 연결한다.
notion image
 
Repository 는 em을 통해 DB와 연결한다. em을 통해 DB 에 insert 해줌.
notion image
 
notion image
완성
Repository 를 이렇게 만들어놓고, 테스트에 가서 실행해봐야 한다.
notion image
.
내가 Board 에서 아래 빨간박스를 붙이면 null 값이 테이블에 못들어가게 하는 것.
notion image
그래서 만든 테스트에서 아래의 코드 실행하면
notion image
콘솔에 아래와 같은 에러가 뜰거임
notion image
굿 그럼 제약조건 제대로 걸렸고, 다시 test 에서 title, content 임의로 넣어서 실행해보면
notion image
이제 잘 뜬다.
notion image
그렇다면 이제 Repository 에는 문제가 없군, DB 에는 문제가 없군 할 수 있다.
굿, 그렇다면 테스트가 잘되고 있다는 것
Repository 문제없네 굿 DB 문제없네 굿 ‘
notion image
Share article

eunmouse