redirect의 쓰임

byeol·2023년 3월 9일
0

redirect는 뷰 템플릿을 호출하는 것이 아니라 URL 화면을 호출한다.
뷰템플릿을 호출하는 것과 URL 화면을 호출한다는 것이 같은 말처럼 들린다.

하지만 차이가 있다.
뷰템플릿을 호출한다는 것은 서버에 있는 데이터를 렌더링하는 과정을 진행한다는 것이다.

@Controller
@RequestMapping("/basic/items")
@RequiredArgsConstructor 
public class BasicItemController {
 @PostMapping("/add")
    public String addItemV4(Item item,
                            Model model){
        itemRepository.save(item);
        //model.addAttribute("item",item);
        return "basic/items"; // 뷰템플릿 호출

    }

현재 localhost:8080/basic/items/add라고 가정하고 새로고침을 하면 렌더링 작업이 중복되어 일어난다.
따라서 아이디는 다르나 값이 같은 데이터가 2개가 생성되는 것이다.

따라서 이럴 때는 새로고침을 해도 렌더링 작업이 다시 일어나지 않도록 바로 URL을 호출하는 redirect를 사용해야 한다.

 @PostMapping("/add")
    public String addItemV4(Item item,
                            Model model){
        itemRepository.save(item);
        //model.addAttribute("item",item);
        return "redirect:/basic/items/"+item.getId();

    }

하지만 여기서도 문제가 있는데 return "redirect:/basic/items/"+item.getId();
바로 저 굵은 글씨로 표시한 부분이다. 저렇게 변수를 바로 넣어서 사용하면 URL인코딩 문제가 발생할 것이다. 만약에 저 변수가 숫자면 상관없을지도 모르겠다. 하지만 한글이라면 글자가 깨져서 문제가 발생할거 같다.

따라서 저렇게 바로 변수를 사용하는 것이 아니라 RedirectAttributes를 사용하도록 하자.

RedirectAttributes는
URL인코딩, 쿼리 파라미터, pathVariable에 대한 처리를 해준다.

@PostMapping("/add")
    public String addItemV4(Item item,
                            RedirectAttributes redirectAttributes){
        Item savedItem = itemRepository.save(item);
        //model.addAttribute("item",item);
        redirectAttributes.addAttribute("itemId",savedItem.getId());
        redirectAttributes.addAttribute("status",true);
        return "redirect:/basic/items/{itemId}";

    }

http://localhost:8080/basic/items/3?status=true 이와 같은 리다이렉트 결과가 나온다.

profile
꾸준하게 Ready, Set, Go!

0개의 댓글