[HTTP] Why, How - 리다이렉트(Redirect) 이해하고 쓰기.

하쮸·2025년 2월 3일

Error, Why, What, How

목록 보기
15/68

리다이렉트(Redirect)를 언제 사용하고 왜 사용하는 지에 대해 정리한 글.

1. 리다이렉트(Redirect)

  • 클라이언트가 보낸 요청을 끝마친 후 계속해서 처리할 다음 요청 주소를 재지시하는 것.
    • 서버에서 결과 페이지를 응답하지 않고 재요청하라는 회신을 보내는 것.
    • 분리된 기능을 하나의 연속적인 흐름으로 연결할 수 있음.
  • 리다이렉트(재요청)를 지시 받은 클라이언트는 해당 주소로 다시 요청을 보내고 서버는 이에 대한 결과를 응답함.

2. 간단한 예시.

↓ 전체 회원 List를 보여주는 메서드.

    @GetMapping("/member")
    public String findAll(Model model) {
        List<MemberDTO> memberDTOList = memberService.findAll();
        model.addAttribute("memberList", memberDTOList);
        return "list";
    }
  • 매개변수로 Model객체를 받아와서 model.addAttribute()메서드를 통해 memberDTOList를 "memberList"라는 이름으로 추가함.
    • 이러면 list.html에서 memberDTOList를 "memberList"라는 이름으로 memberDTOList에 담겨있던 데이터를 사용할 수 있음.
  • 관리자 페이지에 회원가입 되어있는 전체 유저를 조회할 수 있는 List 페이지에서 회원을 강제로 탈퇴 시켰을 경우 다시 전체 유저를 볼 수 있는 List 페이지로 리다이렉트.

↓ 회원을 탈퇴시키는 메서드.

    @GetMapping("/member/delete/{id}")
    public String deleteById(@PathVariable("id") Long id) {
        memberService.deleteById(id);
        return "?";
    }
  • ? 에는 뭐가 들어가야할까??
    • 회원을 탈퇴시킨 후 다시 List페이지로 가야하니깐 return "list";로 작성해서 전체 유저를 조회할 수 있는 List 페이지를 반환하는 게 맞을까??

  • 실제 실행해보면 위와 같이 뷰템플릿 껍데기만 출력됨.

list.html

<body>
<h2>list.html</h2>
<table>
    <tr>
        <th>id</th>
        <th>memberEmail</th>
        <th>memberName</th>
        <th>memberPassword</th>
        <th>상세조회</th>
        <th>삭제</th>
    </tr>
    <tr th:each="member : ${memberList}">
        <td th:text="${member.id}"></td>
        <td th:text="${member.memberEmail}"></td>
        <td th:text="${member.memberName}"></td>
        <td th:text="${member.memberPassword}"></td>
        <td>
            <a th:href="@{|/member/${member.id}|}">조회</a>
        </td>
        <td>
            <a th:href="@{|/member/delete/${member.id}|}">삭제</a>
        </td>
    </tr>
</table>
</body>
  • list.html은 위와 같이 작성되어 있음.

    • 서버에서 넘겨준 memberList객체를 반복문을 통해 member로 넘겨주고 이 변수(즉 member)에 들어있는 값을 빼내면서 데이터를 출력하는 형식.
  • 즉, 서버에서 데이터를 넘겨받아서 그 데이터를 통해 동적으로 페이지를 출력해야하는데 데이터 없이 뷰페이지만 반환해서 저런 오류가 발생함.

  • 이럴 때 활용하는 것이 리다이렉트(Redirect).
    다시 메서드를 보자.

	// 전체 회원 List
	@GetMapping("/member")
    public String findAll(Model model) {
        List<MemberDTO> memberDTOList = memberService.findAll();
        model.addAttribute("memberList", memberDTOList);
        return "list";
    }

	// 강제 탈퇴 
    @GetMapping("/member/delete/{id}")
    public String deleteById(@PathVariable("id") Long id) {
        memberService.deleteById(id);
        return "redirect:/member";
    }
  1. 관리자가 탈퇴버튼 클릭시 /member/delete/{member.id}으로 요청.
  2. 서버에서 @GetMapping("/member/delete/{id}")으로 요청을 받아서 deleteById()메서드 실행.
    return "redirect:/member 리다이렉트 요청.
  3. 요청을 받은 클라이언트는 /member로 요청.
  4. 서버에서 @GetMapping("/member")으로 요청을 받고 findAll()메서드 실행.
    DB에서 가져온 회원List"memberList"으로 model에 담아서 list.html을 반환.
  5. model에 "memberList"이름으로 담겨져있는 회원List를 통해 list.html을 동적으로 출력.
  • 리다이렉트시 수행과정이며, 리다이렉트를 통해 로직을 정상적으로 수행할 수 있음.
profile
Every cloud has a silver lining.

0개의 댓글