일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- mustache
- DynamicProgramming
- 코딩테스트
- index.html
- rombok
- spring
- DB
- 알고리즘
- 프로그래머스
- C++
- JPA
- Gradle
- kotlin
- SpringDataJPA
- 알고리즘 #코딩테스트 #프로그래머스 #C++ #vector #string
- API
- test case
- Comparable
- 해싱
- testcode
- baekjoon
- tdo
- SpringSecurity
- JPA autiding
- gitignore
- SpringFramework
- Java
- springboot
- TDD
- SpringBean
- Today
- Total
천천히, 한결같이
[Spring] 컨트롤러 생성하고 테스트 코드로 검증하기 본문
이동욱 님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스책을 공부하며 정리한 내용입니다. 틀린 정보가 있을 수 있으니 주의하시고 댓글로 남겨주시길 바랍니다.
패키지 생성, 메인 메소드
Java 디렉토리를 마우스 오른쪽 버튼으로 클릭, 패키지를 생성합니다. 보통 패키지명은 웹 사이트 주소의 역순으로 합니다. (예 : com.hwanld.book.springboot)
그리고 패키지 아래에 Application 클래스를 생성합니다.
package com.hwanld.book.springboot;
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);
}
}
(참고: 인텔리제이에서 import 단축키는 alt+enter로 쉽게 import 할 수 있습니다.)
Application 클래스는 앞으로 만들 프로젝트의 메인 클래스가 됩니다. @SpringBootApplication으로 인해 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정합니다.
@SpringBootApplication이 있는 위치부터 설정을 읽어가기 때문에 Application클래스는 항상 프로젝트의 최상단에 위치해야 합니다.
main메소드에서 실행하는 SpringApplication.run(Application.class, args)
로 인해 내장 웹 어플리케이션 서버를 실행합니다.
컨트롤러 생성하기
만들어 두었던 최상단의 패키지 (com.hwanld.book.springboot) 내부에 Controller라는 새로운 패키지를 만듭니다. 컨트롤러와 관련된 클래스들을 전부 여기에 담는다고 생각하면 좋을 것 같습니다.
그리고 패키지 아래에 아래 API를 추가합니다.
package com.hwanld.book.springboot.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
@RestController
: 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어줍니다.
@GetMapping
: HTTP method인 Get의 요청을 받을 수 있는 API를 만들어줍니다.
위 API는 /hello로 요청이 오면 문자열 hello를 반환하는 기능을 가지게 되었습니다.
테스트 패키지 생성, 테스트 코드 작성
앞에서 생성했던 패키지(com.hwanld.book.springboot)를 그대로 다시 src/test/java에 생성합니다.
그리고 테스트 코드를 작성할 클래스를 생성합니다. 일반적으로 테스트 클래스는 대상 클래스 이름에 Test를 붙입니다. 그러므로 여기선 HelloControllerTest를 생성합니다.
그러고 아래 테스트 코드를 추가합니다.
package com.hwanld.book.springboot.Controller;
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.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.status;
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void hello가_리턴된다() throws Exception {
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
}
@RunWith(SpringRunner.class)
: 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킵니다. 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 합니다.
@WebMvcTest
: 스프링 테스트에는 여러가지 애노테이션이 존재하는데, Web(Spring MVC)에 집중할 수 있는 에노테이션 입니다. @Controller, @ControllerAdvice 등을 사용할 수 있으나, @Service, @Component, @Repository 등은 사용할 수 없습니다.
@Autowired
: 스프링 빈을 주입받습니다.
private MockMvc mvc
: 웹 API를 테스트할 때 사용합니다. 이 클래스를 통해 HTTP GET, POST등에 대한 API를 테스트 할 수 있습니다.
mvc.perform(get("/hello"))
: MockMvc를 통해 /hello 주소로 HTTP GET 요청을 합니다. 체이닝이 지원되어 아래와 같이 여러 검증 기능을 이어서 선언할 수 있습니다.
.andExpect(status().isOk())
: mvc.perform의 결과를 검증합니다. HTTP Header의 Status를 검증합니다. isOk는 200인지 아닌지를 검증합니다.
.andExpect(content().string(hello))
: mvc.perform의 결과를 검증합니다. 응답 본문의 내용을 검증합니다.
'Spring' 카테고리의 다른 글
[Spring] API 생성하기(1) (0) | 2021.12.29 |
---|---|
[Spring] 프로젝트에 Spring Data JPA 적용하고 테스트 코드 작성하기 (0) | 2021.12.27 |
[Spring] DTO와 롬복 만들고 적용하기 (0) | 2021.12.26 |
[Spring] TDD, 테스트 케이스란? (0) | 2021.12.23 |
[Spring] Gradle 프로젝트를 SpringBoot 프로젝트로 변경하기 (0) | 2021.12.23 |