inblog logo
|
eunmouse
    springboot

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

    데이터베이스와의 상호작용이 올바르게 이루어지는지, 단위 테스트(Unit Test) 만들기
    Sep 08, 2024
    [블로그 만들기] 5. 글쓰기 기능 만들기 (4)
    Contents
    5-5. 테스트 파일 만들기5-6. 글쓰기 화면 <form> 수정 지금까지 한 거 몇 개 바꿔서도 만들어보기 지금까지를 빠르게 재정리

    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
    Contents
    5-5. 테스트 파일 만들기5-6. 글쓰기 화면 <form> 수정 지금까지 한 거 몇 개 바꿔서도 만들어보기 지금까지를 빠르게 재정리

    eunmouse

    RSS·Powered by Inblog