[웹서비스-01] 개발환경 구성, 프로젝트 생성, 테스트 코드 작성
http://www.yes24.com/Product/Goods/83849117
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - YES24
가장 빠르고 쉽게 웹 서비스의 모든 과정을 경험한다. 경험이 실력이 되는 순간!이 책은 제목 그대로 스프링 부트와 AWS로 웹 서비스를 구현한다. JPA와 JUnit 테스트, 그레이들, 머스테치, 스프링
www.yes24.com
https://github.com/jojoldu/freelec-springboot2-webservice
GitHub - jojoldu/freelec-springboot2-webservice
Contribute to jojoldu/freelec-springboot2-webservice development by creating an account on GitHub.
github.com
스프링 부트에 대해 공부하고 싶어서 위 책을 사서 실습을 하기로 하였다.
친절하신 저자님께선 소스까지 깃허브에 올려주셨다...
끝까지 실습하는 걸 목표로 ㅎㅇㅌ!
1. 개발환경 구성
1) 인텔리제이(IntelliJ IDEA) 2021.2.1
https://www.jetbrains.com/ko-kr/idea/
IntelliJ IDEA: 우수성과 인체 공학이 담긴 JetBrains Java IDE
www.jetbrains.com
- JetBrains에서 개발한 개발 도구
IntelliJ 특징
- 강력한 추천 기능(Smart Completion)
- 훨씬 더 다양한 리팩토링과 디버깅 기능
- 이클립스의 깃(Git)에 비해 훨씬 높은 자유도
- 프로젝트 시작할 때 인덱싱을 하여 파일을 비롯한 자원들에 대한 빠른 검색 속도
- HTML, CSS, JS, XML 에 대한 강력한 기능 지원
- 자바, 스프링부트 버전업에 맞춘 빠른 업데이트
2) Lombok
- 자바 개발 시 자주 사용하는 코드 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성
- 이클립스에서는 따로 설치를 해야하지만, 인텔리제이에서는 플러그인으로 쉽게 설정 가능
- build.gradle에 'compile('org.projectlombok:lombok') 추가 후 lombok 플러그인을 설치하여 사용 가능 (재시작 필요)
3) 실습 개발환경 정리
- IDE : IntelliJ 2021.2.1
- Java : 8 (jdk 1.8)
- Gradle 4.10.2
- SpringBoot 2.1.9
- Test : JUnit4
2. 프로젝트 생성
1) 프로젝트 생성
(1) Gradle - Java 프로젝트 생성
(2) GroupId, ArtifactId(프로젝트 이름) 설정
(3) Gradle 프로젝트를 Spring Boot 프로젝트로 변경하기 위해 build.gradle 수정
buildscript {
ext {
springBootVersion = '2.1.9.RELEASE'
}
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-maanagement'
group 'com.juzero'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.projectlombok:lombok')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
- ext : 전역변수 설정
- repositories : 각종 의존성(라이브러리)들을 어떤 원격 저장소에서 받을지 지정
- dependencies : 프로젝트 개발에 필요한 의존성을 선언
2) Git 연결
(1) 깃허브 저장소 생성
https://github.com/juzero98/springboot-webservice
GitHub - juzero98/springboot-webservice
Contribute to juzero98/springboot-webservice development by creating an account on GitHub.
github.com
(2) 프로젝트 깃 커밋과 깃허브 푸쉬 진행
※ .idea 디렉토리는 커밋하지 않음 -> 인텔리제이에서 프로젝트 실행 시 자동으로 생성되는 파일들이기 때문
※ .gitignore에서 특정 파일 혹은 디렉토리를 지정하여 깃 관리 대상에서 제외시킬 수 있음
(인텔리제이는 지원하지 않아 .ignore 플러그인 설치 필요)
3. 테스트 코드 작성
1) 테스트 코드
- TDD : 테스트가 주도하는 개발, 테스트 코드를 먼저 작성함 (레드 그린 사이클 참조)
- 단위 테스트 : TDD의 첫 번째 단계인 기능 단위의 테스트 코드를 작성하는 것
- TDD와 단위 테스트는 같지 않음
단위 테스트의 이점
- 개발단계 초기에 문제를 발견하게 도와줌
- 코드를 리팩토링하거나 라이브러리 업그레이드 중에서 기존 기능이 올바르게 작동하는지 확인 가능
- 기능에 대한 불확실성 감소시킬 수 있음
- 시스템에 대한 실제 문서 제공
2) 테스트 프레임워크
- xUnit : 테스트 코드 작성을 도와주는 프레임워크
JUnit - Java
DBUnit - DB
CppUnit - C++
NUnit - .net
3) 테스트 코드 작성
- src 폴더의 java 폴더에는 실제 코드를, test 폴더에는 테스트 코드를 저장
- 패키지 이름은 웹 사이트의 주소 역순으로 지정
- Java 클래스의 테스트 클래스는 Java클래스명+Test
ex) HelloController의 테스트 클래스는 HelloControllerTest
4. 실습
자세한 코드는 깃허브 참조
1) Application.java
- 프로젝트의 메인 클래스
- @SpringBootApplication : 스프링부트의 자동 설정, 스프링 Bean 읽기와 생성을 이 애너테이션을 기준으로 모두 자동으로 설정 -> 프로젝트 최상단에 위치해야 함
2) web/HelloController.java
- @RestController : JSON을 반환하는 컨트롤러, @ResponseBody를 한번에 사용하기 위함
- @GetMapping("/____") : HTTP Method인 Get의 요청을 받을 수 있는 API
3) (test) web/HelloControllerTest.java
- @RunWith(SpringRunner.class) : JUnit에 내장된 실행자 외에 다른 실행자(SpringRunner)를 실행
- @WebMvcTest : 여러 스프링 어노테이션 중 Web에 집중할 수 있는 어노테이션
-> @Controller, @ControllerAdvice 등 사용가능
-> @Service, @Component, @Repository 등 사용불가
- @Autowired : 스프링이 관리하는 빈(Bean)을 주입받음
- @private MockMvc mvc : 웹 API를 테스트할 때 사용
- mvc.perform(get("/__")) : MockMvc를 통해 /___주소로 HTTP GET 요청
- .andExpect(status().isOk()) : mvc.perform의 결과를 검증, HTTP Header의 Status가 Ok(200)인지 검증
- .andExpect(content().string(____)) : mvc.perform의 결과를 검증, 응답 본문의 내용 검증
- @Test : 테스트 코드임
4) web/dto/HelloResponseDto.java
- @Getter : 선언된 모든 필드의 get 메소드 생성
- @RequiredArgsConstructor : 선언된 모든 final 필드가 포함된 생성자를 생성
5) (test) web/dto/HelloResponseDtoTest.java
- assertThat : assertj라는 테스트 검증 라이브러리의 검증 메소드
- isEqualTo : assertj의 동등 비교 메소드
참고 - 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (저자 : 이동욱, 출판 : 프리렉)