우리 게임에서는 아래와 같은 문장으로 이벤트를 진행하고 있다.
"🎁 선물이 도착했습니다"
뭔가 선물할게 있으면 저런 뉘앙스의 문장으로 유저에게 메세지를 준다.
저기서 선물상자 이미지는 그림이 아니라 글자이다. 이모지라는 것. 뭐 사실 요즘은 초등학생도 다 아는 내용이니 생략하고.
이모지는 mysql 의 utf8mb3 인코딩(콜레이션)에서 문제를 겪으면서 처음 알게 되었다. 아마 이 때가 2020년 언저리 였던 것으로 기억하는데, 근 5년이 지나서 이모지에 대한 글을 쓰게 된 이유는 뜬금없이 쓰게 되었다. 오늘 문득 java8 에서 sysout 으로 이모지를 출력해보니 잘 나오길래 이게 놀라웠기 때문이다.
왜냐면 이모지는 utf8 인코딩 체계의 글자이고, 인코딩이란 어떠한 약속이자 규약이다. 그렇다면 이 규약이 정해지기 전에 만들어진 기술시스템에서는 호완이 되지 않기 마련인데, 레거시 프로그래밍 언어에서도 동작하는 걸 보면 이 이모지의 역사가 오래되었지 않나 싶었다.
아니나 다를까 나무위키에 누군가 정리해놓은게 있었고, 이를 참고해서 공부하는 방향을 잡았다.
이모지는 일본에서 시작되었다는 것이 정설이다. 최초 어느 일본 기업에서 만들었냐는 왈가왈부가 있지만, 오늘날에는 1988년 샤프사의 PDA PA-8500 에서 시작되었다고 알려져있다. 이모지가 동양권에서 시작되었다는 점이 매우 놀랍지만 일본이 시초라고 하니 아 그럴만도 하다 싶기도 하다. 서양권의 사레를 보면 구글은 2008년도 부터 이모지를 gmail 에서 사용하기 시작했다. 2011년에는 애플이 ios 키보드에 이모지를 추가하기 시작했는데, 애플로 인해 전세계적으로 이모지 채팅이 활발해졌다. 일본이 만들어내고, 미국이 유행을 시킨 뭐 그런 느낌이랄까.
앞서서 이모지도 글자이고 인코딩이라 말한 바 있다. 그렇다면 인코딩에 대한 규약이 있기 마련이다.
유니코드 개발 산하에서 작성한 이모지 프로토콜 사양은 2015년에 1.0 버전이 최초 작성되어서 오늘날 2025년에는 17.0버전까지 만들어져 있다.

https://unicode.org/Public/emoji/1.0/emoji-data.txt
프로토콜 명세를 보면 귀여운 이미지의 아이콘이 예시로 나오고 이렇게 출력이 되어야한다고 되어있다. 이 말의 의미는 컨셉만 규정으로 잡혀있지 실제 구현은 각 구현자가 알아서 그려라가 된다.
나무위키에는 이에 대한 사례가 정리되어 있다.

웃는 이모지가 이렇게 각기 구현이 다르다. 국산에는 유일하게 이모지를 구현한 업체가 있으니 바로 토스이다. 토스페이스 라는 이름으로 구현이 되었는데, 유니코드 규약을 지키지 않아서 논란이 된 적이 있다.
감정 그림 문자의 코드 자체가 바뀐 채 등록된 사례도 있다. 토스페이스를 통해 사모아의 국기를 입력하면 대만의 국기가 나온다. 마찬가지로 대만의 국기는 사모아의 국기로 나타난다. 이외에도 이륙하는 비행기가 착륙하는 비행기로 등록되는 등 오류가 속속 발견되면서 사용에 어려움을 겪고 있다. - https://www.hankookilbo.com/News/Read/A2022030411020002295
구현이 안된 이모지를 마주하면 깨지게 된다.

이모지의 구현은 어디서 할까? 폰트에서 처리가 된다.
os 나 브라우저 등의 시스템에서 글자를 표현해야하는 상황이 오면, 우선 표현해야할 글자를 정의된 인코딩 포맷에 맞게 디코딩해서 해석을 시도한다. "안녕하세요" 라는 utf-8 글자가 있다고 치자면, 이 안녕하세요란 5 글자는 시스템 입장에서는 2진수의 바이트 배열이고, 바이트 배열을 글자 체계로 해석하기 위한 작업을 한다고 할수있다. 어찌됫건 디코딩되어서 해석이 되면 코드포인트라는 체계로 만들어지는데, 예를 들어, UTF-8 체계에서 문자 "A"에는 U+0041이라는 코드 포인트로 변환이 가능하다. 변환이 된 코드포인트는 폰트 시스템에 이 코드포인트에 해당하는 글리프(glyph)가 있냐고 묻게 되는데, 이 글리프가 우리가 눈으로 보는 이미지다. 폰트 시스탬 에서 글리프(glyph)는 최소한의 단위이다. 글자 = 글리프로 이해해도 무관하다. 폰트 시스탬 내에서는 코드포인트와 글리프가 맵핑되어 있고, 요청한 코드포인트에 해당하는 글리프를 폰트 시스템이 출력해주면서 글자가 렌더링 되게 된다.
이야기가 장황하지만 간단하게 말하면, 표현해야할 글자 바이트 배열이 주어질 때, 이를 정의된 인코딩 체계로 디코딩해서 코드포인트를 뽑아낸 후에 폰트 시스템에서 적절한 글리프를 찾아 글자를 렌더링한다고 요약해 설명할수 있다.
여기까지 알아낸 정보를 토대로 보면, 내가 궁금했던 왜 레거시 프로그래밍 언어도 이모지가 지원이 되지? 라는 것은 OS에 설치된 폰트 시스템과 관련이 있기에 프로그래밍 언어와는 전혀 상관이 없다. 만약 윈도우 XP 와 같은 매우 오래된 OS 에서 최신 java17을 설치하더라도(설치가 되곘냐만은) 이모지는 깨질 수 있다. 그런데 이 환경에서 최신 이모지를 지원하는 폰트 시스템을 윈도우XP 에 설치한다면 이모지가 바르게 출력될 지도 모른다.
결론은 이모지는 폰트 시스템과 관련이 있기 때문에 레거시 프로그래밍 언어의 사양과는 전혀 상관이 없다.
끝.