TL;DR

  • Spring에서 RestAssured를 이용해 인수 테스트를 작성하는 방법 학습
  • Spring에 대한 이해의 한계를 맛봄
  • JPA를 사용해봄

NextStep ATDD with Spring

왜 와이

80만원 주고 강의를 샀습니다.

최근 JAVA를 학습하겠다고 다짐하여 Spring에 대한 학습을 다시 시작했습니다. 혼자 학습하고자 고군분투했지만 남는게 많이 없다고 느끼는 요즘이었습니다. 그런 그때, 과거에 결제만 했었던 NextStep에서 메일을 한통 받았습니다. ATDD with Spring 강의를 시작한다는 내용이었습니다.

강의 비용은 80만원이었지만 저는 지를 수 밖에 없었습니다. 강의 전반에 걸쳐 코드리뷰를 받을 수 있다는 점이 검토가 필요했던 제게 너무나도 매력적인 부분이었기 때문입니다.

생각을 하고 질렀나.

제가 수업을 들음으로써 얻을 수 있는 지식은 2가지로 보았습니다. 이 2가지만이라도 얻을 수 있다면 돈값 하겠다는 생각을 하였습니다.

  1. Spring을 이용해 api 서비스를 구축
  2. ATDD라는 생소한 방식을 실습

ATDD(Acceptance Test Driven Development)

인수테스트란

인수테스트는 “인수 시나리오"를 기반으로한 테스트 방식입니다. 인수 시나리오의 “인수"는 “끌인"자에 “받을 수"자를 사용하는 용어로, 소유권을 넘겨받을때 사용하는 말입니다. “시나리오"의 라는 용어는 “각본"이라는 우리말로 해석할 수 있으며, 이야기나 대사등을 의미하는 말로 사용됩니다.

이에 따라 “인수 시나리오 테스트"는 “넘겨 받을때 검증하는 스토리"를 의미한다고 해석해 볼 수 있겠습니다.

ATDD란

ATDD는 인수테스트를 기반으로 한 TDD 방식을 의미합니다. 이 정의에 따르면, 인수 시나리오를 테스트하는 모든 종류의 TDD를 ATDD라고 할 수 있습니다. 강의에서는 이러한 인수테스트 중 E2E테스트를 인수테스트로 정의하고 사용했습니다.

배운 것

RestAssured 사용법

  • RestAssured란?
    • JAVA에서 rest api를 쉽게 테스트하기위해 개발된 도구입니다.
    • (강사님의 의견에 따르면) MockMVC 보다 직관적이고, 실제 Tomcat환경에서 테스트를 할 수 있다는 장점을 가지고 있습니다.
    • 사용해본 입장에서는 Javascript의 axios나 fetch를 활용하는 것과 비슷한 느낌을 받았습니다.

인수 테스트 격리 방법

방법으로는 아래 3가지를 배웠습니다.

  1. @DirtiesContext
    • 테스트마다 스프링 빈상태가 변경되었다는 설정을 하는 annotation입니다.
    • 테스트 DB는 메모리 DB로 매번 DB가 초기화 됩니다.
  2. @SQL
    • 매번 테스트를 실행할때 마다 미리 작성된 sql문서를 실행하는 annotation입니다.
    • DB가 변경될때마다 수정해야하는 번거로움이 있습니다.
  3. EntityManager를 이용한 db cleaner 만들기
    • JAVA의 영속성 컨텍스트를 이용해 사용되는 엔티티들을 가져와 초기화 해주는 방식입니다.
    • DB의 TRUNCATE 명령어를 사용해 초기화 합니다.
    • TRUNCATE 명령어를 사용할때 의존성과 관련된 이슈가 있을 수 있으므로, REFERENTIAL_INTEGRITY 옵션을 꺼주어야 합니다.

예외 처리 방법

  • Spring에서는 @ControllerAdvice를 이용해 최상위에서 에러를 핸들링 할 수 있습니다.
  • 사용법만 알게 되었습니다.

느낀점

Spring을 너무 모른다.

약간 압도되는 느낌을 오랜만에 받았습니다. 실제로 어떻게 동작하는지 감을 잡지 못하고 있습니다. 무력감과 함께 이래서는 안되겠다는 느낌을 강하게 받았습니다. 그래서 오늘 김영한님의 스프링 코어 강의를 샀습니다. ㅎㅎ

꽤 어렵다.

저도 나름 친다고 생각했는데 역시 오산이었습니다. 피드백을 받으면서 그동안 되는대로 개발해왔다는 생각을 많이 하게 됩니다. 시간을 좀 더 많이 투자해서 실력을 더 쌓아보면 좋겠다는 생각이 들었습니다.