TIL 20220301 TUE

sally·2022년 3월 1일
0

TIL

목록 보기
3/6

PRG 패턴

Post/Redirect/Get

  • form이 전송되어 다시 로드되거나 공유, 북마크 될 때 원치 않는 결과를 막기 위해 화면 페이지를 보여주는 디자인 패턴

  • ☠️ 원치 않는 결과란?

    • HTTP POST 요청을 통해 웹의 from이 전송될 때, 브라우저의 새로고침으로 인해 원본 POST의 내용이 재 전송 될 수 있고, 원치 않는 결과를 가져올 수 있다.
      • 결제를 마친 사용자가 주문 요청을 보낼 때 새로고침으로 1건의 결제내역으로 2건의 중복 주문 요청 가능성 등
  • PRG pattern

    • POST 요청시, 서버의 응답은 POST의 content로 응답하는 대신, client를 다른 location으로 가도록 지시한다.
    • HTTP 1.1 명세에는 HTTP 303("See other")를 응답코드로 하여, 초기 POST 요청이 재전송을 유발하지 않도록 브라우저에서 새로고침시 보다 안전하게 서버가 응답하게 한다.
    • 하지만 PRG 패턴이 중복된 form 전송의 모든 시나리오를 커버할 수 없다.

HTTP 303 Status code

  • 리다이렉트할 때
    • 메서드 변경이 되지 않는 307 Temporary Redirect 을 대신 사용하고
    • GET 또는 HEAD 요청에 대한 응답으로는 302 코드를 설정하는 것이 권장된다.
  • 메서드가 GET 으로 변경되도록 하고 싶은 경우에는
    • 303 See Other (en-US) 를 대신 사용하라.
      이 응답 코드는 PUT 을 통해 리소스를 업로드하고 나서 업로드된 리소스 대신 '성공적으로 XYZ'를 업로드했습니다' 와 같은 메시지를 보여주는 응답을 할 때 유용하다.

사용자 회원가입시 Controller 코드

    @PostMapping()
    public String signUp(UserDto userDto) {
        logger.info("user sign up {}",userDto);
        userService.register(userDto);
        return "redirect:/users";
    }

    @GetMapping()
    public String list(Model model) {
        logger.info("users list");
        model.addAttribute("users",userService.findUsers());
        return "/user/list";
    }
  • 사용자가 회원가입 버튼 클릭으로 <form> action

    <form name="question" method="post" action="/user/register">




profile
sally의 법칙을 따르는 bug Duck

0개의 댓글