스터디를 통해 스프링부트와 AWS로 혼자 구현하는 웹 서비스(저자 이동욱) 서적을 공부하는 중입니다.
공부/실습한 내용을 정리한 포스팅입니다.
책에 모르는 부분이 있으면 구글링하거나 챗gpt에 물어봐서 보충하였습니다.
(아직 초보라 모르는 부분이 많아 이것저것 다 적었습니다.)
참고한 사이트 출처는 포스팅 맨 하단에 적었습니다.
개발자라면 반드시 익혀야 할 기술이자 습관
package com.webservice.springboot.springboot_board;
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);
}
}
web
이라는 패키지 생성web
패키지에 생성)web
패키지에 HelloController
class 생성package com.webservice.springboot.springboot_board.web;
import com.webservice.springboot.springboot_board.web.dto.HelloResponseDto;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amonut){
return new HelloResponseDto(name,amonut);
}
}
@SpringBootApplication
@SpringBootApplication
이 있는 위치부터 설정을 읽어가기 때문에 이 클래스는 항상 프로젝트의 최상단 위치에 있어야 함.main
메서드의 SpringApplication.run
RestController
@Controller
에 @ResponseBody
를 각 메소드마다 선언했던 것을 한 번에 사용 가능하게 해준다고 생각하면 됨.@GetMapping
@RequestMapping(method = RequestMethod.GET)
으로 사용 됨.HelloController
테스트 코드로 검증web
패키지 안에 HelloControllerTest
class 생성package com.webservice.springboot.springboot_board;
import com.webservice.springboot.springboot_board.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.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.*;
@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));
}
@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)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name",is(name)))
.andExpect(jsonPath("$.amount",is(amount)));
}
}
@RunWith(SpringRunner.class)
@RunWith(SpringRunner.class)
와 @SpringBootTest
를 통해 테스트 실행. → @RunWith(SpringRunner.class)은 JUnit 테스트를 Spring과 통합하여 실행할 수 있도록 해줌. JUnit 테스트가 SpringRunner를 사용하여 Spring과 연동되어 실행.@RunWith(SpringRunner.class)
자체로는 애플리케이션 컨텍스트를 로드하지는 않음.(@RunWith(SpringRunner.class)
가 @SpringBootApplication
이 지정된 클래스를 실행하여 Spring Container를 활용할 수 있게 되지만, 이것만으로는 테스트에서 활용하기는 어려움. 테스트 환경에서는 Application Context 로드X)@SpringBootTest
은 Spring Boot Application Context를 로드하여 테스트에 필요한 Bean들과 설정 정보를 사용할 수 있도록 해줌.@SpringBootTest
를 사용하면 application context를 전부 로딩해서 자칫 잘못하면 무거운 프로젝트가 되어버림. 특정 테스트 케이스에서 모든 Application Context를 로드할 필요가 없는 경우, JUnit4에서 지원하는 @RunWith(SpringRunner.class)
를 사용하면서 @SpringBootTest
대신에@WebMvcTest
와 같은 어노테이션을 사용하여 더 가볍게 Context 로드가 가능. @WebMvcTest
의 경우, 웹 계층에 집중하여 필요한 Bean들만 로드하여 더 빠르게 테스트 실행 가능.※ 상세 설명
※ 꼭 알아야 할 참고사항
@WebMvcTest
@SpringBootTest
의 경우, 모든 Bean을 로드하기 때문에 테스트 구동시간이 오래 걸리므로, Controller만 테스트 시 @WebMvcTest
사용.@Autowired
MockMvc
mvc.perform(get("/hello")
.andExpect(status().isOk())
mvc.perform
결과 검증(HTTP Header의 상태 코드 검증).andExpect(content().string(hello))
mvc.perform
결과 검증(응답 본문 내용 검증)★ 작성 중 Spring 모르는 개념은 블로그 포스팅으로 따로 정리
Spring 관련 개념 정리(Spring Boot, MVC 패턴, IoC, DI, Application Context, Bean, BeanFactory, REST API)
스프링부트와 AWS로 혼자 구현하는 웹 서비스(저자 이동욱)
Production Code & Test Code & JUnit
[Spring] Restful한 스프링 @ResponseBody vs @RestController
@RunWith(SpringRunner.class)이란?
@RunWith(SpringRunner.class)
[Spring Boot] Controller 단위 테스트 (@WebMvcTest, MockMvc)