클로드와 함께 DB 마이그레이션을 하다가 로그에 orphan이라는 단어가 찍혔다.
클로드와 함께 DB 마이그레이션을 하다가 로그에 orphan이라는 단어가 찍혔다.
고아. 부모 레코드는 지워졌는데 자식 레코드만 덩그러니 남아있는 걸 그렇게 부른다고 한다. 외래 키가 가리키는 대상이 사라져서 참조 무결성이 깨진 상태. 기술적으로는 정확한 비유다. 버려진 채 남아있는 데이터, 더 이상 연결고리를 찾을 수 없는 행(row). 근데 그 단어, 한국 정서랑 좀 안 맞다는 생각이 들었다.
알고 보니 orphan은 생각보다 여러 맥락에서 쓰이는 용어였다.
git checkout --orphan)공통점은 전부 보호자 없이 홀로 남겨진 것이라는 은유다. 영어권에서는 이 비유가 꽤 자연스럽게 받아들여진다. 올리버 트위스트, 해리포터 같은 문학적 레퍼런스에서 orphan은 동정받는 주인공의 이미지로 소비되니까.
근데 한국어로 옮겨놓으면 얘기가 좀 달라진다. 한국사에서 노예제에 해당하는 제도는 노비였고, 천민과 같은 신분 구조가 있었다. 그래서 slave를 한국어로 노예라고 옮기면, 미국의 남부 영화가 먼저 떠오르지 한국 사회의 실제 역사적 상처와는 한 겹 거리가 있다. 번역되면서 단어의 뾰족함이 둥글어지는 거다.
반면 고아는 다르다. 한국전쟁 이후 전쟁고아가 대규모로 발생했고, 그 여파가 지금까지도 여러 방식으로 남아있다. 해외 입양, 고아원, 가족주의 문화 속에서 고아라는 단어는 여전히 무겁게 읽힌다. 영어 orphan이 문학적 동정의 대상이라면, 한국어 고아는 훨씬 구체적이고 최근의 역사에 발을 딛고 있는 단어다. 같은 은유여도 문화권에 따라, 그 사회가 지나온 역사에 따라 체감 무게가 완전히 달라진다.
2020년 BLM 이후 IT 업계는 대대적인 용어 정리를 했다.
| 이전 용어 | 대체어 |
|---|---|
| master / slave | primary / replica |
| master branch | main branch (GitHub 2020년 기본값 변경) |
| blacklist / whitelist | blocklist / allowlist |
| black hat / white hat | malicious hacker / approved hacker |
MySQL, Redis, Django, Kubernetes 등 주요 프로젝트들이 순차적으로 변경을 적용했다. Linux 커널도 2020년에 inclusive terminology 가이드를 도입했고, IETF도 RFC 문서에서 master/slave, blacklist/whitelist 용어를 교체했다. 그런데 이 흐름에서 orphan, widow, zombie, kill 같은 단어들은 거의 논의 대상이 아니었다.
업계가 민감하게 반응한 건 주로 노예제·인종차별 관련 은유였다. master/slave는 직접적이었고, blacklist/whitelist는 black = 나쁨, white = 좋음이라는 색 연관을 강화한다는 지적이 컸다.
반면 orphan, widow 같은 단어는:
dangling, unreferenced)가 원어만큼 직관적이지 않음그래서 논의가 있긴 했지만 주류로 가지는 못했다.
sanity check도 비슷하다. sanity의 반대말은 insanity(미친 상태)고, 정신질환을 부정적 레퍼런스로 쓴다는 지적이 있다. 구글, Linux Foundation 스타일 가이드에서는 validation check, consistency check로 대체하라고 권장한다. 근데 실제 코드·문서에서는 여전히 광범위하게 쓰인다. 대체어가 sanity check만의 뉘앙스(빠르게 말이 되는지 훑어보는 것)를 정확히 커버하지 못한다는 이유에서다.
여담이지만, 나는 sanity라는 단어를 Sanity.io라는 헤드리스 CMS로 먼저 알게 돼서 한참 동안 정신과적 맥락을 모르고 있었다. 브랜드가 원어의 뉘앙스를 덮어버린 케이스. Stripe, Slack, Discord, Notion도 비슷한 경우다.
구글, Linux Foundation, IBM, Microsoft 등이 정리한 inclusive language 가이드에서 공통적으로 언급되는 용어들을 카테고리별로 정리하면 이렇다.
| 피해야 할 용어 | 대체어 |
|---|---|
| master / slave | primary / replica, leader / follower |
| blacklist / whitelist | blocklist / allowlist, denylist / allowlist |
| black hat / white hat | malicious hacker / approved hacker |
| black box / white box | closed / open, opaque / transparent |
| master branch | main branch |
| grandfathered | legacy |
| 피해야 할 용어 | 대체어 |
|---|---|
| sanity check | validation check, consistency check |
| crazy, insane | unpredictable, unexpected |
| dummy (data) | placeholder, sample |
| crippled | disabled, impaired |
| blind to | unaware of, overlook |
| dumb (terminal) | basic, simple |
| 피해야 할 용어 | 대체어 |
|---|---|
| manpower / man hours | workforce, person-hours |
| chairman / foreman | chairperson, chair |
| guys (사람 지칭) | folks, team, everyone |
| 피해야 할 용어 | 대체어 |
|---|---|
| hang / hung | stall, unresponsive |
| kill (process) | stop, end, terminate |
| hit (the endpoint) | call, access |
| abort | cancel, stop |
| 피해야 할 용어 | 대체어 |
|---|---|
| powwow | meeting, discussion |
| tribal knowledge | institutional knowledge |
| spirit animal | favorite, mascot |
| guru, ninja, rockstar (채용) | skilled, experienced |
| native feature | core feature, built-in feature |
이 목록을 보면서 드는 생각은, 용어 교체는 결국 영어 화자의 감수성으로 일어난다는 것이다.
애초에 코드가 영어로 쓰이다 보니 변수명, 함수명, 에러 메시지, 공식 문서 전부 영어를 기준으로 만들어진다. 그래서 용어에 대한 문제 제기도 영어 모국어 화자들이 느끼는 불편함에서 출발할 수밖에 없다. 위 목록 대부분이 영어권 고유의 역사적 맥락인 것도 그래서다. Jim Crow법, 노예제, 아메리카 원주민, Roma 민족, 미국 정신의학 용어. 한국에서 일상적으로 쓰는 abort 같은 단어는 영어권에서 낙태 연상으로 조심하는 단어지만, 한국어로 중단이라고 번역되는 순간 그 뉘앙스가 휘발된다.
반대로 한국 개발자가 orphan이나 widow 같은 단어에서 느끼는 무게감은, 용어 교체 논의의 테이블에 올라올 통로가 없다. 코드가 영어로 쓰이는 이상 문제 제기의 언어도 영어여야 하고, 영어 화자에게 orphan은 애초에 뾰족한 단어가 아니니까. 그래서 slave는 바뀌었는데 orphan은 아직 orphan인 거다.
일부 프로젝트에서는 orphan 대신 dangling, unreferenced, stale을 쓰는 경우가 있다. dangling reference, unreferenced row 같은 표현. 한국 개발자가 만드는 도구나 문서에서 의식적으로 대체어를 쓰는 것도 작은 선택지다. 물론 2025년 들어 미국 빅테크들이 DEI 이니셔티브를 축소하면서 inclusive language 가이드 자체가 후퇴하는 분위기도 있다. Google이 responsible AI 페이지에서 DEI 문구를 뺐고, Meta는 팩트체커를 없앴다. 앞으로 이 흐름이 어디로 갈지는 불확실하다.
사실 이 글을 쓰면서 더 오래 남은 생각은 따로 있다. orphan을 보며 한국어로는 무겁다고 느꼈다면, 반대로 내가 아무렇지 않게 쓰는 단어 중엔 다른 누군가에게 불편한 단어가 있지 않을까 하는 경각심이다. slave라는 단어에 미국인 개발자가 먼저 불편함을 느꼈듯이, orphan에 한국인인 내가 위화감을 느꼈듯이. 대체어 목록을 정리하면서도 대부분의 단어는 나에게 아무 감각도 불러일으키지 않았다. 그건 내가 무뎌서가 아니라, 그 단어가 뾰족하게 느껴지는 역사를 내가 살지 않았기 때문이다. 그래서 나는 모르고 지나쳤을 거다, 누군가의 불편함을.
요즘 코드를 쓸 때 AI의 도움을 받지 않는 날이 거의 없다. 클로드 코드, 코덱스, 제미나이. 전부 과거의 방대한 코드베이스를 학습해서 가장 그럴듯한 다음 토큰을 제안한다. 그런데 그 학습 데이터는 대부분 용어 교체 흐름이 일어나기 이전의 코드다. GitHub에 쌓인 수십 년치 오픈소스, 튜토리얼, Stack Overflow 답변, 기술 블로그. master/slave, blacklist/whitelist가 정답이던 시대의 코드가 압도적으로 많다.
그러니까 내가 별생각 없이 AI에게 "DB 레플리케이션 설정해줘"라고 하면, 통계적으로 가장 흔한 패턴인 master, slave 변수명이 그대로 튀어나올 가능성이 높다. 개발자가 무심코 accept하면 그 코드는 또 어딘가의 레포에 올라가고, 다음 세대 AI의 학습 데이터가 된다. 용어를 바꾸자고 공식적으로 합의해도, 이 순환 속에서 옛날 용어는 계속 되살아난다.
이게 좀 무섭다. AI는 과거의 평균을 재생산하는 도구라서, 어떤 의미에서는 규범을 과거에 붙잡아두는 힘으로도 작용한다. 내가 직접 타이핑할 때는 '아 이거 이제 primary라고 써야지' 하고 의식할 기회라도 있는데, AI가 자동완성으로 던져준 걸 받아 쓰면 그 순간이 없다. 인지 또한 없다. 그래서 AI를 쓰는 개발자로서 한 번 더 멈춰 생각할 필요가 있다는 생각이 든다. AI가 제안한 이 변수명이, 이 함수명이, 이 에러 메시지가 과거의 어느 시점에서 온 것인지. 한 번쯤 의심해볼 것.
결국 포인트는 어떤 단어가 맞고 틀리냐를 외워서 정답처럼 쓰자는 게 아니다. 내가 쓰는 단어가 나의 문화권 바깥에서는 어떻게 읽힐 수 있는지, 그리고 그 단어가 어느 시대의 규범에서 온 것인지 한 번쯤 멈춰서 생각해보는 감각에 가깝다.
한국 개발자로서 영어 용어의 위화감을 느끼는 것, 내가 쓰는 영어 용어가 다른 문화권 누군가에겐 뾰족할 수 있다는 것, AI가 제안하는 단어가 과거의 답습일 수 있다는 것. 세 가지는 결국 같은 방향을 가리킨다.
내가 괜찮은 게 남에게도 괜찮다는 보장은 없고, 흔한 게 옳다는 보장도 없다. 우리는 이미 서로의 결과물 위에 다음을 만든다. 내가 바꾼 한 단어가 결국 다음 사람이 받는 기본값을 바꾼다.
Written by
PM이자 빌더. Sapienta Director.