본문 바로가기
JSP

서블릿 기초, 한글 인코딩 하기

by 김마리님 2020. 5. 26.

JSP를 하기 전에 서블릿을 본다. 서블릿은 크게 네 가지의 형태로 데이터를 주고 받는데, get, post, put, delete의 형태이다. 특징을 확인해보자.

서블릿을 테스팅 하기 전에 다음과 같은 프로그램을 깔아보자

https://www.postman.com/

 

Postman | The Collaboration Platform for API Development

Simplify each step of building an API and streamline collaboration so you can create better APIs—faster

www.postman.com

postman은 직접 웹페이지를 띄우지 않고도 결과물을 확인하기도 쉽고, 보내는 데이터 형태에 따라 헤더도 알아서 설정되어서 테스트 하기에 편하다.

 

get은 key=value형태밖에 받지 못한다.

post는 key=value 이외에 다양한 형태로 데이터를 주고 받을 수 있다.

 

먼저, 한글을 인코딩해보자.

기본적으로 한글을 받지 못하기 때문에 한글을 따로 인코딩 해 줄 필요가 있다. 단 한줄이면 충분하다.

	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
    }    

다음과 같이 setCharacterEncoding("인코딩 할 문자의 형태")로 사용할 수 있다. 물론 utf-8뿐만 아니라 euc-kr도 함께 사용할 수 있다.

그러나 일일히 서블릿에 문자를 걸어주는 것은 쉽지 않은 일이다. 이 때 할 수 있는 일이 어제 언급했던 web.xml이다. 이 문서에 한글 인코딩 코드를 추가하면 문서를 열 때 마다 자동으로 인코딩이 되어서 나온다.

(web.xml은 웹에 접근할 때마다 세팅해야하는 기초적인 설정을 담아둔 xml 문서이다.)

web.xml 파일 내부에 다음과 같은 코드를 넣어주자.

	<filter>
		<filter-name>setCharacterEncodingFilter</filter-name>
		<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>setCharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

(끝에 아무데나, web-app 내부에 다른 코드 끊어먹지 않는 선에서 넣어주면 되겠다)

 

이 코드를 넣고 서버를 재시삭 하면, 그 때부터는 한글이 깨지는 불상사는 일어나지 않게 된다.

지금부터 네 데이터 전송방식의 차이점을 보자.

 

get 요청의 경우 데이터 전송방식이 key=value방식만 가능하다. 그리고, 받은 key=value 값은 주소창에 쿼리 스트링(Query String)으로 남는다.

 

(get 방식으로 전달 받는 서블릿 예시)

 

-login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	#loginFormArea{
	 text-align:center;
	 width:350px;
	 margin:auto;
	 border: 1px solid red;
	}
	h1{
	 text-align:center
	}
</style>
</head>
<body>
	<h1>로그인</h1>
	<section id="loginFormArea">
	<form action="login" method="get">
	<label id="id">아이디 : </label><input type="text" name="id" id="id"><br/>
	<label id="password">비밀번호 : </label><input type="password" name="password" id="password"><br/><br/>
	<input type="submit" value="로그인"/>
	</form>
	</section>
</body>
</html>

-loginServlet.java

package com.cos.ch03;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String id =request.getParameter("id");
		String password = request.getParameter("password");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		out.println("아이디 : "+id+"<br>");
		out.println("비밀번호 : "+password+"<br>");
	}

}

 

다음처럼 입력받은 값으로 만들어진 쿼리가 주소창에 남아버린다.

이런 방식으로 값을 전달 받으면 주소창 등에 개인정보의 노출위험도가 아주 높아진다. 그렇기때문에 이를 방지하기 위해서 post 방식으로 데이터를 주고 받는다. post는 get처럼 헤더에 key값을 가져가는 것이 아닌, 본문영역(response)에 가져가기 때문에 get보다 다양한 데이터형태(key=value, text, json, byte, 동영상 등등)를 주고 받을 수 있다. 이를 가능케 해주는 것은 tomcat이다.

그러나 우리가 내부에 어떤 데이터를 가지고 있는지 모르게 된다. 안에 든 것이 영상인지, 그림인지, 텍스트인지... 이런 것들을 가르쳐 주는 문서들을 동봉하게 되는데, 이 것이 마임 문서이다.

developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types

 

MIME 타입

MIME 타입이란 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘입니다: 웹에서 파일의 확장자는 별  의미가 없습니다. 그러므로, 각 문서와 함께 올바른 MIME 타입을 전송하도�

developer.mozilla.org

사용방법은 type/subtype 이렇게 사용한다.

만일 jpg 파일을 들고 이동해야한다면 image/jpg

html 문서라면, text/html . 이렇게 정의해주어야 한다.

 

이제 post를 보자.

 

(post방식으로 데이터를 전달하는 서블릿 코드 예시)

-test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>post test</title>
</head>
<body>
	<form action="postman" method="post">
		<input type="text" name="username" placeholder="username"/>
		<input type="submit" value="전송"/>
	</form>
</body>
</html>

 

 

-EncServelet.java

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("post 요청 옴");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String email = request.getParameter("email");
		
		System.out.println("username : "+username);
		System.out.println("password : "+password);
		System.out.println("email : "+email);
		
		User user = new User();
		user.setUsername(username);
		user.setPassword(password);
		user.setEmail(email);
		
		System.out.println(user.getUsername());
		System.out.println(user.getPassword());
		System.out.println(user.getEmail());

	}

 

-User.java(lombok 라이브러리를 사용합니다.)

package com.cos.ch03;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	private String username;
	private String password;
	private String email;
}

 

getParameter로 입력받은 코드를 받아, User.java 파일을 이용해 객체를 따로 만들어 값을 넣는 방식을 이용했다.

이 때 이용한 것이 postman인데,

x-www-form-urlencoded를 이용하면 key=value 값을 전달하는 데이터 형태를 지정할 수 있다.

헤더의 마임 타입도 확인해볼까?

 

마임타입도 변한 것을 확인할 수 있다. 

대신 post 타입의 경우 form 태그를 이용해 form action을 받아야만 한다.

 

 

put과 delete의 경우 주의할 점이 있는데, key=value 값은 get과 post만 받을 수 있는 데이터 형태이다. 그래서 put과delete의 경우 json 데이터 형태로 주로 주고 받는다.

 

(put 형태로 데이터를 주고 받는 서블릿 코드 예시)

 

-EncServlet.java(Gson 라이브러리 사용)

	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			
		System.out.println("put 요청 옴");
		BufferedReader br=req.getReader(); 
		//System.out.println(br.readLine());
		String data=null;
		StringBuilder sb=new StringBuilder();
		while((data=br.readLine())!=null) {
			//System.out.println(data);
			sb.append(data);
		}
		Gson gson=new Gson();
		User user=gson.fromJson(sb.toString(), User.class);
		
		System.out.println(user.getUsername());
		System.out.println(user.getEmail());
		System.out.println(user.getPassword());

		}

이 때 데이터를 불러오는 방식은 여타 json 데이터를 불러오는 방식은 buffer을 이용해 불러봐야 한다.

반응형

'JSP' 카테고리의 다른 글

1. JSP지시어  (0) 2020.05.27
Forwarding  (0) 2020.05.27
JSP의 기초  (0) 2020.05.25
웹페이지 서버 요청 방식과 웹 기초  (0) 2020.05.25
JSP 기초와 STS에서 JSP 환경 설정하기  (0) 2020.05.22