Chapter 02. 스프링 부트에서 테스트 코드를 작성하자 - DoDaek/freelec-springboot2-webservice GitHub Wiki


  1. 테스트 코드를 작성하는 이유
    • 단위 테스트는 개발단계 초기에 문제를 발견하게 도와줍니다.
    • 단위 테스트는 개발자가 나중에 코드를 리팩토링하거나 라이브러리를 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있습니다.
      • ex. 회귀 테스트
    • 단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있습니다.
    • 단위 테스트는 시스템에 대한 실제 문서를 제공합니다. 즉, 단위 테스트 자체가 문서로 사용할 수 있습니다.

  1. Application 클래스
    • 현재 프로젝트에서는 Application이라는 이름으로 작성했습니다.
    • 프로젝트의 메인 클래스가 됩니다.
    • @SppringBootApplication으로 인해 스프링 부트의 자동설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정됩니다.
    • main 메소드에서 실행하는 SpringApplication.run으로 인해 내장 WAS를 실행합니다.
      • WAS: Web Application Server
      • 내장 WAS란 별도로 외부에 WAS를 두지 않고 애프리케이션을 실행할 때 내부에서 WAS를 실행하는 것을 이야기합니다.
      • 항상 서버에 톰캣을 설치할 필요가 없게 되고, 스프링 부트로 만들어진 Jar 파일로 실행하면 됩니다.

  1. 내장 WAS를 사용하는 이유
    • 스프링 부트에서만 내장 WAS를 사용할 수 있는 것은 아니지만, 스프링 부트에서는 내장 WAS를 사용하는 것을 권장합니다.
    • '언제 어디서나 같은 환경에서 스프링 부트를 배포'할 수 있기 때문입니다.

  1. 테스트 클래스
    • 작성한 코드가 제대로 작동하는지 테스트하기 위한 클래스입니다.
    • 테스트 코드로 검증합니다.
    • 작성한 코드가 있던 패키지를 그대로 test 디렉토리에 생성하여 클래스 파일을 만들어줍니다.
    • 일반적으로 테스트 클래스는 대상 클래스 이름에 Test를 붙입니다.
    • 수동으로 검증하지 않기 위해서 필요합니다.
      • 브라우저로 한 번씩 검증은 하되, 테스트 코드를 작성하고 테스트 후 브라우저로 검증합시다!

  1. 롬복
    • 자바 개발자들의 필수 라이브러리 롬복( Lombok )입니다.
    • 자바 개발할 때 자주 사용하는 코드 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성해 줍니다.
    • 프로젝트에 롬복을 추가합니다.
      • build.gradlecompile('org.projectlombok:lombok')을 추가합니다.
      • Intellij에서 사용할 때 추가적인 설정이 필요로 합니다.
        • lombok plugin 설치
        • Preferences > Build, Execution, Deployment > Compiler > Annotation Processor에 있는 Enable annotation processing 체크

  1. 롬복으로 리팩토링하기
    • 모든 응답 Dto를 추가할 dto 패키지를 만듭니다.
    • 롬복이 정상적으로 작동하는지 확인하기 위해 HelloResponseDto를 만들어서 확인해봅시다.
    • 확인하는 방법은 역시 테스트 클래스를 만들어서 테스트 코드를 작성하는 것 입니다.
    • 테스트 코드 주의할 점
      • JUnit의 기존 assertThat이 아닌 assertj의 assertThat을 사용합니다.

  1. assertj를 사용하는 이유
    • CoreMatchers와 달리 추가적으로 라이브러리가 필요하지 않습니다.
      • JUnit의 assertThat을 쓰게 되면 is()와 같이 CoreMatchers 라이브러리가 필요합니다.
    • 자동완성이 좀 더 확실하게 지원됩니다.
      • IDE에서는 CoreMatchers와 같은 Matcher 라이브러리의 자동완성 지원이 약합니다.

  1. Gradle 버전에 따른 오류
    • 현재 최초로 프로젝트를 만들면 기본적으로 gradle 버전 6대가 설치되어 있습니다.
    • 발생 오류( p.74 )

      오류설명: HelloResponseDto.java 와 관련하여 HelloResponseDtoTest.java를 실행하는 도중, 아래와 같은 오류가 발생합니다.
      private final String name; private final int amount;
      error: variable name not initialized in the default constructor private final String name;


  1. Gradle 버전에 따른 오류 해결방법
    1. Gradle 버전 다운그레이드
      • 실제 책에서 사용한 버전인 4.10.2 버전으로 다운그레이드를 한다.
      • gradlew wrapper --gradle-version 4.10.2 명령어를 사용하면 다운그레이드할 수 있다.
    2. build.gradle 수정
      • gradle 5 이상부터 어노테이션을 구별해서 추가해야 합니다.
      dependencies {
          compileOnly 'org.projectlombok:lombok:1.18.16'
          annotationProcessor 'org.projectlombok:lombok:1.18.16'
      
          testCompileOnly 'org.projectlombok:lombok:1.18.16'
          testAnnotationProcessor 'org.projectlombok:lombok:1.18.16'
      }