촬리의늘솔길

spring부트와 aws로 구현하는 웹서비스 따라하기(1) 본문

✍~2022/java

spring부트와 aws로 구현하는 웹서비스 따라하기(1)

리촬리 2022. 7. 29. 10:27
buildscript{
    ext{
        //ext : build.gradle에서 사용하는 전역변수를 설정하겠다. spring Boot Version 이라는 전역변수 생성
        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' //spring부트의 의존성을 관리해주는 플러그인

group 'org.example'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

repositories { //각종 라이브러리들을 어떤 저장소에서 받을지 정함.
    mavenCentral()

}

dependencies {

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

}

 

오류가 떠서 확인해보니

https://okky.kr/article/997902

 

OKKY | SpringBoot Gradle 설정시 오류!

안녕하세요. 스프링부트와 AWS로 혼자구현하는 웹 서비스 책을 따라서 하는 도중 에러가 발생해서 물어봅니다. 처음 build.gradle  파일을 생성하고  buildscript { ext{ springBootVersion 2.1.7.RELEASE } repositor

okky.kr

그래들 버전때문에 그런걸 수 있다고한다.

implementation 으로 compile이라는 단어를 변경

testcompile 은 testimplementation 으로 변경한다.

 

그랬더니 아주잘됨~

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'

group 'com.jojoldu.book'
version '1.0.4-SNAPSHOT-'+new Date().format("yyyyMMddHHmmss")
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.projectlombok:lombok')
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
    implementation('org.springframework.boot:spring-boot-starter-mustache')
    implementation('com.h2database:h2')

    implementation('org.springframework.boot:spring-boot-starter-oauth2-client')
    implementation('org.springframework.session:spring-session-jdbc')

    implementation("org.mariadb.jdbc:mariadb-java-client")

    testImplementation('org.springframework.boot:spring-boot-starter-test')
    testImplementation("org.springframework.security:spring-security-test")
}

 

취업의 기본인, 테스트코드를 작성해보자.

 

TDD와 단위테스트는 다른이야기이다.

TDD는 테스트가 주도하는 개발을 이야기한다. 테스트코드를 먼저 작성하는것부터 시작한다.

반면 단위테스트는 TDD의 첫번째 단계인 기능단위의 테스트코드를 작성하는것을 이야기한다.

TDD와 달리 테스트 코드를 꼭 먼저 작성해야하는것 도 아니고, 리팩토링도 포함되지않는다.

순수하게 테스트 코드만 작성하는것을 이야기한다.

 

 

 

WHY?

- 단위테스트는 개발 단계 초기에 문제발견하게 도와줌

- 단위테스트는 개발자가 나중에 코드를 리팩토링하거나, 라이브러리 업그레이드 등에서 기존기능이 올바르게 작동하는지 확인가능

- 기능에대한 불확실성 감소

- 시스템에 대한 실제문서 제공, 단위테스트 자체가 문서로 사용됨

 

테스트 코드 작성을 도와주는 프레임워크들이 있다.

가장 대중적인 테스트 프레임워크로는 xUnit이 있는데, 이는 개발환경에 따라 Unit테스트를 도와주는 도구라고 생각하면된다.

 

-JUnit - Java

- DBUnit - DB

CppUnit - C++

NUnit - .net

 


 

스프링 부트는 내장 WAS를 사용하는것을 권장하고 있다. 

이유는 , 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있기 때문이다.

외장 was를 쓰면, 환경설정을 하나하나 다 해야함.

 

테스트를 위한 Controller를 만들자.

 

 

package springboot.web;

import com.jojoldu.book.springboot.web.HelloController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.stereotype.Controller;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class) //테스트를 진행할 때 JUnit 에 내장된 실행자 외에 다른 실행자를 실행시킨다.
//여기서는 SpringRunner라는 스프링 실행자를 사용한다. 즉, 스프링 부트 테스트와 JUnit사이에 연결자 역할을 한다.
@WebMvcTest(controllers = HelloController.class)
/*여러 스프링 테스트 어노테이션 중, web에 집중할 수 있는 어노테이션
선언할경우, @Controller,@ControllerAdvice등은 사용가능.
@Service, @Component, @Repository는 사용불가
컨트롤러만 사용하기때문에 선언함.
*/
public class HelloControllerTest{
    @Autowired //스프링이 관리하는 빈 주입받음
    private MockMvc mvc; //웹 api를 테스트할때 사용함. 스프링 mvc테스트의 시작점, http get,post등에대한 api테스트 가능


    @Test
    public void hello가_리턴된다() throws Exception{
        String hello = "hello";

        mvc.perform(get("/hello")) // MockMVC를 통해 /hello주소로 HTTP GET 요청을 한다. 체이닝이 지원되어 아래와 같이 여러 검증 기능을 이어서 선언가능
                .andExpect(status().isOk())// mvc.perform 의 결과를 검증한다. HTTP Header 의 Status 를 검증한다. 200,404,500 등의 상태를 검증한다. 여기선 OK즉 ,200인지 검증
                .andExpect(content().string(hello)); // 컨트롤러에서 hello를 리턴하기 때문에 이 값이 맞는지 검증
    }
}

 

테스트가..성공해야하는데,,

No tests found for given includes: [springboot.web.HelloControllerTest.hello��_���ϵȴ�](--tests filter)

으으응.ㅇ..? 

오류를 해결해보자 (07-27)

 

 

우리가 검증용으로 선언했던 .andExpect(status().isOk()) 와 .andExpect(content().string(hello)) 가 모두 테스트를 통과했음을 의미한다.

728x90

'✍~2022 > java' 카테고리의 다른 글

객체 지향 개념  (0) 2022.08.03
java 강의  (0) 2022.08.02
java 에서의 소켓 프로그래밍[서버]  (0) 2022.06.01
java socket 통신 스레드 이해하기  (0) 2022.06.01
학교 객프 수업 필기(1주차)  (0) 2021.09.03