공부/스프링부트와 AWS로 혼자 구현하는 웹 서비스

[웹서비스-01] 개발환경 구성, 프로젝트 생성, 테스트 코드 작성

줭♪(´▽`) 2021. 9. 2. 23:23

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로 혼자 구현하는 웹 서비스 (저자 : 이동욱, 출판 : 프리렉)