「???? 글자」 의 정체
제목에 「안녕하세요」 입력 → 등록 → 목록에 「?????」 표시.
코드는 분명 맞는데 화면이 이상해 보입니다. 첫 며칠을 헤매는 단골 함정.
👉 인코딩 일치가 핵심. 한 곳이라도 다르면 깨짐.
모든 요청·응답을 강제로 UTF-8 로 처리하는 부품.
DispatcherServlet 보다 먼저 실행되어 request.setCharacterEncoding("UTF-8") 을 자동으로 호출해 줍니다. web.xml 에 한 번만 등록.
<!-- web.xml -->
<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>
| 곳 | 설정 |
|---|---|
| ① 요청·응답 | web.xml CharacterEncodingFilter (오늘 차시) |
| ② JSP 페이지 | <%@ page contentType="text/html; charset=UTF-8" %> |
| ③ JDBC 연결 | jdbc:mysql://...?characterEncoding=UTF-8 |
| ④ DB 테이블 | CREATE TABLE ... CHARACTER SET utf8mb4 |
👉 4 곳 모두 UTF-8 이 일치해야 한글이 어디서도 안 깨짐.
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="UTF-8" />
<title>...</title>
</head>
...
👉 JSP 의 위 두 줄과 HTML 의 meta charset — 모두 UTF-8 통일.
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/spring_db?characterEncoding=UTF-8&serverTimezone=UTC" />
👉 ?characterEncoding=UTF-8 누락 시 — DB 에 한글 저장은 되지만 가져올 때 깨질 수 있음.
XML 에서 & 는 & 로 표기해야 함 (XML 문법).
CREATE TABLE board (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
content TEXT
)
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
👉 utf8mb4 권장 (이모지 포함). 옛 utf8 은 3 byte 까지만 지원.
| 실험 | 증상 |
|---|---|
| CharacterEncodingFilter 제거 | 요청 한글이 ???? 로 저장 |
| JSP page 의 charset 빠뜨림 | JSP 자체가 깨져 보임 |
| JDBC URL 의 characterEncoding 누락 | DB ↔ 자바 사이 깨짐 |
| DB 테이블 CHARSET 다름 | 저장된 데이터가 ???? 로 보임 |
한글이 깨질 때마다 어디를 봐야 할지 막막.
UTF-8 일관성 4 곳을 외운다. 깨짐 시 어디부터 점검할지 안다.