forward, redirect 차이

bongf·2021년 3월 11일
3

Learned

목록 보기
3/3

1) return, forward, redirect 차이

1-1) return

  • return : 해당 html을 반환해주겠다는 의미
    • return은 뭐야. 그냥 모델과 뷰를 리턴해주는 것
    • ex.return "user"; 하면 컨트롤러가 모델에 데이터 담아서 view에게(user.html) 요청하는 것

1-2) redirect vs forward

  • 가장 설명 잘 되어 있던 곳
  • redirect :
    • a라는 요청을 주면 redirect b라는 결과값을 준다
    • 그러면 브라우저는 okay. 다시 b로 (GET)요청을 날린다 (그러면 어떤 c라는 결과를 받겠지)
    • 총 브라우저의 요청이 2번 일어난다.
  • forward :
    • a라는 요청을 보내면 스프링 내부에서 알아서 a->b->c로 가서 c라는 결과를 보내준다.
    • 브라우저는 총 1번의 요청만 한 것
  • 내가 생각하기에는 어쨌든 a->b->c 이렇게 가는데 redirect는 b를 받고 b라는 요청을 다시 보내는 것이고 forward는 브라우저한테 안주고 c로 바로 보낸다. 두번째 ->를 브라우저가 하느냐 스프링 내부에서 하느냐의 차이

1-3) redirect 보충설명

  • redirect는 HTTP 302에러 온 개념
    • 302의 의미 : 파일을 다른 곳으로 옮겼을 때. 너가 찾는 그거 아예 다른 곳으로 옮겼거든? 거기 주소로 보내라 하는 의미

1-4) forward 보충설명

  • 서블릿에서 나온 개념
  • foward "/user"; 서블릿 서버가 user 컨트롤러(해당 url 매핑된 메소드)를 호출한다. (브라우저가 재 요청하는 것이 아니라)
  • forward는 추가적으로 컨트롤러에서 다른 컨트롤러를 호출

1-5) 언제 무엇을 쓸까

  • forward를 쓰면 요청 정보가 그대로 유지 vs redirect는 요청 정보를 새로 전송한다.
    • POST요청을 보내는 경우 forward를 사용한다면 응답페이지에서 새로고침을 한다면 문제가 될 수 있다. 브라우저가 보낸 요청이 POST요청이고 서버에서 알아서 GET 응답페이지 해준 것이므로 새로고침을 하면 POST요청을 한 번 더 하게된다.
    • 따라서 POST요청(DELETE, PUT 같은 리소스이 변경이 있는) 요청을 할 때 redirect가 일반적
      • redirect는 새로고침을 한다고 해도 두번째 보낸 요청을 새로고침 한 것이기 때문에 ( redirect는 GET요청) 응답페이지 GET요청을 새로고침 한 것이라 OK
  • forward를 redirect보다 빠르다. redirect는 어쨌든 다시 요청을 보내야 하고 HTTP 리퀘스트를 다시 보내야 하니까. 출처
  • 아래의 1-6)의 상황의 경우 forward로 가능한데 forward가 빨라서 + 최종 url이 forward가 더 좋아서 ( == 이 redirect 되는 상황을 사용자가 몰라도 되서) 의 이유로 redirect가 아닌 forward를 사용했다.
  • 상황을 보고 리소스를 변경하는 요청인지의 여부, 사용자가 보내는 요청을 다른 쪽으로 요청을 보낸다는 것을 사용자가 알아야 할지 여부, 속도 등을 고려해 결정해야겠다.

1-5-1) foward 사용 비추

  • 수업과 팀리뷰 시간에 forward를 사용하지 말라는 말이 나왔다. 여긴 더 공부해 봐야겠다. (#todo)

1-6) 실습

1-6-1) 상황 (코드리뷰 적용)

  • 홈페이지에서 질문 목록들을 가져와야 한다.
  • 그래서 "/" 요청시 QuestionController에 있는 /qeustions GET매핑된 메소드로 보내려 한다.
  • 이 때는 redirect가 아닌 forward를 추천한다. forward로 보내면 최종 url이 "/"로 남게 되고 어쨌든 브라우저가 한 번만 요청을 하게 되니까 효율적이다
  • redirect와 forward했을 때의 차이
  • 1) redirect
@Controller
public class HomeController {
    @GetMapping("/")
    public String goHome() {
        return "redirect:/questions";
    }
}
    • 요청이 두번 날라간 것을 확인 할 수 있다. 1)localhost 2) questions
    • 최종 url이 /questions다. 브라우저가 처음 "/" 로 보냈다가 "/questions"로 다시 보낸 것
  • 2) forward

@Controller
public class HomeController {
    @GetMapping("/")
    public String goHome() {
        return "redirect:/forward";
    }
}
  • 차이
    • 요청이 한 번에 처리! 스프링 내부에서 알아서 보내준 결과
    • 최종 url이 / 다. 브라우저는 처음 /만 요청을 보냈다.

1-7) 읽을 자료

profile
spring, java학습

0개의 댓글