티스토리 뷰
[ JSP / Servlet ] 서블릿 출력 형식, 컨텐츠 형식 , 인코딩 형식 지정하기 - 한글이 깨지거나 원하는 출력이 나타나지 않는다면?
통통푸딩 2020. 12. 2. 21:18톰캣서버를 사용해 JSP와 Servlet을 배우고 있다.
웹페이지로 Servlet 출력을 하는데, 원하지 않는 출력이 나타나거나
브라우저마다 다른 출력이 나타나거나 한글이 깨지는 현상들이 일어나곤 한다.
왜그럴까? 형식들을 지정하지 않았기 때문이다.
여러 형식들을 지정해서 그에 맞게끔 브라우저가 읽어들이도록 해야한다.
1. Servlet 출력 형식
일단, 아래 코드부터 보자.
@WebServlet("/HelloServlet")
public class Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
for(int i=0; i<10; i++){
out.println("Hello!!!");
}
out.close();
}
}
이 코드를 실행하는 브라우저는 println 함수에 맞게 한줄에 하나씩 Hello!!! 라는 문자열을 출력해야 정상이다.
그렇지만 한줄 내려쓰기를 하지 않고 다음 사진과 같이 한줄에 모두 출력을 하는 현상이 발생한다.
이 현상은 클라이언트가 웹문서로 인식을 하기 때문이다.
즉, html의 마크업 언어에 맞추어 작성해야한다는 것이다.
out.println("Hello!!!<br>");
이렇게 한줄 내려쓰기인 <br> 태그를 넣어주어야한다.
2. 컨텐츠 형식 지정
이상태에서 다시 실행을 해본다면, 이상한 현상이 또 발생한다.
브라우저마다 다른 결과를 보이는 것이다. 어떤 브라우저는 한줄마다 Hello!!! 라는 문자열을 잘 출력하지만,
어떤 브라우저는 Hello!!!<br> 이렇게 우리가 작성한 태그까지 출력을 해버리는 문제점이 보인다.
이것은 브라우저에 컨텐츠 형식을 알려주지 않아서 브라우저가 자의적으로 해석을 해버리기 때문이다.
그래서 컨텐츠 형식을 지정해야한다.
@WebServlet("/HelloServlet")
public class Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;");
PrintWriter out = response.getWriter();
for(int i=0; i<10; i++){
out.println("Hello!!!<br>");
}
out.close();
}
}
출력도구인 response로 메소드를 호출합니다.
response.setContentType("text/html;"); 로 콘텐츠 형식을 html로 지정해주었습니다.
3. 한글이 깨질 때 인코딩 형식 지정하기
그런데 만약 제가 Hello!!! 라고 문자열을 출력하는 것이 아니라 안녕!!! 이라고 출력하고 싶은 경우,
한글을 사용했기 때문에 출력결과를 보면 한글이 깨지는 현상이 일어납니다.
* 한글이 깨지는 이유
1) 서버에서 한글을 지원하지 않는 문자코드로 인코딩한 경우
2) 서버에서는 UTF-8로 인코딩해서 보냈지만 브라우저가 다른 코드로 잘못 해석한 경우
그래서 아래와 같이 인코딩 형식을 지정해줘야한다.
@WebServlet("/HelloServlet")
public class Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
for(int i=0; i<10; i++){
out.println("안녕!!!<br>");
}
out.close();
}
}
위 코드와 같이
1) response의 setCharacterEncoding()을 통해 UTF-8로 사용자가 보내는 인코딩 방식을 지정한다.
2) 그리고 response의 setContentType()을 통해서 클라이언트가 해석할 방식을 지정해준다.
여기서 위에서 지정했던 컨텐츠 형식(html)과 더불어 뒤에 charset=UTF-8을 추가한다.
출력 결과를 보면 어떤 브라우저에서든 한글도 깨지지않고 html형식에 맞게 잘 출력되는 것을 볼 수 있습니다.
개발자도구 를 통해 네트워크 탭을 보면 Content-Type이 작성한대로 지정된 것을 볼 수 있다.
이렇게 형식들을 지정해줘야 브라우저가 올바르게 읽고 출력한다 !!😊
'백엔드 및 서버' 카테고리의 다른 글
[ Spring ] DI (Dependency Injection) xml 방식 설명 및 사용법 (0) | 2021.01.22 |
---|---|
[ JSP / Servlet ] MVC 패턴이란? (0) | 2020.12.04 |
[ JSP / Servlet ] Filter 사용하기 (0) | 2020.12.02 |
[ JSP / Servlet ] GET, POST 방식 전송 (0) | 2020.12.02 |
[ JSP / Servlet ] jsp, servlet, maven, tomcat 서버 설정 (0) | 2020.11.25 |