우리 프로젝트는 프론트엔드에서 HTML이 아닌 리액트를 사용하기 때문에 데이터를 Json 형식으로 보내주어야 한다. 그래서 Controller에서 Json을 보내고, 테스트를 했다.
[ Controller에서 Json 보내기 ]
먼저 Http 통신을 할 때엔 클라이언트에서 Request를 보내면 요청에 따라 서버에서 Response를 보내는 형식이다. 그래서 우리는 데이터를 Response에 담아서 보내주어야 한다.
그래서 메서드 반환 타입을 ResponseEntity로 바꿔준다. ResponseEntity는 Response를 보낼 때, 바디에 담긴 Entity를 Json으로 자동 변환해주는 함수이다. ResponseEntity에는 HttpStatus와 body( 전달 값 ) 만 파라미터로 해서 반환하면 된다.
@PostMapping("/user/register") // 회원가입 기능
public ResponseEntity register(
@ModelAttribute UserForm form) {
// 생략 ..
User user = User.builder()
.name(form.getName())
.loginId(form.getLoginId())
.loginPw(userService.encryption(form.getLoginPw()))
.schoolCategory(schoolCategory)
.regDate(LocalDateTime.now())
.build();
userService.register(user);
User responseUser = userService.findOne(user.getId());
return ResponseEntity.status(HttpStatus.OK).body(responseUser);
}
[ Controller Test ]
Controller Test는 MockMvc를 사용한다. MockMvc는 웹 어플리케이션을 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청, 전송, 응답을 제공해주는 클래스라고 한다. 쉽게 말하면 서버에 적용되지 않는 테스트 환경을 만들어준다는 이야기다.
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@Transactional
Class 단위에 @AutoConfigureMockMvc 어노테이션을 달아준다. 이 어노테이션은 Service나 Repository를 사용하는 테스트를 작성할 때 사용하는 어노테이션이다. 기존 MockMvc 어노테이션의 Service나 Repository를 사용하지 못한다는 단점을 보완한 어노테이션이다.
@Autowired
private MockMvc mvc;
MockMvc를 @Autowired를 사용해 DI(의존성주입)을 해준다.
Controller에서 파라미터를 ModelAttribute, 즉 Dto로 받고 있기 때문에 Map으로 묶어서 보내주어야 한다. 그래서 params의 자료 타입이 MultiValueMap이기 때문에 맞춰서 작성해준 후 데이터를 집어 넣는다.
@Test
public void register() throws Exception {
// given
String loginId = "test";
String loginPw = "test";
String name = "test";
Boolean rank = false;
MultiValueMap<String, String> query_param = new LinkedMultiValueMap<>();
query_param.add("loginId",loginId);
query_param.add("loginPw",loginPw);
query_param.add("name", name);
query_param.add("rank", String.valueOf(rank));
mvc.perform(post("/api/user/register")
.contentType(MediaType.APPLICATION_JSON)
.params(query_param))
.andExpect(status().isOk())
.andExpect(jsonPath("$.loginId").value(loginId))
.andExpect(jsonPath("$.loginPw").value(userService.encryption(loginPw)))
.andExpect(jsonPath("$.name").value(name))
.andExpect(jsonPath("$.schoolCategory").value("STUDENT"));
}
mvc.perform(post("/api/user/login")
.contentType(MediaType.APPLICATION_JSON)
.param("loginId", loginId)
.param("loginPw", loginPw))
mvc.perform 함수를 통해 데이터를 전송한다. 첫번째 파라미터로는 Http메서드와 URL을 입력해주고, contentType으로는 MediaType을 이용해 JSON으로 데이터를 보내준다는 것을 스프링에게 이야기해준다. 그 후 params나 param을 이용해 데이터를 보내준다.
.andExpect(status().isOk())
.andExpect(jsonPath("$.loginId").value(loginId))
.andExpect(jsonPath("$.loginPw").value(userService.encryption(loginPw)))
.andExpect(jsonPath("$.name").value(name))
.andExpect(jsonPath("$.schoolCategory").value("STUDENT"));
데이터 전송 후에 andExpect로 올바른 데이터가 왔는지 확인한다. status()로 HttpStatus를 전달받고, 어떤 에러코드인지 확인한다. OK일 경우에는 200을 반환한다.
jsonpath를 이용해 키값을 불러서 반환된 value값을 비교하는 과정이다. json의 키값을 $.[key name] 형식으로 작성해주어야 한다. 그 외로 Body로 전달 받은 텍스르를 확인할 경우에는
.andExpect(content().string("로그인 상태가 아닙니다"));
content()를 이용해 데이터를 받고, .string으로 비교해준다.
'개발일지_development diary > YSit' 카테고리의 다른 글
YSit [18] - 서버 to 서버 통신하기 (0) | 2023.01.23 |
---|---|
YSit [17] - ID값을 숫자가 아닌 UUID로 바꿔주기 (0) | 2023.01.12 |
YSit [15] - 우분투에서 Spring (Gradle) 연동하기 & Access denied 오류 해결 (0) | 2023.01.06 |
YSit [14] - 관리자 페이지 구현 & 권한 구현하기 (0) | 2022.12.31 |
YSit [13] - 댓글 기능 구현하기 (2) | 2022.12.30 |