[장고] 텍스트 필드 이모지 입력받기
장고(Django)에서 텍스트 필드에 이모지를 입력받고 저장하는 것은 비교적 간단합니다. MySQL이나 MariaDB를 사용하는 경우, 데이터베이스와 테이블의 캐릭터 셋을 utf8mb4로 설정해야 합니다. 아래는 이를 구현하는 단계별 가이드입니다.
utf8mb4로 설정해야 하는 이유
MySQL이나 MariaDB에서 데이터베이스와 테이블의 캐릭터 셋을 utf8mb4로 설정해야 하는 이유는 이모지를 포함한 유니코드 문자들을 제대로 저장하고 처리하기 위해서입니다. 구체적인 이유는 다음과 같습니다:
1. 유니코드 문자 집합의 범위
UTF-8 인코딩은 문자 하나를 1바이트에서 4바이트까지 사용하여 표현할 수 있습니다. 그러나 MySQL의 utf8 캐릭터 셋은 UTF-8의 부분 집합으로서 최대 3바이트까지의 문자만 지원합니다. 이로 인해 UTF-8로 인코딩된 4바이트 문자(이모지 포함)를 제대로 저장할 수 없습니다.
2. 이모지와 고급 유니코드 문자
이모지, 일부 고급 한자, 고대 문자 등은 UTF-8 인코딩에서 4바이트가 필요합니다. 따라서 이러한 문자를 지원하기 위해서는 4바이트까지 지원하는 utf8mb4 캐릭터 셋을 사용해야 합니다.
3. 데이터 손실 방지
만약 데이터베이스가 utf8 캐릭터 셋을 사용하고 있을 때 4바이트 문자를 저장하려고 하면, MySQL은 오류를 발생시키거나 데이터를 잘라내어 저장하게 됩니다. 이는 데이터 손실로 이어질 수 있습니다.
데이터베이스 설정
MySQL이나 MariaDB를 사용하는 경우, 데이터베이스와 테이블의 캐릭터 셋을 utf8mb4로 설정해야 합니다. 이는 MySQL이 이모지를 저장하기 위해 필요한 4바이트 유니코드를 지원하도록 합니다.
이미 존재하는 데이터베이스와 테이블을 변경하려면 다음과 같이 실행합니다. 범위에 따라 두 가지로 나뉩니다:
① 테이블 전체
테이블 전체에 적용한다.
mysql> ALTER TABLE posts_post CONVERT TO CHARACTER SET utf8mb4;
② 필드 하나만
포스트 내용이나 댓글 내용에만 이모지를 입력받고 싶을 때가 있다. 이런 경우 해당 필드만 문자 집합 속성 값을 변경하면 된다.
// 테이블 scheme 조회
mysql> DESC posts_post;
// 필드 하나만 적용
mysql> ALTER TABLE posts_post MODIFY COLUMN col content CHARACTER SET utf8mb4;
settings.py 파일에서 OPTIONS 설정을 추가하여 데이터베이스 연결 시 utf8mb4를 사용하도록 설정합니다.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'your_db_host',
'PORT': 'your_db_port',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
}
※ 참고
장고는 manage.py에 의해 데이터베이스가 자동으로 생성됩니다. 그러나 종종 오류로 인해 직접 데이터베이스를 다뤄야할 때도 있습니다. 이런 경우를 대비해 다음 내용을 기록해두는 것도 좋습니다.
i) utf8mb4이 설정된 데이터 베이스 생성하기
다음 명령어를 사용하여 데이터베이스를 생성합니다:
CREATE DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
이 명령어는 데이터베이스 내의 모든 테이블에 utf8mb4 캐릭터 셋과 utf8mb4_unicode_ci 콜레이션을 적용합니다. 그러나, 이는 전체 데이터베이스에 걸쳐 추가적인 저장 공간을 사용할 수 있습니다. 저장 공간을 효율적으로 관리하려면, 특정 테이블에만 utf8mb4 캐릭터 셋을 적용하는 것이 좋습니다.
ii) utf8mb4이 설정된 테이블 생성하기
다음 SQL 코드는 MySQL에서 테이블을 생성하는 명령어입니다.
CREATE TABLE your_table_name (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 테이블 생성: CREATE TABLE 명령어는 새로운 테이블을 생성하는데 사용됩니다. 테이블 이름은 your_table_name으로 지정됩니다.
- 컬럼 정의:
- id 컬럼은 정수형(INT) 데이터를 저장하며, 각 행이 추가될 때마다 자동으로 증가(AUTO_INCREMENT)하여 고유한 값을 가집니다. 이 컬럼은 테이블의 주 키(PRIMARY KEY)로 사용되어 각 행을 고유하게 식별합니다.
- content 컬럼은 텍스트 데이터를 저장하는데 사용됩니다. 이 컬럼은 긴 문자열 데이터를 저장할 수 있는 TEXT 타입으로 정의됩니다.
- 문자 집합과 정렬 규칙 설정:
- CHARACTER SET utf8mb4는 이 테이블에서 모든 텍스트 데이터를 UTF-8의 4바이트 버전으로 저장하도록 설정합니다. 이는 이모지와 같은 4바이트 유니코드 문자를 저장할 수 있게 합니다.
- COLLATE utf8mb4_unicode_ci는 텍스트 데이터를 비교하고 정렬할 때 유니코드 규칙을 따르도록 설정합니다. 여기서 ci는 대소문자를 구분하지 않는 비교(case-insensitive)를 의미합니다.
이모지 입력 및 사용(테스트하기)
이제 Django 관리 페이지나 폼에서 이모지를 입력할 수 있습니다. 예를 들어, Django 관리 페이지에서 직접 이모지를 입력하거나, 폼을 통해 이모지를 입력할 수 있습니다.
1. 모델 설정합니다.
Django 모델에서 이모지를 입력받을 필드를 TextField로 설정합니다.
from django.db import models
class MyModel(models.Model):
content = models.TextField()
2. 마이그레이션 실행합니다.
모델을 변경했으므로 마이그레이션을 생성하고 적용합니다.
python manage.py makemigrations
python manage.py migrate
3. 폼 예제
from django import forms
from .models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['content']
4. 뷰 예제
from django.shortcuts import render, redirect
from .forms import MyModelForm
def my_view(request):
if request.method == 'POST':
form = MyModelForm(request.POST)
if form.is_valid():
form.save()
return redirect('success_url')
else:
form = MyModelForm()
return render(request, 'my_template.html', {'form': form})
이제 이모지를 입력받아 저장하고 사용할 준비가 완료되었습니다. 데이터베이스와 Django 설정이 올바르게 되어 있는지 확인한 후, 이모지를 자유롭게 입력하고 사용할 수 있습니다.