TDD(Test Drive4n Development): 테스트 주도 개발
★레드 그린 사이클
Red: 항상 실패하는 테스트를 먼저 작성
Green: 테스트를 통과하는 프로덕션 코드를 작성
Refactor:테스트가 통과하면 프로덕션 코드를 리펙토링
단위 테스트
- 개발단계 초기에 문제 발견을 도와줌
- 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동되는지 확인가능
- 기능에 대한 불확실성을 감소
- 시스템에 대한 실제 문서 제공
테스트 코드 프레임워크
- Java - Junit
- DB - DBUnit
- c++ - cppUnit
프로젝트 생성
프로젝트 - src - main - java, new - package 생성
※ 패키지 이름은 일반적으로 사이트 이름을 반대로 적은것으로 한다. ex) com.naver.www
새로운 클래스 생성(Application)
- @SpringBootApplication 어노테이션: 스프링 부트의 자동설정, 스프링 Bean 읽기와 생성을 자동으로 설정
- SpringBootApplication.run: 내장된 웹 애플리케이션 서버를 실행 -> 톰캣 설치 x
- 내장 서버 사용 권장 -> 어떠한 환경에서도 스프링 부트 배포 가능
Web 패키지 생성(controller)
main/.../Web/HelloController
- @RestController 어노테이션: 컨트롤러를 JSON을 반환하는 컨트롤러로 만듬
- @GetMapping: HTTP 메소드인 Get의 요청을 받을 수 있는 API를 만듬
테스트 파일 HelloContollerTest 생성
test/.../Web/HelloControllerTest
- @RunWith(SpringRunner.class)
- 테스트를 진행할 때 JUnit에 내장된 실행자 외 다른 실행자를 실행 시킴
- 여기서는 SpringRunner를 실행자를 사용
- 스프링 부트 테스트와 JUnit사이에서 연결자 역할
- @WebMvcTest
- 여러 스프링 테스트 어노테이션 중, Web(Mvc)에 집중할 수 있는 어노테이션
- @Controller, @ControllerAdvice와 함께 사용 가능
- @Service, @Component, @Repository 등은 사용 불가
- 여기서는 컨트롤러만 사용하기 때문에 선언
- @Autowired: 스프링이 관리하는 빈을 주입 받음
- @private MockMvc mvc
- 웹 API를 테스트할 때 사용
- 스프링 MVC 테스트의 시작점입니다.
- 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있습니다.
- mvc.perform(get("/hello"))
- MockMvc를 통행 /hello 주소로 HTTP GET 요청을 합니다.
- 체이닝이 지원되어 아래와 같이 여러 검증 기능을 이어서 선언할 수 있습니다.
- .andExpect(status().isOk())
- mvc.perform의 결과를 검증
- HTTP Header의 Status를 검증
- 200, 404, 500 등의 상태를 검증
- 여기선 200인지 아닌지를 검증
- .andExpect(content().string(hello))
- mvc.perform의 결과를 검증
- 응답 본문의 내용을 검증
- Controller에서 hello를 리턴하기 때문에 이 값이 맞는지 검증
롬북(lombok)
자바를 개발할 때 자주 사용하는 코드 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성
1. build.gradle 의존성 추가
2. plugins에서 설치
Hello Controller 코드 롬북으로 전환
web/dto/HelloResponseDto
- @Getter: 선언된 모든 필드의 get 메소드를 생성
- @RequiredArgsConstructor
- 선언된 모든 final 필드가 포함된 생성자를 생성
- final이 없는 필드는 생성자에 포함되지 않는다.
※ DTO(Data Transfer Objcet)
- 계층간 데이터 교환을 위한 객체(Java Beans)
- 데이터베이스에서 데이터를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체
- 로직을 갖지 않는 순수한 데이터 객체이며, Getter/Setter 메서드만을 갖는다.
- Request와 Response용 DTO는 View를 위한 클래스
※ DAO(Data Access Objcet)
- 실제로 데이터베이스에 접근하는 객체
- Service와 DB를 연결하는고리의 역할
- SQL을 사용하여 DB에 접근한 후 적절한 CRUD API 제공
- extends JpaRepository<User, Long>
※ Entity Class(domain package)
- 실제 데이터베이스 테이블과 매칭될 클래스
- @Entity, @Column, @Id 등을 이용
Client <-DTO-> controller - service - repository(DAO) <-Entity class-> DataBase
참고. https://gmlwjd9405.github.io/2018/12/25/difference-dao-dto-entity.html
HelloResponseDtoTest 코드 작성
test/.../web/dto/HelloResponseDtoTest
- assertThat
- assertj라는 테스트 검정 라이브러리의 검증 메소드
- 검증하고 싶은 대상을 메소드 인자로 받습니다.
- 메소드 체이닝이 지원되어 isEqualTo와 같이 메소드를 이어서 사용할 수 있습니다.
- isEqualTo: 동등비교 메소드
HelloController 코드 수정
web/HelloController
- @RequestParam
- 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
- 여기서는 외부에서 name이란 이름으로 파라미터를 메소드 파라미터name에 저장하게 됩니다.
HelloControllerTest 코드 수정
web/HelloControllerTest
- param
- API테스트를 할 때 사용될 요청 파라미터를 설정
- String만 허용 -> 숫자, 날짜 데이터를 등록할 때는 문자열로 변경해야함
- jsonPath
- JSON 응답값을 필드별로 검증할 수 있는 메소드
- $를 기준으로 필드명을 명시
참고. 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 이동욱 지음
- 더욱 상세한 설명은 책은 꼭 구매하셔서 확인하시길 바랍니다.
'기타 > Spring boot' 카테고리의 다른 글
스프링 시큐리티와 OAuth2.0 (0) | 2020.05.21 |
---|---|
머스테치 화면 구성하기 (0) | 2020.05.21 |
스프링 부트에서 JPA로 데이터베이스 다루기 (0) | 2020.05.21 |
스프링부트 환경설정 (0) | 2020.05.12 |