2021 10 24
2021-10-24¶
Spring에서 테스트 코드 작성하기¶
- 참고: https://www.baeldung.com/spring-boot-testing
@SpringBootTest로 통합 테스트 진행하기 - 다른 계층의 어플리케이션을 테스트하는데 중점 (mocking을 포함해서) - 이상적으로는, 이를 단위테스트와 격리시켜 테스트를 작성해야한다. - 우선 컨테이너를 띄워서 테스트를 진행해야함 -@SpringBootTest로 전체 컨테이너 부트스트랩 가능 - ApplicationContext의 생성 -@TestConfiguration으로 실제 어플리케이션 컨텍스트에 사용되는 빈 말고 모킹할 수 있음 -@MockBean으로 모킹가능
@DataJpaTest로 통합테스트 - 엔티티와 DB 통합테스트 가능
@WebMvcTest로 통합테스트 -@WebMvcTest(EmployeeRestController.class)로 단일 컨트롤러 클래스 테스트 - 서비스 레이어의 코드를 모킹 뚝딱해서 테스트 진행
- 기타 설정을 쉽게 해주는 어노테이션들!
-
@WebFluxTest: 스프링 WebFlux 컨트롤러 테스트 지원 -@JdbcTest: JPA 어플리케이션 테스트에 용이. 하나의 데이터소스 요구 -@JooqTest: jOOQ 관련 테스트 -@DataMongoTest: 몽고DB 테스트 -@DataRedisTest: 레디스 어플리케이션 테스트 -@DataLdapTest: 인메모리 LDAP 테스트 -@RestClientTest: REST client에 대한 테스트 -@JsonTest: Spring 어플리케이션 컨텍스트 빈들중에 JSON 직렬화 필요한 놈 테스트
SpringBoot TestRestTemplate 알아보기¶
- 참고: https://www.baeldung.com/spring-boot-testresttemplate
- TestRestTemplate vs RestTemplate - 모두 통합테스트 작성에 적합, HTTP API와의 통신 처리 잘함 - 표준 메서드, 헤더, HTTP 구성과 동일하게 제공 - 하지만 TestRestTemplate은 RestTemplate을 확장하지 않으면서 흥미로운 새 기능을 제공
- TestRestTemplate의 새로운 기능은 무엇인가?
- 기본 인증 자격 있는 생성자
TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd"); ResponseEntity<String> response = testRestTemplate. getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class); assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));- HttpClientOption 있는 생성자
TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd", TestRestTemplate.HttpClientOption.ENABLE_COOKIES); ResponseEntity<String> response = testRestTemplate. getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class); assertThat(response.getStatusCode(), equalTo(HttpStatus.OK))- 자격을 얻어오는 새로운 방법
레거시 코드¶
- 소프트웨어의 존재 가치 - 사용자를 위해 도메인에 관련된 문제 해결하는 능력 - 당면한 문제를 해결하지 못하는 SW는 실패한 SW. - 얼마나 빠른가, 얼마나 많이 처리할 수 있는가, 얼마나 많은 사람이 붙어서 사용할 수 있는가는 나중이야기!
- 기존의 개발 - DB 종속적 어플리케이션 - DB 스키마 정해지면 모든 코드 결정
- Anemic Domain Model - 빈약한 도메인 모델 - 객체 지향의 Object의 상태와 행위는 없음 - 그저 데이터만 가지는 데이터홀더 개념의 객체들,,, - 구조적인 한계들은 과도한 서비스 레이어의 사용을 부추김
- Business Object - 비즈니스가 분산되어 구현된 오브젝트 - 동작을 실행하거나 관리하는 클래스 - 클라이언트 데이터에 대한 요청을 DAO에 호출하는 역할도 함
- Big Service Layer - 거대한 서비스 레이어 != 객체지향의 설계 원칙 - 메인 로직 여러곳에 산재하고, 코드의 중복과 오브젝트 재활용성 떨어뜨림