본문 바로가기

웹개발 풀스택 과정/Spring Legacy

36일차(2022.02.15) _ Servlet - Forward와 Redirect

1. 기본 개념

 

1. HTTP는 TCP(신뢰성 있는 연결)임
2. HTTP는 statless(연결유지를 하지 않음)임
 - 요청이 발생하고 응답이 오면 연결을 해제함
3. Spring에서 HTML(JSP로 만든 HTML)을 보려면 요청이 발생하고 Controller로 진입해야함
 - 웹 브라우저 화면을 보려면 요청이 꼭 필요함

 


2. Forward

 

- 지금까지 배웠던 Request & Response 의 진행과정과 동일함

- 요청이 발생해서 View(jsp)까지 이동하는 방식
- Request, Response 객체를 jsp까지 살려서 이동하는 방식
- RequestScope와 동일
- Web Browser의 주소창에 주소가 요청 당시의 주소가 남아있음
 --- 주소가 꼬여버림
 --- 특히 jsp 문서 상에 상대경로로 참조하고 있는 경우 제대로 참조하지를 못함 (아래 설참)

 

설명1. Forward 진행과정

 


3. Redirect

 

- 요청이 발생해서 응답으로 View(jsp)로 가는것이 아님
- DispatcherServlet에서 jsp로 가지 않고 바로 응답

- 순서
 1) jsp를 거치지 않고 오기때문에 HTML을 응답하지 않음
 2) 대신 Server에서 응답으로 다시 접속할 URL주소를 Client로 보냄
 3) Web Browser가 받은 URL주소를 해석해서 자동으로 그 주소로 다시 요청을 보냄

- 무한 Redirect가 걸리지 않게 설계해야 함

- Redirect 설계법
 1) Controller의 View의 경로명
  - Forward : jsp의 경로명
  - Redirect : "redirect : 다시접속할URL주소명"
  - URL은 상대경로로 작성하는 것을 권장  

- Web Browser에서 처음 요청한 주소가 남는게 아니라, 마지막 redirect 주소가 남아있음

 

설명1. Redirect 진행 과정

 

 


설명2. Forward, Redirect 의 차이점

 

	@RequestMapping(value = "dept/insert", method = RequestMethod.POST)
	public String insert(DepartmentDTO departmentDTO, Model model) throws Exception {

		int result = departmentDAO.insert(departmentDTO);
		System.out.println(result);
		
		return "redirect:./dept/list";
	}

 

	@RequestMapping(value = "dept/insert", method = RequestMethod.POST)
	public String insert(DepartmentDTO departmentDTO, Model model) throws Exception {

		int result = departmentDAO.insert(departmentDTO);
		System.out.println(result);
		
		return "/dept/list";
	}

 

이 두가지 방식의 차이점은 이제 POST방식으로 dept/insert 라는 URL주소가 왔을 때

위의 방식은 redirect방식으로 현재 폴더내의 list.jsp를 보여달라는 소리이고,

아래의 방식은 forward방식으로 현재 폴더내의 list.jsp를 보여달라는 소리이다.

근데, 두 가지방식을 실행시켜보면 하나는 

 

위에 코드은 웹브라우저 상의 주소창에 http://localhost/s1/dept/list 라고 표시된다.

하지만 아래코드는 웹브라우저 상의 주소창에 http://localhost/s1/dept/insert 라고 표시된다.

 

이는 당연한 결과인게 뭐냐면, redirect는 Response(응답)으로, URL을 준다고 했다.

즉, URL을 주니까 웹브라우저상의 실제 주소를 루트 밑의 dept/list로 바꿔버린다.

그리고 컨트롤러에 찾아가서 메서드와 매핑한다.

그러면 dept/list와 매핑되는 메서드를 찾아서 그 메서드의 리턴이 참조하는 jsp경로를 리턴해주게 된다.

이게 redirect이다.

 

근데, forward 방식은 애초에 응답으로 URL을 주는 것이 아니라, jsp를 주게 된다.

즉, dept/list를 리턴해주었다고 해도 이건, jsp 경로를 의미한다.

실제 웹서버에 저장된 dept밑의 list.jsp를 찾아가서 이 jsp 파일을 찾아서 웹브라우저에 표시해주게 되는데

그렇다면 당연히 URL은 요청 URL이 그대로 남아있게 된다.

요청 URL은 무엇이었는가? dept/insert였다.

그러니 웹브라우저의 주소창에는 그대로 http://localhost/s1/dept/insert가 남아있게 된다.

이게 문제가 되는것이 뭐냐면, 만약에 jsp 파일안에 참조주소같은 것이 상대경로로 적혀있다면

무조건 웹브라우저상의 URL주소를 기준으로 적용이 되는데,

CSS나 이미지파일 같은 것이 적용이 안될수가 있다는 점이다.

그러니까 예를 들어서, s1/dept/list 가 있고, s1/dept/insert/add가 있는데

내가 설계하기로는 dept의 위치에서 list.jsp를 접근하는 것을 설계해서

상대주소를 jsp파일에 설계를 해놓았는데,

이것을 forward타입으로 적어놓아서 나중에 보니까

insert라는 위치에서 list.jsp에 접근을 하게 되면, 위치가 틀어져버린다.

이러면 css파일이나, a태그 등의 주소 등이 참조가 안되게된다.

 

그래서 jsp를 불러와야 할 때는 forward 방식으로,

만약 다시 클라이언트에게 URL주소를 주어서

서버에게 다시 요청을 보내게 해야할 때는 redirect 방식으로 설계를 해주어야 한다.