백엔드 공부 메모/서블릿 & JSP

Request, Response 객체를 이용한 요청 처리(2)

볼륨조절불가 2023. 11. 4. 23:46
728x90

 

 

* 본 글은 뉴렉처(Newlecture) 채널의 서블릿, JSP 강의를 참고하여 작성되었습니다.

* 추가 참고: https://velog.io/@yh_lee/HttpServletRequest

 

 

 


 

 

HTML의 입력 폼을 통한 요청

이전 글에서는 주소 창에 직접 쿼리 스트링을 입력하여 인자값과 함께 서버에 GET 요청을 실행했다.

 

하지만 HTML 문서에서 form 태그 안에 input 태그를 입력하면 브라우저에 주소를 입력하지 않고 서버에 GET, POST 요청할 수 있는 입력 폼이 생성된다.

 

<form action="exam" method="get">
	<input type="text" name="param" />
	<input type="submit" value="요청" />
</form>

 

첫 번째 input 태그는 type 속성이 text이므로 실제 html 문서에서 텍스트 작성 칸이 되며, 두 번째 input 태그는 type 속성이 submit 이므로 서버에 요청하는 기능의 버튼이 된다.

 

텍스트 작성 칸에 데이터를 입력한 뒤 버튼을 누르게 되면, form 태그의 action 속성에 입력된 주소로 method 속성값의 방식(get, post 둘 중 하나 입력 가능)으로 서버에 요청할 수 있다.

 

input 태그의 name 속성

input 태그에는 name 속성을 부여할 수 있는데, 해당 속성은 submit 버튼을 통해 서버에 요청시 파라미터 이름의 역할을 한다.

 

이를 통해 하나의 form 태그에 존재하는 여러 개의 submit 버튼 중 어느 버튼이 눌렸는지 서버가 name 속성을 통해 구분할 수 있다.

 

request.getParameter() 메서드에 들어가는 인자가 바로 input 태그의 name 속성이기 때문이다.

 

name 속성이 똑같은 input 태그가 여러 개가 존재할 경우 request.getParameter()의 값은 가장 첫번째 태그의 value값이다.

 

이 경우, 모든 파라미터 값은 아래 코드를 통해 String 배열 형태로 얻을 수 있다.

 

request.getParameterValues("name 속성값");

 

 


 

 

GET 요청과 POST 요청의 차이

GET 요청은 쿼리 스트링을 사용해 파라미터를 서버에 넘길 수 있다.

 

입력 폼을 사용해 GET 요청을 실행해도 요청하는 주소 뒤에 쿼리 스트링이 붙는 것을 볼 수 있다.

 

하지만 POST 방식으로 서버에 요청하게 되면 주소 뒤에 쿼리 스트링이 붙지 않는다.

 

POST 요청은 쿼리 스트링 대신 HTTP 메세지의 바디를 통해 서버에 데이터를 전달하기 때문이다.

 

POST 요청의 장점

  1. 간결한 URL: 파라미터 값으로 전달할 내용이 많은 경우, GET 요청을 하게 되면 URL이 길어져 사용자가 어느 주소를 요청했는지 쉽게 파악하기 어렵다. POST 요청은 쿼리 스트링을 사용하지 않아 GET 요청보다 URL이 간결해진다.
  2. 길이 제한이 없는 파라미터 값: GET 요청 방식은 길이 제한이 존재하지만(브라우저마다 다름),  POST 방식은 제한이 없어 많은 양의 텍스트를 전달하기 좋다.
  3. 보안성: 입력 폼에 개인정보를 입력하고 GET 요청을 하게 되면 주소창에 개인정보가 그대로 노출되어 보안에 취약하다. 반면 POST 요청의 경우 파라미터를 HTTP 메세지 바디에 저장하여 서버로 전달하므로 GET 요청보다 보안성이 우수하다.

 

 


 

 

브라우저 요청시 파라미터 값이 깨지는 경우

브라우저 요청시 입력값, 즉 파라미터값에 한글이 있는 경우에 깨지는 경우가 있다.

 

한글이 깨지지 않게 response 객체의 메서드를 사용했는데 왜 깨질까?

 

서버가 파라미터값을 받아올 때의 인코딩 형식(입력 인코딩 형식)을 코드상에서 따로 지정하지 않았기 때문이다.

 

톰캣의 기본 입력 인코딩 형식은 문자를 1바이트씩 읽어오는 ISO-8801이다.
우리가 입력하는 한글은 2바이트의 크기를 차지하기 때문에 톰캣이 ISO-8801 형식으로 파라미터값을 1바이트씩 읽어오면 그 데이터를 온전한 한글 문자로 인식할 수 없다.
그래서 입력 인코딩 형식을 한글을 지원하는 형식으로 바꾸어야 하며, 그 중 하나가 UTF-8이다.

 

입력 인코딩 형식을 지정하기 위해서는 아래 코드를 service() 메서드의 시작 부분, 또는 서블릿 필터에 추가하면 된다.

 

// 입력 인코딩 형식을 UTF-8로 설정
request.setCharacterEncoding("UTF-8");

 

톰캣 서버 자체 설정으로도 해결이 가능하나, 한 서버에서 여러 웹 서비스를 관리하는 경우 설정 변경의 영향이 모든 서비스에 미치기 때문에 추천되는 방법은 아니라고 한다.

728x90