작성
·
48
0
이제까지 'url에 @RequestMapping과 @GetMapping로 조합된 주소를 입력하면 return값에 있는 html을 보여준다' 와 같이 이해하였습니다.
@RequestMapping("/basic/items")
@GetMapping("/{itemId}/edit")
public String 메서드명(){
코드 실행
return "basic/editForm";}
url에 "/basic/items/1/edit"을 입력하여 상품수정 페이지를 호출하면 templates/basic/editForm.html와 같이 <해당 경로에 있는 html 파일>화면을 뿌려준다(렌더링한다?) 와 같이요.
그런데 이번에 리다이렉트를 보면
return "redirect:basic/items/{itemId}";
<해당 경로에 있는 html 파일>을 뿌려주는것이 아니라 해당 url을 입력한 것처럼 해서
@GetMapping("/{itemId}")
public String item(@PathVariable long itemId, Model model) {
Item item = itemRepository.findById(itemId);
model.addAttribute("item", item);
return "basic/item";
}
이 코드가 실행되는것으로 보입니다.
1.우선 제가 올바르게 이해하고 있는것이 맞는지 궁금합니다.
2.return값에 redirect가 붙으면 html 파일의 절대경로가 아니라 url로 인식을 해서 매핑을 알아서 해주는지 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 전해용님 질문에 대한 답변을 드리겠습니다.
질문하신 내용에서 핵심은 스프링 MVC에서의 return
과 return "redirect:"
의 차이점에 대한 이해로 보입니다. 이를 정리하면 다음과 같습니다:
일반 Return 값:
return "basic/editForm";
와 같은 형태는 스프링 MVC의 View Resolver에 의해 basic/editForm.html
과 같은 템플릿 파일을 찾아 렌더링하도록 지시합니다. 즉, 클라이언트에게 해당 HTML 페이지가 직접 응답으로 전달됩니다.Redirect Return 값:
return "redirect:basic/items/{itemId}";
는 실제로 클라이언트에게 새로운 URL로 이동하도록 지시하는 것입니다. 따라서 이 경우 클라이언트는 다시 서버쪽으로 HTTP GET 요청을 보내게 됩니다. 이 때 사용된 경로는 상대경로이며 이는 현재 요청의 Context Path를 기준으로 해석됩니다.리다이렉트 후 제어 흐름:
redirect:/basic/items/{itemId}
로 리다이렉트하면 /basic/items/1
과 같은 URL이 호출됩니다. 이는 원래의 모델 객체나 데이터는 리다이렉트 후 손실되는 특성이 있으며 새로 요청된 URL에 대응하는 컨트롤러 로직이 새롭게 실행됩니다.따라서 질문에서 이해하신 방식이 맞습니다. 리다이렉트는 서버 측에서 클라이언트에게 새로운 URL을 요청하도록 안내하여 매핑된 Controller 메서드가 실행되는 것입니다.
유사한 질문 사례로 다음을 참고하실 수 있습니다:
이 예시들을 통해 리다이렉트가 어떻게 동작하는지 더 깊이 이해하실 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.