inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

RedirectAttributes

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

589

Ansix

작성한 질문수 2

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 여도 저장완료가 나오게 되는건지 궁금합니다.. 아니면 제가 어디선가 잘못 친건지 잘 모르겠습니다

spring mvc

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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로 인식됩니다.

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

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

servlet과 container에 대한 질문입니다

0

25

1

api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?

0

64

1

jsp 의존성 수정 요청

0

79

2

요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?

0

143

1

save() 메서드 문의

0

67

1

절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상

0

101

1

request-body-json

0

83

2

MVC 패턴의 적용 단위

0

97

1

RequestMapping을 이용한 핸들러, 어댑터

0

119

2

save 후 결과화면

0

89

2

jsp를 이용한 view

0

97

1

application.properties에 debug 추가해도 결과가 똑같습니다.

0

178

1

수업 코드 제공 관련 문의

0

97

2

RequestMappingHandlerAdapter의 Controller 호출 과정

0

100

3

파일 오픈 시

0

70

1

스프링 배치 관련

0

78

1

@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부

0

112

1

postman으로 /request-body-json-v1 호출시 500 error

0

95

1

프론트엔드와 백엔드의 mvc, rest api에 대한 질문

0

79

1

모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문

0

111

1

console log 출력 관련 질문입니다.

0

75

1

애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ

0

139

1

html 변경하는 부분 적용 문제

0

103

1

한글 깨짐

0

76

2