[1주차] 스프링 부트 테스트 코드 작성, JPA로 데이터베이스 접근하기
1. 개요
01장 인텔리제이로 스프링 부트 시작하기
02장 스프링 부트에서 테스트 코드를 작성하자
03장 스프링 부트에서 JPA로 데이터베이스를 다뤄보자
2. 요약
@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)));
}
ControllerTest 작성 과정에서 andExpect함수에서 jsonPath를 이용해 생성된 Json의 필드 하나하나를 검증할 수 있음을 알게 되었다.
기존에는 아래처럼 return값을 get한 다음에 // then 부분에서 하나하나 assertThat에서 objectMapper의 기능을 이용해 원하는 객체를 JSON값으로 변형해 필드값을 하나하나 테스트 하였었는데, 이렇게 perform함수에서 바로 사용하는 것이 더 깔끔하다고 생각하였다.
추가로 JpaRespository를 사용해 PostRepository를 만들고, 이를 Test해보고자 하였는데, 이렇게 에러가 뜨면서 PostsRepository내부의 메서드들인 save, findAll 등을 사용할 수 없는 문제가 있었다.
Repository가 아니더라도 기타 의존성을 추가하는 부분에서도 같은 에러가 떴다.
data jpa 부분에서 라이브러리가 정상적으로 설치되지 않은 탓이라 생각하여, build.gradle을 아래와 같이 수정하여 재시작하니 오류가 해결될 수 있었다.
dependencies {
annotationProcessor(
'org.projectlombok:lombok',
)
implementation(
'org.springframework.boot:spring-boot-starter-web',
'org.springframework.boot:spring-boot-starter-data-jpa',
'org.springframework.boot:spring-boot-starter-thymeleaf'
)
testImplementation(
group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3',
'org.springframework.boot:spring-boot-starter-test',
)
compileOnly(
'org.projectlombok:lombok',
'com.h2database:h2'
)
}
+ Test 실행 중 Gradle 오류가 뜬다면 아래 경우를 의심해볼 것!
3. 느낀점
항상 start.spring.io에서 프로젝트를 파서 build.gradle를 직접 타이핑하는 경우는 없었다보니, 코딩하는 과정에서 라이브러리가 없어서 에러가 뜨는 경우가 많이 발생하였다. 위에서 언급한 것처럼 JpaRepository 의 내부 메소드들을 불러올 수 없는 경우도 마찬가지이다.
또한 H2 Database에 접근하는 테스트 코드를 실행할 때 ApplicationContext Error가 떴었다. 당장 오류를 수정해보진 못했지만, MySQL로 이동해 application.properties에서 스프링과 연동하는 작업을 통해 해결할 예정이다.