Redirect URL에 쿼리 파라미터가 생기는 경우
1. 진행 상황
테스트를 하던 중 위와 같이 오류가 나왔다.
테스트 코드와 컨트롤러는 다음과 같다.
<테스트 코드>
@Test
void 상품_등록_성공_테스트() throws Exception {
//given
MultiValueMap<String, String> params= new LinkedMultiValueMap<>();
params.add("name", "test");
params.add("author", "test");
params.add("publisher", "test");
params.add("category", "NOVEL");
params.add("price", "15000");
params.add("stockQuantity", "999");
//when
mvc.perform(post("/items/post")
.params(params))
//then
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/items/list"));
}
<컨트롤러>
public class ItemPostController implements ItemCategoryController{
// 중략
@PostMapping("/post")
public String save(@Valid @ModelAttribute("itemForm") ItemFormDto itemForm, BindingResult result) {
if (result.hasErrors()) {
log.info("ItemForm 검증 오류 : {}", result);
return "items/postItemForm";
}
itemService.saveItem(itemForm.toEntity());
return "redirect:/items/list";
}
public interface ItemCategoryController {
@ModelAttribute("itemCategories")
default ItemCategory[] itemCategories() {
return ItemCategory.values();
}
}
별 문제 없는데?(
삽질 시작
)
2. 원인
ItemPostController
에 로그를 찍어서 확인해봤는데
데이터를 제대로 전달이 되었다.
원인을 찾아보기 위해 코드를 지워보고 추가로 넣고 하면서 찾아봤는데, itemCategories=~
라고 나오는데 이게 쿼리 파라미터로 넘어가는 것 같았다. 하지만 카테고리 컨트롤러가 나중에 확장할 때 계속 쓰일 것 같아서 따로 수정을 하기 힘들었다. 그러다가 redirect
를 수정하는 방법을 이 글에서 보았다.
바로 아래와 같이 RedirectAttributes
를 추가하는 것이다.
@PostMapping("/post")
public String save(@Valid @ModelAttribute("itemForm") ItemFormDto itemForm, BindingResult result, RedirectAttributes redirectAttributes)
그러면 테스트 결과는 성공으로 나온다.
※ 참고
'개발 > [오류]' 카테고리의 다른 글
Interceptor에서 JWT를 사용할 때 주의점 (1) | 2024.02.07 |
---|---|
CORS와 스프링에서의 해결법 (0) | 2023.05.28 |
Embedded Type Test 문제와 H2 GenerationType 문제 (0) | 2022.04.12 |
ModelAttribute 관련 오류 (0) | 2022.03.23 |
테스트 데이터 격리 (0) | 2022.03.18 |