Post

한글로 DB 테이블/컬럼명을 지정할 수 있다고? - Drizzle ORM

한글로 DB 테이블/컬럼명을 지정할 수 있다고? - Drizzle ORM

현빈Hyunbin 님의 트윗을 보고 직접 확인해봤다. 진짜 된다.

뭐가 된다는 거야?

TypeScript 변수명 얘기가 아니다. SQLite DB에 실제로 저장되는 테이블명과 컬럼명을 한글로 쓸 수 있다는 거다.

1
2
3
4
5
6
7
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";

export const 학생 = sqliteTable("학생", {
  아이디: integer("아이디").primaryKey({ autoIncrement: true }),
  이름: text("이름").notNull(),
  학번: text("학번").notNull().unique(),
});

Drizzle이 생성하는 SQL:

1
2
3
4
5
6
7
CREATE TABLE `학생` (
	`아이디` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
	`이름` text NOT NULL,
	`학번` text NOT NULL
);

CREATE UNIQUE INDEX `학생_학번_unique` ON `학생` (`학번`);

실제 SQLite 파일을 열어봐도 테이블명이 학생으로 저장돼 있다.

왜 되는 거야?

세 가지가 맞아떨어진 결과다.

SQLite: 식별자를 backtick이나 double quote로 감싸면 유니코드를 그대로 허용한다. 스펙상 제한이 없다.

Drizzle ORM: 테이블명과 컬럼명을 항상 backtick으로 escape해서 SQL을 생성한다. 개발자가 신경 쓸 필요 없이 자동으로.

Node.js node:sqlite: 내부적으로 UTF-8 기반이라 한글 식별자를 별도 처리 없이 읽고 쓴다.

그럼 실무에서 써도 되나?

솔직히 말하면 기술적으로는 되지만 추천하진 않는다. 이런 이유들 때문에:

  • raw SQL 작성할 때 번거롭다. Drizzle을 거치지 않고 직접 쿼리를 쓸 때마다 backtick으로 감싸고 한글을 타이핑해야 한다.
  • 툴 호환성을 100% 보장할 수 없다. DB GUI 클라이언트나 마이그레이션 툴, 로그 등에서 한글이 깨지거나 이상하게 표시되는 경우가 있을 수 있다.
  • 다른 DB는 다르다. PostgreSQL, MySQL에서도 동일하게 동작한다는 보장이 없다. 나중에 DB를 교체하거나 멀티 DB 환경이 되면 문제가 생길 수 있다.
  • 협업 시 진입장벽이 생긴다. 영어권 개발자와 협업하거나 코드를 공유할 때 불편함이 따른다.

그래서 이 트윗의 핵심은

“실무에서 한글 쓰세요”가 아니라, “이게 된다는 사실 자체가 흥미롭다” 는 발견의 공유에 가깝다. SQLite와 Drizzle의 내부 동작이 맞물려서 생기는 일종의 부산물.

도메인 언어를 DB 스키마에 그대로 옮길 수 있다는 가능성 자체는 흥미롭다. 한국어 서비스를 혼자 빠르게 프로토타이핑할 때, 혹은 비개발자와 스키마를 공유해야 할 때, 혹은 전문용어를 그대로 써야 할 떄는 유용할 수도 있다.

This post is licensed under CC BY 4.0 by the author.