스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - gradle설정, 단위테스트, lombok

화나·2021년 1월 20일
0
post-thumbnail

Gradle 프로젝트를 Spring Boot 프로젝트로 변경하기

기본으로 생성된 build.gradle

  • 자바 개발에 가장 기초적인 설정만 되어있는 상태
plugins {
    id 'java'
}

group 'com.book'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
   testCompile group : 'junit', name : 'junit', version : '4.12'
}

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-management'
  • ext : build.gradle에서 사용하는 전역변수를 설정
  • 'io.spring.dependency-management' : 스프링 부트의 의존성들을 관리해주는 플러그인
  • mavenCentral() : 기본적으로 많이 사용하지만 직접 만든 라이브러리를 업로드 하는데 많은 과정이 필요함
  • jcenter() : 간단하게 라이브러리를 업로드 할 수 있고 jcenter()에 업로드 하면 mavenCentral()에도 자동으로 업로드 된다.

추가할 라이브러리 코드

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

TDD / 단위 테스트

TDD : 테스트가 주도하는 개발 / 테스트 코드를 먼저 작성하는 것부터 시작
단위테스트 : 순수하게 테스트 코드만 작성하는 것

테스트 코드를 작성하지 않는다면? 코드가 정상적으로 동작하는지 확인하기 위해서 톰캣을 수도없이 올렸다가 내리면서 불필요한 시간을 허비하고, System.out.println()으로 결과를 확인해야만한다.

✔ 테스트 코드를 작성한다면 더이상 불필요한 시간을 허비하지 않으며 눈으로 검증하지 않게 자동검증이 가능하다.

테스트 코드의 작성을 도와주는 프레임워크 : JUnit (Java)

@SpringBootApplication
public class Application {
    public static void main(String args[]){
        SpringApplication.run(Application.class, args);

    }
}
  • 앞으로 만들 프로젝트의 메인 클래스
  • @SpringBootApplication : 해당 어노테이션이 있는 위치부터 설정을 읽어가기 때문에 항상 프로젝트 상단에 위치해야함
  • SpringApplication.run : 내장 WAS 실행
    - 내장 WAS : 별도로 외부에 WAS를 두지 않고 애플리케이션을 실행할 때 내부에서 WAS를 실행하는 것
    1. 내장 WAS를 사용하면 톰캣을 설치할 필요가 없어짐
    2. 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있음
//테스트 코드 예시
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void helloReturn() throws Exception {
        String hello = "hello";

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
    
    @Test
    public void helloDtoReturn() throws Exception{
        String name = "hello";
        int amount = 1000;

        mvc.perform(get("/hello/dto").param("name", name).param("amount", String.valueOf(amount)))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.name",is(name)))
        .andExpect(jsonPath("$.amount",is(amount)));
    }
}
  • @RunWith(SpringRunner.class)
    - 테스트를 진행할 때, JUnit에 내장된 실행자 외에 SpringRunner라는 스프링 실행자를 사용한다. 스프링 부트 테스트와 JUnit 사이 연결자 역할
  • @WebMvcTest : 스프링 어노테이션중 web에 집중할 수 있는 어노테이션
    - 선언할 경우 @Controller, @ControllerAdvice등을 사용할 수 있지만, @Service, @Component, @Repository등은 사용할 수 없다.
  • @Autowired : 스프링이 관리하는 bean을 주입받는다.
  • private MockMvc mvc : 이 클래스를 통해서 GET, POST등에 대한 웹 API 테스트를 할 수 있음
  • mvc.perform(get("/hello")) : MockMvc를 통해 /hello 주소로 HTTP GET을 요청
  • andExpect(status().isOk()) : mvc.perform의 결과를 검증(HTTP Header의 상태를 검증), 200인지 아닌지 검증
  • andExpect(content().string(hello)) : 응답 본문의 내용을 검증
  • .param : API 테스트 할 때 사용될 요청 파라미터 설정, 값은 String만 허용되므로 숫자/날짜 데이터도 문자열로 변경해야지 사용가능하다.
  • jsonPath : json응답값을 필드별로 검증할 수 있는 메소드, $를 기준으로 필드명을 명시한다.

Lombok

롬복(Lombok) : 자바 개발할 때 자주 사용하는 코드 Getter, Setter, 기본 생성자, toString을 어노테이션으로 자동 생성해줌

build.gradle에 아래코드 추가
compile('org.projectlombok:lombok')

추가 후 새로고침 버튼을 눌러서 라이브러리를 내려받는다.

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
    private final String name;
    private final int amount;
}
  • @Getter : 선언된 모든 필드의 get 메소드를 생성
  • @RequiredArgsConstructor : 선언된 모든 final 필드가 포함된 생성자를 생성, final이 없는 필드는 생성자에 포함되지 않음
//적용된 롬복이 잘 동작하는지 테스트하는 코드
public class HelloResponseDtoTest {
    @Test
    public void lombokTest(){
        String name = "test";
        int amount = 1000;

        HelloResponseDto dto = new HelloResponseDto(name, amount);

        assertThat(dto.getName()).isEqualTo(name);
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}
  • assertThat : assertj(테스트 검증 라이브러리)의 검증 메소드
  • .isEqualTo : assertj의 동등 비교 메소드, 값을 비교해서 같을때만 성공

0개의 댓글