Application 생성
먼저 패키지랑 가장 기본이 될 java 파일 하나를 만들자.
com.spaws.book.springboot 패키지를 만들고 그 안에 Application.java라는 파일을 생성했다.
보통 패키지명은 웹 사이트 주소의 역순으로 정한다.
(ex: admin.spaws.com -> com.spaws.admin)
spaws는 책이 spring boot와 aws 어쩌구라서 지은거고 이름이 달라도 상관 없다.
Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 프로젝트의 메인 클래스
- @SpringBootApplication은 스프링 부트의 자동 설정, 스프링 Bean 읽기생성 자동으로 설정하므로 해당 클래스는 항상 프로젝트의 최상단에 위치해야 한다.
- SpringApplication.run()을 통해 내장 WAS 실행 -> 내장 WAS 존재로 인해 별도의 Tomcat 설치 필요 x
- 언제 어디서나 같은 환경에서 배포할 수 있기 때문에 스프링 부트는 내장 WAS 사용을 권장.
Controller 생성
앞으로의 Controller 관련 클래스를 담을 패키지를 생성한다. (com.spaws.book.springboot.web)
HelloController.java를 생성 후 다음 코드를 적는다.
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
@RestController
- JSON을 반환하는 컨트롤러
- 과거 @ResponseBody를 메소드마다 선언했던 것을 한 번만 선언할 수 있게 됨
@GetMapping
- HTTP 메소드 중 Get의 요청을 받을 수 있다.
- 과거: @RequestMapping(method=RequestMethod.GET)
ControllerTest 생성
위 컨트롤러는 src/main/java에 생성했었는데, 테스트 코드는 src/test/java에서 생성하자.
마찬가지로 com.spaws.book.springboot.web 패키지를 만들고 HelloControllerTest.java를 생성하자.
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mvc; // 스프링 MVC 테스트의 시작점. GET/POST에 대한 API 테스트
@Test
public void hello_리턴() throws Exception {
String hello = "hello";
mvc.perform(get("/hello")) // /hello 주소로 HTTP GET 요청
.andExpect(status().isOk())
.andExpect(content().string(hello)); // hello가 맞는지 검증
}
}
@RunWith(SpringRunner.class)
- 테스트 시, JUnit 외의 다른 실행자 실행
- Spring boot test와 JUnit 사이의 연결자 역할
@WebMvcTest
- Web(Spring MVC)에 집중할 수 있는 어노테이션
- @Controller, @ControllerAdvice, ... 사용 가능
- @Service, @Component, @Repository, ... 사용 불가
@Autowired
- 스프링이 관리하는 Bean 주입 받기
.andExpect(status().isOk())
- HTTP Header의 Status와 mvc.perform 결과 검증
(HTTP Header Status: 200, 400, 404, 500, ... )
- .isOk()는 200인지 아닌지를 검증
만약 get, status, content 메소드에 오류가 생긴다면 import를 먼저 확인해야 한다.
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;
Eclipse에서는 static import는 자동 인식을 못한다.
별도로 Favorites를 지정해서 사용할 수 있다는데 자세한 방법은 구글링 해볼 것.
롬복 전환하기
이제 위 코드를 롬복으로 전환할 것이다.
build.gradle의 dependencies에 다음 코드를 추가하고 빌드한다.
compile('org.projectlombok:lombok')
(Eclipse 롬복 최초 추가 후 설정: blog.naver.com/white_la/222177621109 )
com.spaws.book.springboot.web.dto에 HelloResponseDto.java를 생성했다.
@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
private final String name;
private final int amount;
}
@Getter
- get 메소드 생성
@RequiredArgsConstructor
- final 필드가 포함된 생성자 생성 (final 없는 필드는 제외)
위와 유사한 폴더 구조로 test에 HelloResponseDtoTest.java를 만들어주자
public class HelloReponseDtoTest {
@Test
public void 롬복_테스트() {
// given
String name = "test";
int amount = 1000;
// when
HelloResponseDto dto = new HelloResponseDto(name, amount);
// then
assertThat(dto.getName()).isEqualTo(name);
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
여기서 assertThat은 Junit이 아닌 assertj이다.
추가적인 라이브러리가 필요하지 않고 자동 완성 기능 이용에 편리해서 assertj를 더 자주 쓴다.
이제 HelloController에서 ReponseDto를 사용하는 메소드를 추가하자.
( Eclipse에서는 ctrl+shift+R을 누르면 파일명으로 파일을 찾을 수 있다. )
@GetMapping("/hello/dto")
public HelloResponseDto hello(@RequestParam("name") String name, @RequestParam("amount") int amount) {
return new HelloResponseDto(name,amount);
}
@RequestParam
- 외부에서 AIP로 넘긴 파라미터를 가져온다
- 외부에서 name이라는 이름으로 넘긴 파라미터를 String name에 저장,
외부에서 amount라는 이름으로 넘긴 파라미터를 int amount에 저장
HelloControllerTest도 수정해준다.
@RunWith(SpringRunner.class)
@WebMvcTest
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)) );
}
}
param
- API 테스트 시 요청될 파라미터 지정
- 값은 String만 허용
jsonPath
- JSON 응답값 필드별로 검증할 수 있는 메소드
- $ 기준으로 필드명 명시
마찬가지로 import 오류가 날 경우엔 아래 추가
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.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
HelloControllerTest를 실행 시키면 정상적으로 작동된다.
해당 게시글은 [ 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 / 이동욱 ] 책을 따라한 것을 정리하기 위한 게시글입니다. 요약, 생략한 부분이 많으니 보다 자세한 설명은 책 구매를 권장합니다.
'Clone Coding > 스프링 부트와 AWS' 카테고리의 다른 글
[Mustache] 화면 구성 (0) | 2021.01.18 |
---|---|
[JPA Auditing] 생성/수정시간 자동화 (0) | 2021.01.18 |
[Spring] 등록 API 만들기 (+h2 웹 콘솔 이용하기) (0) | 2021.01.15 |
[Spring] JPA로 database 다루기 (0) | 2021.01.11 |
[Spring] Gradle Project를 Spring boot로 변환하기 (0) | 2021.01.08 |