[SpringBoot] (1) 스프링부트 프로젝트와 Gradle 연동하기 + 테스트 코드 작성하기

윤경·2022년 1월 23일
1

Spring Boot

목록 보기
69/79
post-custom-banner


✔️ 프로젝트 생성

💡 이 포스트에서는 지금껏 start.spring.io로 프로젝트를 생성했던 것과는 달리 하나하나 직접 설정해본다.

해당 프로젝트는

Gradle → Java
GroupId는 com.book
ArtifactId는 prac-springboot로 설정

  • ArtifactId: 프로젝트 이름

build.gradle

키워드 설명

  • ext: "build.gradle에서 사용하는 전역 변수를 설정하겠다"
  • apply plugin: 'io.spring.dependency-management'
    : 이 플러그 인은 스프링 부트의 의존성들을 관리해주는 플러그인이라 꼭 추가해야 한다.
  • repositories{}:
    각 라이브러리들을 어떤 원격 저장소에서 받을지 정함
  • jcenter:
    원래 mavenCenteral을 많이 사용해왔지만, 본인이 만든 라이브러리를 업로드하기 위해선 많은 과정이 필요해 그 문제점을 개선해 라이브러리 업로드 과정을 간단히 한 것

⌨️ 코드

buildscript {
    ext {
        springBootVersion = '2.1.7.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'

//plugins {
//    id 'java'
//}

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

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    testCompileOnly('org.springframework.boot:spring-boot-starter-test')

    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

test {
    useJUnitPlatform()
}

✔️ Github

깃의 원격 저장소 역할을 하는 대표적인 서비스

  • Github
  • Gitlab

여기서는 Github를 사용하도록 하겠고 .idea 디렉토리는 커밋하지 않는다.
이것은 인텔리제이에서 프로젝트 실행시 자동으로 생성되는 파일이라 굳이 올릴 필요는 없다.

이렇게 커밋 대상에서 제외시키기 위해서는 .gitignore을 이용한다.

이 플러그인은 파일 위치 자동완성, 이그노어 처리 여부 확인, 다양한 이그노어 파일 지원을 제공한다.

ignore 플러그인

⚠️ 맥에서는 shift+command+A로 Action 검색창을 여는데 이때 노란 터미널 창이 켜진다면 환경설정-키보드에서

해당 박스를 체크 해제 해주면 된다.

ignore를 찾아 설치 후 적용해주면 플러그인 설정 끝

그리고 이렇게 gitignore 파일 만들어 아래와 같이 작성해주기

.gradle
.idea

여기까지 기본 인텔리제이, 깃허브 설정을 완료했다.
코드는 [🔗Github]를 참고


✔️ 테스트 코드

테스트 코드는 왜 필요한가

우선 TDD와 단위 테스트(Unit test)는 다른 개념이다.

TDD: 테스트가 주도하는 개발
즉, 테스트 코드를 먼저 작성하고, 테스트가 통과하는 프로덕션 코드를 작성하고, 테스트가 통과하면 프로덕션 코드를 리팩토링하는 과정이다.

단위 테스트는 TDD의 첫번째 과정이다.

단위 테스트의 장점은 다음과 같다.

  • 개발단계 초기에 문제를 발견할 수 있다.
  • 개발자가 나중에 코드를 리팩토링 하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다.
  • 기능에 대한 불확실성을 감소시킨다.
  • 시스템에 대한 실제 문서를 제공한다. 즉, 단위 테스트 자체를 문서로 사용할 수 있다.

테스트 코드 작성하기

우선 src/main/java에 새로운 패키지를 생성한다.

⚠️ 일반적으로 패키지명은 웹 사이트 주소의 역순

그 패키지에 Application.java 를 생성해 다음과 같이 작성한다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

이 클래스가 이제 앞으로 만들 프로젝트의 메인 클래스

  • @SpringBootApplication
    : 스프링 부트의 자동 설정, 스프링 Bean 읽기/생성
    특히, 이 어노테이션이 있는 위치부터 설정을 읽어들이기 때문에 이 클래스는 항상 프로젝트의 최상단에 위치해야 한다.
  • SpringApplication.run
    : 내장 WAS 실행
    (스프링부트에서는 언제 어디서나 같은 환경에서 스프링부트를 배포하기 위해 내장 WAS 사용을 권장)

Controller

main/java/book/springboot/에 컨트롤러와 관련된 클래스들을 담을 web 패키지 생성

코드는 [🔗깃허브]에서 확인

  • @RestController
    : JSON으로 반환하는 컨트롤러임
    (각 메소드마다 @ResponseBody 어노테이션을 이 어노테이션 한 방으로 해결)
  • @GetMapping
    : HTTP Method GET요청 API

테스트 코드로 검증하기

main에서와 같이 test도 패키지를 아래와 같이 생성해주기

이 패키지에 /web/HelloControllerTest.java 생성
코드는 [🔗깃허브]에서 확인

설명

  • @Runwith(SpringRunner.class)
    : 테스트를 진행할 때 JUnit에 내장된 실행자 외 다른 실행자를 실행시킴.
    즉, 여기서는 SpringRunner라는 스프링 실행자 사용. (스프링부트 테스트와 JUnit 사이 연결자 역할)
  • @WebMvcTest
    : 여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션
    ➡️ @Controller, @ControllerAdvice는 사용 가능
    @Service, @Component, @Repository는 사용 불가
  • @Autowired
    : Bean 주입
  • @private MockMvc mvc
    : 웹 API를 테스트할 때 사용
    스프링 MVC 테스트의 시작점으로 GET, POST 등 API 테스트 가능
  • mvc.perform(get("/hello"))
    : MockMvc를 통해 /hello 이 주소로 GET 요청
  • andExpect(status().isOk())
    : mvc.perform의 결과를 검증
    ➡️ 응답이 200인지
  • andExpect(content().string(hello))
    : mvc.perform의 결과를 검증
    ➡️ 응답이 hello인지

테스트 결과 확인하기

아, 테스트가 엄청 늦게 돌아간다면 아래와 같이 설정을 변경해주기

성공!


이 글은 이동욱님의 <스프링 부트와 AWS로 혼자 구현하는  서비스> 를 보고 작성한 글입니다.
profile
개발 바보 이사 중
post-custom-banner

0개의 댓글