ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] 예외처리, 테스트코드에 관한 고민
    Backend/개발 2021. 8. 13. 00:12
    반응형

    TIL 39일차


    38일차: 우승멤버 등록 controller 테스트 코드 작성하기 1 를 진행하는 중에, 스프링부트에서 JUnit을 이용한 테스트코드를 작성할 때, 어떤 로직으로 구현하는건지에 대한 정리가 스스로 필요할 것 같아서 적어본다.

     

    테스트코드를 작성하며 개발을 처음 해보고있고, 그래서 하는것이 중요한것 ! 같기는 하지만 아직 "와 이렇게 이렇게 테스트코드를 작성해서 이걸 예방하고 이런걸 미리 테스트해보고, 통합테스트는 이런데 단위테스트는 이래서 나눠서하는거고 막 그러는구나~~ 이걸 근데 이런식으로 하는구나~~" 뭐 이런 엄청난 깨달음을 얻은 상태는 아니다.

    그래서 아직 엄청 정리가 되어있진 않고, 여러 구글링한 글들과 지금까지의 경험, 그리고 오늘 동기한테 물어보면서 확인받은 내용을 바탕으로만 작성해본다~!

     

    전체적인 구현 로직

    1. throw new ExceptionService단에서 발생시키기
    2. Controller에서는 여러 service 로직을 거친 후 성공했을 때 return ResponseEntity<>(successMessage,HttpStatus.ok) 하기
    3. ControllerAdvice를 사용한 GlobalExceptionHandler를 만들어 controller에서 service를 수행할 때 발생한 throw된 exception를 가지고 ResponseEntity<>(HttpStatus.4xx)을 반환하기

     

    이렇게 하는 이유?를 .. 그냥 생각해본다면 (정답아님)

    • 컨트롤러 별로 매번 service가 리턴하는 값에 대한 에러처리를 하게 된다면 , 유지보수가 힘들어 질 것이다. try catch로 하나씩 잡는다는게 말이 안된다.
    • controller에서 throw new exception을 던지면 api에 대한 응답으로 500 server error를 만나게되는데, 보통의 기준상 사용자에게 500 에러가 발생한것을 보여주는게 좋지 않다고 .. 알고있다 ㅎㅎ

    더 생각해보고 찾아보아야함 .. ㅠㅠ

    단위 테스트, 슬라이스 테스트

    Service

    • repository를 mock으로 생성하고 service에 대한 테스트만 하는 경우
    • repository를 mock으로 하지 않는 대신, 실제 사용 DB를 건들 순 없으니 inmemory h2 DB를 통해서 테스트
    • 예외 상황이 왔을 때 repository.method().orElseThrow(~Exception::new) 이런 형식의 에러를 날릴 수 있을 것이다.

    Controller - > @WebMvcTest이용

    • Service는 mock으로 생성 ->mokito를 이용해 given.return으로 원하는 파라미터에 대한 결과값을 미리 주입
    • mockMvc.perforn().andExpect(httpstatus.isXX)로 원하는 http status가 응답되는지를 확인

     



    이때 생각해야할 점이,
    mock으로 생성하는 아랫 단에 대해서는 이미 테스트를 거치고 어떤 경우에 어떤 결과가 나오는지 알고있다는 보장이 있어야한다!

    그걸 테스트 했어야 하고, 테스트한 결과대로 controller에서는 mokito로 값을 지정해줬다.

    그래서 실제로 run을 한 경우에 service에서 정말 내가 원하는 결과가 나올까?라는 걱정을 아예 하지 않아야함!왜냐면 테스트코드를 짰기때문에.. (???) 이 말을 일주일 후에 본 내가 이해할 수 있을까싶은 .. 조잡한말이군 ㅎㅎ

     

    여튼! 이런 방식으로 테스트 코드를 작성해봐야겠다.

     

    controller에서 service를 mock으로 사용하는것은 예제가 많아서 알았는데, 오늘 얘기하다보니 Service에서도 repository부분을 mock으로 두고 테스트하는 점과, 아니면 인메모리 db를 사용해야된다는걸 알았다! 이부분도 공부도 해보고 실습도 해봐야겠다.. 생각해보니 service할때는 그냥 @SpringBootTest 박고 통합테스트?개념으로 해버린 듯..? ㅠ 까마득하군

     

    그리고 지금 해봐야될 것이, 그럼 @SpringBootTest로 컨트롤러를 테스트할 때는 어떻게되는지도 비교해봐야할 것 같다.

     

    다 지금은 안하고 해봐야할 것 같다. 고 미루는 말들이네 ..ㅎ_ ㅎ ;; 여튼 그래서 빨리 글로벌 핸들러를 작성해야겠다 !_! 총총



    댓글

Designed by Tistory.