2021-9-24 스트링 부트와 AWS로 혼자 구현하는 웹 서비스(1주차)

1장 인텔리제이로 스프링 부트 시작하기

그레이들 프로젝트를 스프링 부트 프로젝트로 변경하기

buildscript{
	ext {
		springBoorVersion = '2.1.7.RELEASE'
	}
	repositories {
		mavenCentral()
		jcenter()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBoorVersion}")
	}
}

위의 코드는 이 프로젝트의 플러그인 의존성 관리를 위한 설정이다

ext라는 키워드는 build.gradle에서 사용하는 전역변수를 생성하겠다는 의미

springBootVersion 이라는 전역변수를 생성해서 값을 ‘2.1.7.RELEASE’로 설정

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' // - 스프링부트의 의존성을 관리해 주는 플러그인이라 꼭 추가

위 4개의 프럴그인은 자바와 스프링브트를 사용하기 위해서 필수 플러그인이니 항상 추가

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('com.h2database:h2')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

repositories는 각종 의존성(라이브러리)들을 어떤 원격 저장소에 받을지를 정한다.

dependencies 는 프로젝트 개발에 필요한 의존성들을 선언하는 곳

2장 스프링 부트에서 테스트 코드를 작성하자

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);
    }
}

Application 클래스는 앞으로 만들 프로젝트의 메인 클래스이다

@SpringBotApplication으로 인해 스프링 부트의 자동 설정, 스프링 Bean읽기와 생성을 모두 자동으로 설정

특히 @SpringBotApplication이 있는 위치부터 설정을 읽어가기 때문에 이 클래스는 항성 프로젝트 최상단에 위치해야함

  • HelloController
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController //컨트롤러를 JSON을 반환하는 컨트롤러로 만들어준다.
public class HelloController {

    @GetMapping("/hello") //GET요청을 받을 수 있는 API를 만들어준다
    public String hello() {
        return "hello";
    }
}
  • HelloControllerTest
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.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) //여기서는 SpringRunner라는 스프링 실행자를 사용
@WebMvcTest(controllers = HelloController.class) //여러 스프링 테스트 어노테이션중 Web에 집중할 수 있는 어노테이션
public class HelloControllerTest {

    @Autowired //스프링이 관리하는 빈을 주입받는다
    private MockMvc mvc; //웹 API를 테스트할때 사용, 스프링 MVC테스트의 시작점

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

        mvc.perform(get("/hello")) //mvc를 통해 /hello로 GET요청을 보낸다
                .andExpect(status().isOk()) //mvc의 결과를 검증한다, 200인지 아닌지
                .andExpect(content().string(hello)); // 리스폰스 내용을 검증, hello가 왔나 검증
    }
}
  • HelloResponseDto
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter //선언된 모든 필드의 get 메소드를 생성해준다
@RequiredArgsConstructor //선언된 모든 final 필드가 포함된 생성자를 생성해줌
public class HelloResponseDto {
    private final String name;
    private final int amount;
}
  • HelloResponseDtoTest
import org.junit.Test;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;

public class HelloResponseDtoTest {

    @Test
    public void 롬북_기능_테스트() {
        String name = "test";
        int amount = 1000;

        HelloResponseDto dto = new HelloResponseDto(name, amount);

        assertThat(dto.getName()).isEqualTo(name);
//검증메소드이다, 검증하고싶은 대상을 메소드 인자로 받는다/ isEqualTO의 값과 같을때만 성공
//Getter로 get메소드가 자동으로 생기는걸 증명
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}
  • HelloController
@GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name,
                                     @RequestParam("amount") int amount) {
        return new HelloResponseDto(name, amount);
    }
  • HelloControllerTest
@Test
    public void helloDto가_리턴된다() throws Exception {
        String name = "hello";
        int amount = 1000;

        mvc.perform(
                get("/hello/dto")
                        .param("name", name)
                        .param("amount", String.valueOf(amount))
		//param - 파라미터를 설정한다.단 값은 string만 허용해서 문자열로 변경해야한다.
        )
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name)))
//JSON응답값을 필드별로 검증, $-을 기준으로 필드명을 명시
                .andExpect(jsonPath("$.amount", is(amount)));
    }
Written on September 24, 2021