## 테스트 코드의 중요성 과거 스프링 관련 강의를 들은 적이 있었는데, 그때 강사 분이 테스트 코드가 굉장히 중요하며 무조건 테스트 코드부터 작성하라고 강조하셨다. "테스트 잘못해서 난리난 적이 있으신가?"라는 생각이 들 정도로 강조하고 또 강조하셨다. **테스트 코드는 왜 그렇게 중요할까?** 당시에는 이해 못 했지만, 지금은 적어도 두 가지 이유를 댈 수 있다. **첫 번째는 MSA 관련한 이유이다.** MSA의 장점은 '빠른 개발, 빠른 확장, 빠른 수정, 높은 안정성'이다. **그런데 이런 장점은 테스트 코드가 잘 작성됐을 때의 이야기다.** 테스트 코드가 잘 작성되지 않거나 아예 작성되지 않아 수동으로 테스트를 해야 한다면, 마이크로서비스를 추가/수정할 때마다 테스트에 많은 시간이 소모되고 체크하지 못한 에러가 생길 수도 있다. 이러면 MSA의 장점은 사라지고 '느린 개발, 느린 확장, 느린 수정, 낮은 안정성'이 되는 것이다. **두 번째 이유는 복잡한 서비스를 구현할 때 효과적이기 때문이다.** 단순한 서비스는 보기만 해도 로직을 세울 수 있고, 조금 복잡한 서비스는 고민과 토론을 통해 로직을 세울 수 있다. 그러나 복잡한 서비스는 로직이 세워지지 않고 제대로 구현했는지 파악하는 것도 힘들다. 이런 경우 테스트 코드는 서비스 구현이 얼마나 진행됐는지 파악하는 일종의 마일스톤이 될 수 있다. 또한, 테스트 코드를 통과하면서 로직을 조금씩 세울 수도 있다. ## 테스트 환경 설정 ### 0. 의존성 설정(Gradle 🐘) ```groovy dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'com.h2database:h2:2.2.224' } ``` - `spring-boot-starter-test`에 포함된 주요 라이브러리 목록은 [[B. Spring Boot 스타터와 의존성 지옥#주요 스타터와 포함된 라이브러리|여기]]에서 볼 수 있다. - `com.h2database:h2`의 **H2**는 메모리 기반 데이터베이스로 휘발성을 가진다. ### 1. `test.properties` 설정 ![[Pasted image 20231212173056.png]] - **src > test > resources** 에 `test.properties` 파일을 생성한다. 테스트 중에는 이 `test.properties` 파일에서 애플리케이션 설정을 받아올 것이다. 기존 `application.properties` 파일을 쓰지 않는 이유는 테스트 전후로 설정을 수정해야 하기 때문이다. ``` spring.jpa.open-in-view = false spring.jpa.show-sql = true spring.jpa.properties.hibernate.format_sql = true spring.jpa.properties.hibernate.generate_statistics = true spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto = create spring.test.pretty-print=true ``` - `spring.jpa.open-in-view`: 영속성 컨텍스트가 언제까지 살아있는지에 대한 설정이다. true로 설정하면 컨트롤러까지 영속성 컨텍스트가 살아있고, false로 설정하면 서비스까지 살아있다. 컨트롤러에서 엔티티를 수정하는 건 바람직하지 않으므로 false로 설정한다. - `spring.jpa.show-sql`: JPA 작동 과정에서 생성되는 SQL 쿼리를 콘솔에 출력할지 결정. 개발 중에는 SQL 쿼리를 확인할 일이 꽤 있으므로 true로 한다. - `spring.jpa.properties.hibernate.format_sql`: SQL 쿼리에 들여쓰기와 줄 바꿈이 적용해서 출력할지 결정 - `spring.jpa.properties.hibernate.generate_statistics`: Hibernate의 통계 수집을 활성화할지 여부를 결정 - `spring.jpa.properties.hibernate.dialect`: 사용할 Hibernate Dialect를 설정. 우리는 H2를 쓰기 때문에 H2 방언을 설정한다. - `spring.jpa.hibernate.ddl-auto`: Hibernate가 데이터베이스 스키마를 자동으로 생성, 갱신할지 여부를 결정. `create`로 설정해서 테스트 시작 시에 스키마를 생성하게 한다. - `spring.test.pretty-print`: 테스트 결과를 콘솔에서 예쁘게 출력하도록 하는 설정이다. IDE 없이 테스트 코드를 실행할 수도 있기 때문에 추가한다. ### 2. test 패키지 구조화 ![[0. ChatGPT 프록시 서버 소개 및 주요 서비스#test 패키지 구조]] - 테스트 코드 파일이 늘어날 수록 번잡해진다. 그러니 좀 분류를 하자. - `config`에는 `@TestConfiguration` 어노테이션이 달린 테스트 자바 설정 파일들을 넣을 것이다. 테스트 자바 성절 파일에는 테스트에서만 쓰이는 스프링 빈이 정의되어 있다. 주로 `assertor`에 있는 함수형 인터페이스를 람다로 구현하여 빈으로 등록하게 될 것이다. - `assertor`에는 함수형 인터페이스를 넣을 것이다. 이 함수형 인터페이스는 람다로 구현될 것이고, 람다 안에는 반복되는 `assert` 코드들이 들어있을 것이다. - 그 외 `PromptTemplateRepositoryTest` 등은 모두 테스트 코드 파일이다.