Hayden's Archive

[Servlet/HTML] Get 방식과 Post 방식 본문

Study/Java & Kotlin

[Servlet/HTML] Get 방식과 Post 방식

_hayden 2020. 6. 9. 19:22

- form 태그 method 속성으로 Get 방식과 Post 방식을 정해줄 수 있다. 디폴트는 Get 방식이다.

<form action="FS" method="post"></form>

 

- 클라이언트에서 데이터 쪼가리 날리면서 요청한다.

  • get 방식이면 데이터 쪼가리를 주소에 입력폼 key, value으로 붙이고 / post 방식이면 ServletRequest에 입력폼 key, value을 담음.


1. Get 방식

- Get 방식. get it (페이지 줘.)

- 데이터 전달이 목적이 아니라 페이지 연결이 주목적. <a> 태그가 Get 방식임.

- 응답받은 페이지 주소 보면

http://localhost:8888/web02_HTTServletForm/FS?userId=111&userPass=222&menu=김치볶음밥&menu=닭도리탕

- 객체에 안 담기고 주소창에 붙인 걸 보면 FS? 뒤에 나와있는 건 폼 이름=값이 나옴.

- 알 수 있는 점 :  Get 방식은 Data Pack 과정 없이 서버로 간다.(ServletRequest 객체가 안 필요함) 서버로 갈 때는 도시락통에 안 담아서 가기 때문에 한글처리 안 해줘도 상관 없음. 많은 양의 데이터를 처리하는 목적이 아니기 때문에 도시락통에 안 담고 주소창에 붙여서 보냄. 클라이언트로 올 때는 한글처리 안 해주면 깨짐.

- get 방식은, ServletRequest는 만들어지는데 body에 데이터 안 담김. get 방식일 때 한글처리를 위한 설정은 WAS에서 한다. server.xml 파일 열어서...

 

소스를 보면 utf-8을 통해 한글처리 되어 있음.

<Connector URLEncoding="utf-8" connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443"/>

 

- get 방식의 문제 ① 보안상의 문제   ② 주소 길이의 제약

 


2. Post 방식

- Post 방식으로 하면 주소창으로 안 가고 Data Pack 과정으로 서버에 가므로(도시락통에 담겨서 간다...) 서버로 갈 때도 반드시 한글처리 해줘야 함.

- Post 방식은 단순한 페이지 연결이 목적 아님. 데이터 전달이 주목적. 데이터 전달량이 꽤 많음. 데이터 전달할 거니까 서버가 이 데이터를 받아서 처리해서 보내줘! 그래서 한글처리가 request() 메소드에 먹는 것.

- Object일 경우 get방식 아니라 post방식으로 전달해야 함.

 


- 현업에서 근무할 때는 상용적으로 이미 한글처리 다 되어 있음.(한글처리보다 get 방식과 post 방식을 이해하기)

- HTML form 태그에서 method 속성값을 post로 해놓고 서블릿에서 doGet() 호출하면 폼값 제출할 때 에러남.

- doGet(), doPost()로 하든 안 하든 무조건 service()가 먼저 호출되게 되어 있음. doGet(), doPost()를 안 쓰면 service()에서 다 구현하고 doGet(), doPost()를 쓰면 service()가 재호출하는 것.

- Get 방식이든 Post 방식이든 다음 코드와 같이 doProcess() 메소드를 추가해서 하나로 처리해준다.

public class PrintHeaderServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//get이든 post든 어떤 방식으로 요청으로 들어오든 로직은 여기에 작성.
	}
}

- doProcess()에서 던진 예외들(ServletException, IOException) 말고 다른 예외가 발생하여 예외 처리를 해줄 때 doProcess()에서 try~catch문으로 잡는 게 낫다. 던지려고 하면 예외가 doProcess()를 호출한 doGet()과 doPost() 둘 다에 가게 되는데 결국 doGet()과 doPost()에서 try~catch문으로 잡아야 함

- HttpServlet 클래스에서 do로 시작하는 모든 메소드가 Restful과 관련됨.

- 현업에서 서버사이드의 핵심 Restful API와 JSON 방식 프론트UI의 핵심은 Vue.js