오라클 데이터베이스에 데이터를 저장할 때, 특정 문자가 정상적으로 입력되지 않거나 깨지는 경우가 발생할 수 있다.

특히, 중국어(난 중국어가 밉다........하)와 같은 다국어 문자를 저장할 때 데이터베이스와 애플리케이션 간 문자 인코딩이 맞지 않으면 문제가 생길 수 있다.

이를 해결하기 위해 HTML 엔티티 형식으로 데이터를 변환하여 입력하는 방법을 사용한다.


HMTL 엔티티란?

HTML 엔티티는 HTML에서 특정 문자를 표현하기 위해 사용하는 코드이다.

각 문자를 &#유니코드값; 형태로 변환하여 저장하며, 이를 통해 데이터가 깨지지 않고 안전하게 입력될 수 있다.

예를 들어, 社会는 HTML 엔티티로 社会와 같이 변환된다.


1. 의존성 설정

Apache Commons Text 라이브러리를 사용해 HTML 엔티티를 변환하고 복원한다. (Maven)

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.10.0</version>
</dependency>

 

2. HTML 엔티티 변환 및 저장

import org.apache.commons.text.StringEscapeUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class HtmlEntityToDatabase {
    public static void main(String[] args) {
        // 원본 문자열
        String[] departments = {
            "社会福利学部 社会事业学专业",
            "商经学部 经营学专业",
            "商经学部 国际贸易学专业"
        };

        try {
            // 오라클 DB 연결(생략)

            // 데이터 저장
            String insertQuery = "INSERT INTO department_info (id, name) VALUES (?, ?)";
            PreparedStatement preparedStatement = connection.prepareStatement(insertQuery);

            for (int i = 0; i < departments.length; i++) {
                String originalText = departments[i];

                // HTML 엔티티로 변환
                String htmlEntityText = StringEscapeUtils.escapeHtml4(originalText);

                // DB에 저장
                preparedStatement.setInt(1, i + 1); // id
                preparedStatement.setString(2, htmlEntityText); // name
                preparedStatement.executeUpdate();

                System.out.println("Original: " + originalText);
                System.out.println("Stored as HTML Entity: " + htmlEntityText);
            }

            preparedStatement.close();
            connection.close();
            System.out.println("Data inserted successfully!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

3. 저장 데이터 복원

import org.apache.commons.text.StringEscapeUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class HtmlEntityFromDatabase {
    public static void main(String[] args) {
        try {
            // 오라클 DB 연결(생략)

            // 데이터 조회
            String selectQuery = "SELECT id, name FROM department_info";
            PreparedStatement preparedStatement = connection.prepareStatement(selectQuery);
            ResultSet resultSet = preparedStatement.executeQuery();

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String htmlEntityText = resultSet.getString("name");

                // HTML 엔티티를 원래 문자열로 복원
                String originalText = StringEscapeUtils.unescapeHtml4(htmlEntityText);

                System.out.println("ID: " + id);
                System.out.println("Stored HTML Entity: " + htmlEntityText);
                System.out.println("Restored Original: " + originalText);
            }

            resultSet.close();
            preparedStatement.close();
            connection.close();
            System.out.println("Data retrieved and restored successfully!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

실행결과

/**
* 데이터 저장 단계
**/

Original: 社会福利学部 社会事业学专业
Stored as HTML Entity: &#31038;&#20250;&#31119;&#21033;&#23398;&#37096; &#31038;&#20250;&#20107;&#19994;&#23398;&#19987;&#19994;
...

Data inserted successfully!

/**
* 데이터 복원 단계
**/

ID: 1
Stored HTML Entity: &#31038;&#20250;&#31119;&#21033;&#23398;&#37096; &#31038;&#20250;&#20107;&#19994;&#23398;&#19987;&#19994;
Restored Original: 社会福利学部 社会事业学专业
...

Data retrieved and restored successfully!

다 쓰고나서 알았는데 ChatGPT에 복사해 넣으니까 알아서 변환해주더라.. 하..하하하ㅏ하

반응형