인프런 커뮤니티 질문&답변

Ansix님의 프로필 이미지
Ansix

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

RedirectAttributes

th:if ${param.status} / 뷰 템플릿 메시지 추가 부분 질문

작성

·

525

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

 

(컨트롤러)

@PostMapping("/add")
public String addItemV6(Item item, RedirectAttributes redirectAttributes){
    Item savedItem = itemRepository.save(item);
    redirectAttributes.addAttribute("itemId",savedItem.getId());
    redirectAttributes.addAttribute("status", true);

    //PRG (Post / Redirect / Get) 으로 문제를 해결
    return "redirect:/basic/items/{itemId}";
}

 

(html 타임리프 부분)
<h2 th:if="${param.status}==true" th:text="'저장 완료!'"></h2> <h2 th:if="${#bools.isTrue(param.status)}" th:text="'저장 완료2!'"></h2>

 

(요청 URL)

http://localhost:8080/basic/items/1?status

http://localhost:8080/basic/items/1?status=true

수업에 보면

redirectAttribute에서 파라미터를 설정해줘서 status=true가 쿼리 스트링으로 넘어가는걸 확인했습니다.

여기에서 실험정신이 들어서 status=true3 이라던가, status=false로 직접 url을 입력해서 요청했는데 제가 생각하는 bool true 가 아닌데도 true 처리가 되어서

저장완료와 저장완료2 라는 문구가 나오게 됩니다.

타임리프에서는 어떻게 처리가 되길래 쿼리스트링이 false 여도 저장완료가 나오게 되는건지 궁금합니다.. 아니면 제가 어디선가 잘못 친건지 잘 모르겠습니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

질문 내용에 따르면, status 파라미터의 값에 따라 저장 완료 메시지를 다르게 출력하는 것 같습니다.

우선 th:if=“${param.status}==true” 를 사용하셨는데, 이는 status 파라미터의 값이 true 일 때에만 해당 제목을 출력합니다.

또 다른 방법으로는 th:if=“${#bools.isTrue(param.status)}” 를 사용하셨습니다. 이는 Spring Expression Language (SpEL)을 사용하여, param.status 값이 true 일 때에만 해당 제목을 출력합니다.

그러나 여러분이 실험을 해보셨을 때, status=true가 아닌데도 true로 인식되어 메시지가 출력되었다고 합니다.

이 문제는 쿼리 스트링의 파라미터 값들은 모두 문자열로 전달되기 때문입니다. 따라서 “true” 대신에 “false”를 입력하셔도 true로 인식되어 제목이 출력되는 것입니다.

이를 수정하기 위해서는, 값의 타입을 체크하여 처리해야 합니다.
가장 간단한 방법은 status 파라미터를 boolean 타입으로 변환하는 것입니다.

컨트롤러에서 @ModelAttribute를 사용하여 status 파라미터를 boolean 타입으로 변환하도록 설정할 수 있습니다.

예를 들어, 다음과 같이 컨트롤러 메서드에 @ModelAttribute(“status”)를 추가해보세요.

@PostMapping("/add")
public String addItemV6(Item item, @ModelAttribute("status") boolean status, RedirectAttributes redirectAttributes){
    Item savedItem = itemRepository.save(item);
    redirectAttributes.addAttribute("itemId",savedItem.getId());
    redirectAttributes.addAttribute("status", status);

    //PRG (Post / Redirect / Get) 으로 문제를 해결
    return "redirect:/basic/items/{itemId}";
}

이렇게 하면 status 파라미터가 자동으로 boolean 타입으로 변환되어 사용됩니다. 그래서 “true” 와 “false” 문자열이 각각 true와 false로 인식됩니다.

이렇게 수정하시면 원하시는 결과를 얻을 수 있을 것입니다.

추가로 질문이 있으시면 언제든지 말씀해주세요. 감사합니다!

Ansix님의 프로필 이미지
Ansix

작성한 질문수

질문하기