• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Spring MVC Redirect, PRG
        2022년 05월 06일
        • starryeye
        • 작성자
        • 2022.05.06.:11
        반응형

        Redirect

        클라이언트가 서버로 어떤 요청(A)을 보냈을 경우,

        서버가 특정 로직의 결과로 B로 다시 요청을 보내라고 지시하는 것을 의미 한다.

        (서버 : 클라이언트야 URL 바꿔라!)

         

        PRG 방식

        Post / Redirect / Get 을 의미 한다.

        웹 클라이언트(브라우저)에서 서버로 상품을 등록하는 기능을 예시로 들겠다. 

        (등록 하면, 상품의 상세 뷰가 보인다.)

         

        <로직>

        클라이언트가 Post 메서드 방식으로 서버로 요청을 보내며 상품 등록을 한다.

        -> 상품 등록(저장) 컨트롤러가 호출된다.

        -> 컨트롤러에서 상품이 실제 DB에 저장이된다.

        -> 상품 상세 뷰를 클라이언트에게 보여준다.

         

        <문제점>

        클라이언트에서 정상적으로 상품 등록을 마치고 상품 상세 뷰 화면에서 새로고침을 한다.

        -> 상품이 중복되어 또 등록된다. (상품 등록 컨트롤러가 재 호출됨)

         

        <이유>

        웹 클라이언트에서는 상품 등록 컨트롤러가 호출되는 순간부터 상품 상세 뷰가 나올때 까지,

        URL이 변경되지 않았다.

        (웹 브라우저에서는 마지막 요청 URL(상품 저장 URL)이 남는다.)

        (새로고침은 마지막으로 했던 요청을 다시 하는 것이다.)

         

        <해결>

        PRG 방식 도입

        상품 등록 컨트롤러에서 상품 상세 뷰를 리턴할 때, 리다이렉트를 사용한다.

        리다이렉트로 상품 상세 뷰를 GET 하는 URL을 적용한다.

        -> 새로고침을 해도 상품 상세 뷰를 GET하는 요청이 다시 수행된다.

         

         

        RedirectAttributes

        리다이렉트 시, 여러 속성을 넣을 수 있는 객체이다.

        컨트롤러에 파라미터로 RedirectAttributes 객체를 받는다.

        addAttribute로 Model 객체처럼 사용한다. (key, value)

        return 에 "redirect:/ ~~ " 로 사용된다.

        RedirectAttributes 객체에 넣은 key가 return에 존재한다면 그 자리에 그대로 들어간다.

        (경로 변수로 바인딩 된다.)

        만약 위 예시의 status 처럼 없다면, 쿼리파라미터 형식으로 들어간다.

        (위 예시 결과, http://localhost:8080/basic/items/3?status=true)

         

        <주의>

        return "redirect:/basic/items/" + item.getId() 처럼 사용한다면..

        -> 여기서는 id가 int 라 상관 없지만, 문자가 들어가거나 하면 URL 인코딩이 안되기 때문에 위험하다.

        -> 하지만, RedirectAttributes를 사용하면 이러한 문제가 해결된다.

         

         

        <타임리프>

        RedirectAttributes 예시에서 쿼리파라미터로 status, true를 넘겼다.

        타임리프에서는 Http 요청 URL 쿼리 파라미터를 워낙 많이 쓰기 때문에 위 예시 처럼 지원이 된다.

        (model에 따로 넣지 않아도 param key로 받을 수 있다.)

        th:if=${param.status} th:text="~~"

        -> 쿼리파라미터에 status 키가 존재하고 해당 value가 true 이면 th:text 출력하겠다.

        반응형

        'Spring > MVC' 카테고리의 다른 글

        Spring MVC 마스터하기 Validation 2  (0) 2022.05.08
        Spring MVC 마스터하기 Validation 1  (0) 2022.05.08
        Spring MVC 마스터하기 4  (0) 2022.04.24
        Spring MVC 마스터하기 3 (응답 부분)  (0) 2022.04.22
        Spring MVC 마스터하기 2 (요청 부분)  (0) 2022.04.19
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바