Spring - UTF-8 처리 방법과 JDBC 비교

민경준·2022년 11월 8일
0

1. Spring에서 UTF-8을 처리하기 위한 방법


⚡한글이 깨지는 이유

  • 클라이언트 → 서버 → DBMS 단계에서
    매번 다른 문자코드를 사용하여 재 표현되기 때문이다.

⚡ 한글을 올바르게 표현하는 방법

  • GET
    • GET 방식에서는 Header의 URI에 포함되어 전달된다.
    • 그러므로 URI Encdoing을 거처야 한다.
  • POST
    • POST 방식에서는 Body에 포함되어 전달된다.
    • 서블릿에서 어느정도 컨트롤이 가능하다.

⚡ 해결방법

  • [ POST방식 ] web.xml에 utf-8 설정
    <filter> 
        <filter-name>encodingFilter</filter-name> 
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
        <init-param> 
           <param-name>encoding</param-name> 
           <param-value>UTF-8</param-value> 
        </init-param> 
        <init-param> 
           <param-name>forceEncoding</param-name> 
           <param-value>true</param-value> 
        </init-param> 
     </filter> 
     <filter-mapping> 
        <filter-name>encodingFilter</filter-name> 
        <url-pattern>/*</url-pattern> 
     </filter-mapping> 
    1. 역할
      • 클라이언트 → Body 데이터 UTF-8 인코딩 → 서버에서 데이터 처리
      • CharacterEncodingFilter
        • HTTP상에서 주고받는 데이터의 헤더값을 UTF-8로 인코딩
      • Servlet에서의request.setCharacterEncoding("utf-8");
        • POST로 인코딩 데이터를 받는 Servlet에서의
          request.setCharacterEncoding("utf-8"); 처리와 동일한 기능을 수행한다.
        • 즉, 이 Fileter를 설정하면 POST 요청을 보내는(Submit) 모든 Controller(Servlet) 마다
          request.setCharacterEncoding("utf-8"); 내용을 추가하지 않아도 된다.
      • 또한 DB에서 불러올 한글 데이터들의 한글 깨짐 현상을 해결한다.
    2. 사용
      • 해당 filter를 매핑할 때 모든 URL에 대해 인코딩 될 수 있도록 /* 와 같이 url-parttern을 설정 한다.
      • 주의!) Spring Security 설정이 있는 경우,
        한글 필터 설정이 springSecurityFilterChain 앞에 위치해야 한다.
  • [ POST방식 ] .jsp 파일에 utf-8 설정
    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
    1. 역할
      • Body 데이터 (JSP 내의 JAVA 코드 + HTML) UTF-8 인코딩 → 클라이언트
        • JSP의 인코딩 방식이 무엇인지 알 수 있게 선언하는것
        • JSP 파일에서의 한글 깨짐이 해결된다.
      • Servlet에서의 response.setContentType("text/html;charset=UTF-8");
        • Servlet에서의 response.setContentType("text/html;charset=UTF-8"); 처리와 유사한 기능을 수행한다.
        • Servlet/JSP 단에서의 설정 방법의 차이점
          <!-- dispatcher-servlet.xml에서의 설정 (Servlet/JSP 단에서의 설정) 예시 -->
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          	<property name="prefix" value="/WEB-INF/views/"/>
          	<property name="suffix" value=".jsp"/>
            <property name="contentType" value="text/html; charset=UTF-8"/>
          </bean>
          • Servlet/JSP 단에서의 설정
            • dispatcher-servlet.xml에서의 설정은 SErvlet 단에서의 설정을 의미한다,
            • .jsp 파일 상의 page 설정은 JSP 단에서의 설정을 의미한다.
          • Servlet/JSP 단에서의 설정 방법의 차이
            • JSP 디폴트 contentType: ISO-8859-1
            • 아무리 Servlet에서 response.setContentType 결정해서 보내더라도 .jsp page 자체의 contentType은 jsp spec에서 결정되므로 직접 기술해주지 않으면 ISO-8859-1로 설정된다.
            • Servlet 단에서의 설정은 JSP가 아닌 텍스트 리턴시에만 이용된다.
            • 따라서, 직접 .jsp page에 기술하는 것이 좋다.
  • [ GET 방식 ] Tomcat 서버의 환결 설정 파일 server.xml에 utf-8 설정
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
    • 해결방법
      • GET 방식으로 전달된 질의 문자열들은 URI에 포함되어 전달되기 때문에 URI에 대해 인코딩 처리 작업을 해야한다.
      • 서버마다 기본적으로 URI 인코딩 문자코드가 정해져 있으며 톰캣8 버전에서는 UTF-8 문자 코드가 기본값으로 적용된다.
    • 톰캣의 해당 프로젝트 config 폴더 → server.xml → URIEncdoing="UTF8" property를 추가한다.
      • 서버에서 직접 URI를 UTF-8로 인코딩하는 과정이다.
  • .html 파일에 utf-8 설정
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    	<title>Home</title>
    </head>
    • head 태그 영역을 위와같이 설정한다.
      • 최신 IDE(통합 개발 환경)를 사용한다면 기본적인 인코딩 방식은 UTF-8로 설정이 되어 있다.
      • 하지만 Windows 운영체제는 기본 인코딩 값으로 여전히 euc-kr 방식을 사용하기 때문에, 해당 페이지의 인코딩 방식(utf-8)이 무엇인지 브라우저가 알 수 있게 선언해야 한다.
    • 사용
      • HTML5의 경우
        • <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 를 head 태그 안에 삽입
      • XHTML의 경우
        • <meta charset="utf-8"> 를 head 태그 안에 삽입

출처 - https://gmlwjd9405.github.io/2019/01/01/spring-utf8.html



2. JDBC와 Spring JDBC 비교


  1. JDBC란?

    💡 JDBC는 모든 자바의 데이터 액세스 기술의 근간이 된다. 
    엔티티 클래스와 애노테이션을 이용하는 최신 ORM기술도 내부적으로는 
    DB와의 연동을 위해 JDBC를 이용한다.
    • 안정적이고 유연한 기술이지만, 로우 레벨 기술로 인식되고 있다.
    • 간단한 SQL을 실행하는 데도 중복된 코드가 반복적으로 사용되며, DB에 따라 일관성 없는 정보를 가진 채로 Checked Exception으로 처리된다
    • 장점
      • 대부분의 개발자가 잘 알고 있는 친숙한 데이터 액세스 기술이다.
      • 별도의 학습 없이 개발이 가능하다.
    • 단점
      • Connection과 같은 공유 리소스를 제대로 릴리즈 해주지 않으면
        시스템의 자원이 받가나는 버그가 발생한다.
  2. Spring JDBC란?

    💡 JDBC의 장법과 단순성을 그대로 유지 하면서도 기존 JDBC의 단점을 극복할 수 있게 해주고,
    간결한 형태의 API 사용법을 제공하며, JDCB API에서 지원되지 않는 편린한 기능을 제공한다.
    • Spring JDBC는 반복적으로 해야하는 많은 작업들을 대신 해준다.
    • Spring JDBC를 사용할 때는 실행할 SQL과 바인딩 할 파라미터를 넘겨주거나, 쿼리 실행 결과를 어떤 객체에 넘겨 받을지를 지정만 하면 된다.
    • Spring JDBC를 사용하려면 먼저, DB 커넥션을 가져오는 DataSource를 Bean으로 등록해야 한다.

출처 - https://smallgiant.tistory.com/13

profile
iOS Developer 💻

0개의 댓글