Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

Redirect 관련 본문

Spring/Spring MVC - 웹 개발 핵심 기술

Redirect 관련

studyHub 2023. 8. 26. 21:38

POST 요청을 통해 데이터를 등록하고, 새로고침하면 심각한 문제가 발생할 수 있다.

 


PRG : Post/Redirect/Get

POST로 데이터를 레파지토리에 저장 후, 응답이 다음과 같은 상황이다.

 

새로고침은 "마지막에 요청한 행위를 다시 하는 것"이다.

그래서 등록 요청을 반복하게된다.

 

따라서 '마지막에 요청한 행위'를 POST가 아닌 GET으로 바꿔줘야 하는 것이다.

이런 문제 해결 방식을 PRG (Post/Redirect/Get) 라 한다.

 

 

POST 요청을 리다리엑트로 응답받아 GET 요청을 하게 한다.

 

 

※ 주의
"redirect:/basic/items/" + item.getId() redirect에서 +item.getId() 처럼 URL에 변수를 더해서 사용하는 것은
URL 인코딩이 안되기 때문에 위험하다.(
다음에 설명하는 RedirectAttributes 를 사용하자.

※ URL 인코딩
웹 브라우저가 URL에 포함될 수 없는 문자나 특수 문자를 변환하여 인터넷에서 사용할 수 있게 만드는 방법.
이는 주로 HTTP 요청을 보낼 때, 사용자가 입력한 데이터를 URL에 포함시키는 과정에서 사용된다.
예를 들어, 공백 문자는 URL에서 직접 사용할 수 없으므로 URL 인코딩을 통해 %20이라는 코드로 변환된다.
이외에도 특수 문자인 ?, &, =, # 등은 각각 %3F, %26, %3D, %23 등으로 변환된다.
이러한 인코딩은 URL이 전송되는 과정에서 정확하게 해석될 수 있도록 돕고, 잘못된 해석이나 오류를 방지한다.

 

RedirectAttributes

신규 아이템 저장 시 상세화면으로 리다이렉트하였더니, 사용자 입장에서는 저장이 잘 되었는지 확신이 서지 않는다.

리다이렉트 시 파라미터를 추가하여 상세 화면에 "저장 완료"를 표시해보자.

 

RedirectAttributes 를 사용하면 URL 인코딩도 해주고, pathVariable, 쿼리 파라미터까지 처리해준다

실행해보면 다음과 같은 리다이렉트 결과가 나온다.

- http://localhost:8080/basic/items/3?status=true

 

redirect:/basic/items/{itemId}

  • pathVariable 바인딩: {itemId}     -> url 인코딩 처리
  • 나머지는 쿼리 파라미터로 처리: ?status=true

pathVariable 바인딩, 나머지는 쿼리 파라미터로 처리

 

addFlashAttribute 

리다이렉트 시, 일회성 데이터 저장할 때 사용.  주로 post 작업 완료 후 메시지 전달 시 사용한다.

새로운 요청을 보내도 데이터 유지 (단, 한 번만 사용 가능)

세션에 저장되지만, 요청이 끝나면 자동 삭제됨

@PostMapping("/settings/profile")
public String updateProfile(@CurrentUser Account account, @Valid Profile profile, Errors errors,
                            Model model, RedirectAttributes redirectAttributes) {
    
    redirectAttributes.addFlashAttribute("message", "프로필을 수정했습니다.");
    return "redirect:/settings/profile";
}

# 뷰 사용
<div th:if="${message}" class="alert alert-info alert-dismissible fade show mt-3" role="alert">
    <span th:text="${message}">메시지</span>
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span>
    </button>
</div>

 


 

참고 자료 & 이미지 출처
스프링 MVC 1편(김영한 님)

'Spring > Spring MVC - 웹 개발 핵심 기술' 카테고리의 다른 글

요약  (0) 2024.08.22
HTTP 메시지 컨버터  (0) 2023.08.22
스프링 MVC 기본 기능 - 응답  (0) 2023.08.22
스프링 MVC 기본 기능 - 요청  (0) 2023.05.07
Spring MVC 구조 이해  (0) 2023.05.01