앱/게임 개발에서 일관된 UI와 폰트 패밀리가 중요한 이유
UI 일관성과 폰트 패밀리는 "예쁨"의 문제가 아닙니다. 유저 경험의 품질과 개발 생산성을 직접 결정하는 설계 문제입니다.
UI 일관성이란 무엇인가?
UI 일관성(UI Consistency)이란 앱이나 게임 전반에 걸쳐 같은 의미를 가진 요소는 항상 같은 방식으로 보이고 동작하는 것을 말합니다.
예를 들어 이런 것들이 일관성에 해당합니다.
- 버튼의 색상, 크기, 둥글기가 어느 화면에서나 동일하다
- 에러 메시지는 항상 빨간색으로 표시된다
- 뒤로가기 제스처나 버튼의 위치가 화면마다 다르지 않다
- 폰트 크기 체계가 정해져 있어, 제목은 항상 24px, 본문은 항상 16px이다
반대로 일관성이 깨진 UI는 이런 모습입니다.
- 로그인 화면의 버튼은 파란색인데, 설정 화면의 버튼은 회색
- 같은 "확인" 버튼인데 어떤 화면에서는 오른쪽, 어떤 화면에서는 왼쪽에 있음
- 제목 폰트가 화면마다 제각각 (나눔고딕, 맑은 고딕, 고딕A1이 혼재)
이게 단순히 보기 불편한 문제로 끝나지 않습니다.
왜 중요한가? — 유저 입장에서
1. 인지 부하(Cognitive Load)를 줄여준다
사람의 뇌는 낯선 것을 처리할 때 더 많은 에너지를 씁니다. 화면이 바뀔 때마다 버튼 위치, 폰트 크기, 색상 의미가 달라진다면 유저는 매번 새로 학습해야 합니다.
반면 일관된 UI는 유저가 한 번 학습한 패턴을 그대로 재사용하게 해줍니다. 인스타그램, 유튜브 같은 앱을 처음 써도 금방 익숙해지는 이유가 여기 있습니다. 유저는 의식적으로 "이 버튼이 뭐지?"를 생각할 필요 없이 자동으로 행동할 수 있습니다.
게임에서는 이게 더 중요합니다. 전투 중 인벤토리를 열었을 때 아이템 사용 버튼이 어디 있는지 헤매게 만들면, 그 순간 게임의 긴장감이 완전히 깨집니다.
2. 신뢰감과 완성도를 만든다
유저는 UI 일관성을 의식적으로 분석하지 않습니다. 하지만 무의식적으로는 느낍니다. 일관성이 있는 앱은 "잘 만들어진 제품"이라는 느낌을 주고, 없는 앱은 "어딘가 허술한 제품"으로 인식됩니다.
게임으로 치면, 아무리 그래픽이 좋아도 UI가 들쭉날쭉하면 전체적인 완성도가 낮아 보입니다. 인디게임에서 특히 자주 보이는 문제입니다. 게임플레이는 재미있는데 UI 때문에 평가가 깎이는 경우가 많습니다.
3. 접근성(Accessibility)에 직결된다
폰트 크기와 굵기의 일관된 체계는 시각적으로 약한 유저들도 정보를 쉽게 구분하게 해줍니다. 색상 일관성은 색각 이상 유저에게 중요한 맥락 정보를 제공합니다. 일관성은 곧 접근성입니다.
폰트 패밀리가 특히 중요한 이유
폰트 패밀리(Font Family)란?
폰트 패밀리는 같은 디자인 철학을 공유하는 여러 굵기와 스타일의 폰트 묶음입니다.
예를 들어 Noto Sans KR 폰트 패밀리는 이런 구성입니다.
Noto Sans KR Thin (100)
Noto Sans KR Light (300)
Noto Sans KR Regular (400) ← 본문
Noto Sans KR Medium (500)
Noto Sans KR Bold (700) ← 제목
Noto Sans KR Black (900)
같은 패밀리 안에서 굵기만 바꾸면 시각적 리듬이 자연스럽게 유지됩니다. 반면 서로 다른 패밀리를 섞으면 아무리 잘 배치해도 이질감이 생깁니다.
폰트를 섞으면 생기는 문제
자소 간격(kerning)과 획의 굵기 기준이 달라집니다.
나눔고딕의 'ㄱ'과 고딕A1의 'ㄱ'은 같은 한글이지만 공간을 차지하는 방식이 다릅니다. 이 두 폰트를 같은 화면에 쓰면 텍스트 블록들이 미묘하게 어긋나 보입니다. 유저는 왜 이상한지 설명하지 못하지만 불편함을 느낍니다.
글자 크기 기준이 달라집니다.
14px의 나눔고딕과 14px의 맑은 고딕은 실제로 보이는 크기가 다릅니다. 폰트마다 em 크기 기준이 다르기 때문입니다. 결과적으로 같은 사이즈 값을 썼는데도 레이아웃이 화면마다 달라집니다.
브랜드 정체성이 흐릿해집니다.
성공한 게임과 앱은 폰트만 봐도 브랜드가 느껴집니다. 리그 오브 레전드의 Beaufort 체, 오버워치의 굵고 강렬한 서체, 원신의 얇고 섬세한 폰트처럼요. 이건 하나의 폰트 패밀리를 일관되게 사용했기 때문에 가능한 일입니다.
왜 중요한가? — 개발자 입장에서
1. 유지보수 비용이 극적으로 줄어든다
디자인 시스템 없이 개발된 앱을 상상해보겠습니다. 버튼 색상이 바뀌면 어떻게 될까요?
// 일관성 없는 코드 — 모든 파일을 수정해야 한다
// login_screen.dart
Container(color: Color(0xFF2563EB), ...)
// settings_screen.dart
ElevatedButton(style: ButtonStyle(backgroundColor: Color(0xFF2563EB)), ...)
// profile_screen.dart
TextButton(style: TextStyle(color: Color(0xFF2563EB)), ...)
색상 하나를 바꾸려면 프로젝트 전체를 검색해서 하나하나 수정해야 합니다. 실수로 하나 빠뜨리면 버그가 됩니다.
반면 디자인 토큰을 사용하면 이렇게 됩니다.
// 디자인 토큰 정의
class AppColors {
static const primary = Color(0xFF2563EB);
}
class AppTextStyles {
static const heading = TextStyle(
fontFamily: 'NotoSansKR',
fontSize: 24,
fontWeight: FontWeight.w700,
);
static const body = TextStyle(
fontFamily: 'NotoSansKR',
fontSize: 16,
fontWeight: FontWeight.w400,
);
}
이제 색상을 바꾸려면 AppColors.primary 하나만 수정하면 됩니다. 한 줄 수정으로 앱 전체가 바뀝니다.
2. 온보딩이 빨라진다
신규 개발자나 디자이너가 합류했을 때, 일관된 UI 시스템이 있으면 빠르게 파악할 수 있습니다. "버튼은 AppButton을 쓰세요, 폰트는 AppTextStyles에 있어요"라고 하면 됩니다. 반대로 각자 자유롭게 만든 코드베이스는 새 팀원이 파악하는 데 훨씬 오래 걸립니다.
3. 디자이너-개발자 커뮤니케이션이 단순해진다
일관된 디자인 시스템이 있으면 디자이너가 "heading1 쓰세요"라고 한 마디 하면 됩니다. 시스템이 없으면 "폰트는 나눔고딕 Bold, 크기는 24px, 색상은 #0f172a, 자간은 -0.5"처럼 매번 세세하게 전달해야 합니다. 전달 과정에서 오류가 생기고, 화면마다 미묘하게 달라집니다.
게임 개발에서의 특수성
앱 개발과 달리 게임 개발에서는 UI 일관성이 훨씬 더 까다롭습니다.
세계관과 UI의 충돌
게임 UI는 단순한 인터페이스가 아니라 세계관의 일부여야 합니다. 판타지 RPG의 인벤토리 창은 낡은 양피지처럼 느껴져야 하고, SF 슈터의 HUD는 홀로그램처럼 보여야 합니다. 그런데 이 과정에서 일관성을 잃으면, 게임의 몰입감이 순식간에 깨집니다.
예를 들어 판타지 RPG인데 시스템 메시지가 현대적인 고딕 폰트로 뜨거나, 세계관에 맞는 손글씨 폰트를 메인 메뉴에는 썼는데 설정 화면에는 시스템 기본 폰트를 쓴다면 유저는 "싸구려 게임"으로 인식합니다.
해상도와 DPI 다양성
모바일 게임이라면 수십 가지 해상도와 DPI 환경에서 UI가 동작해야 합니다. 일관된 크기 체계(예: sp 단위, dp 단위)를 처음부터 적용하지 않으면, 기기마다 텍스트가 잘리거나 버튼이 너무 작게 보이는 문제가 생깁니다.
폰트 렌더링과 성능
폰트 패밀리를 통일하면 폰트 아틀라스(Font Atlas) 생성이 효율적으로 됩니다. Unity의 TextMeshPro나 Unreal Engine의 UMG에서 여러 폰트를 혼용하면 아틀라스가 여러 개 생성되어 드로우 콜이 늘어납니다. 폰트를 하나로 통일하면 아틀라스 하나로 관리할 수 있어 렌더링 성능에도 직접적인 이점이 있습니다.
실무에서 일관성을 유지하는 방법
디자인 토큰 정의하기
프로젝트 초기에 반드시 아래 항목들을 정의하고 코드로 만들어두세요.
Color Tokens
├── primary (주 브랜드 색상)
├── secondary (보조 색상)
├── background (배경)
├── surface (카드, 모달 등 표면)
├── error (에러 상태)
├── success (성공 상태)
└── text / muted (본문 / 비활성 텍스트)
Typography Tokens
├── heading-xl (36px / Bold)
├── heading-lg (28px / Bold)
├── heading-md (22px / SemiBold)
├── body-lg (18px / Regular)
├── body-md (16px / Regular) ← 기본 본문
├── body-sm (14px / Regular)
└── caption (12px / Light)
Spacing Tokens
├── xs (4px)
├── sm (8px)
├── md (16px)
├── lg (24px)
└── xl (32px)
폰트 패밀리 선정 기준
한국어 앱/게임이라면 다음 조건을 충족하는 폰트 패밀리를 선택하세요.
- 한글 완성도: 자소 간격, 획 굵기가 자연스러운가
- 다양한 굵기 지원: 최소 Light / Regular / Bold 세 단계는 있어야 함
- 가독성: 작은 크기(12px)에서도 읽히는가
- 라이선스: 상업적 사용이 가능한가
국내 앱/게임에서 많이 쓰는 추천 폰트 패밀리는 다음과 같습니다.
| 폰트 | 특징 | 라이선스 |
|---|---|---|
| Pretendard | 깔끔한 현대적 고딕, 굵기 9단계 | 무료 상업 사용 |
| Noto Sans KR | Google 제작, 안정적 | 무료 상업 사용 |
| 나눔스퀘어 Neo | 직각 모서리, 게임 UI에 어울림 | 무료 상업 사용 |
| Spoqa Han Sans | 둥근 느낌, 친근한 앱에 적합 | 무료 상업 사용 |
UI 컴포넌트 라이브러리 만들기
"버튼은 항상 AppButton을 쓴다" 같은 규칙을 세우고, 공통 컴포넌트를 만들어두면 일관성이 자연스럽게 유지됩니다. 처음에 시간이 걸려도 나중에 10배의 시간을 아낍니다.
흔히 저지르는 실수들
"나중에 통일하면 되지" — 가장 위험한 생각입니다. 화면이 10개일 때 통일하는 것과 100개일 때 통일하는 것은 난이도가 하늘과 땅 차이입니다. 초기에 잡아야 합니다.
"디자이너가 알아서 하겠지" — 디자이너와 개발자 간에 디자인 시스템이 공유되지 않으면, 디자인은 일관되어도 구현은 제각각이 됩니다. 코드 레벨에서의 토큰화가 필수입니다.
"폰트는 나중에 결정하자" — 폰트에 따라 레이아웃 전체가 바뀝니다. 특히 한글은 영문보다 글자 크기 변화에 민감해서, 개발 후반에 폰트를 바꾸면 UI 전체를 다시 맞춰야 하는 경우가 생깁니다.
정리
| 일관성 없는 UI | 일관된 UI | |
|---|---|---|
| 유저 경험 | 학습 비용 높음, 이질감 | 직관적, 자연스러운 몰입 |
| 유지보수 | 수정 한 번에 파일 수십 개 | 토큰 하나 수정으로 전체 반영 |
| 팀 협업 | 소통 비용 높음 | "heading1 쓰세요" 한 마디로 해결 |
| 성능 (게임) | 드로우 콜 증가 | 폰트 아틀라스 최적화 |
| 완성도 인식 | "허술해 보임" | "잘 만든 제품" 인상 |
일관된 UI와 폰트 패밀리는 비주얼 완성도만의 문제가 아닙니다. 유저 경험, 개발 생산성, 팀 협업, 심지어 게임 성능까지 연결되는 설계의 기초입니다.
프로젝트를 시작할 때 딱 하루만 투자해서 디자인 토큰과 폰트 패밀리를 정의해두세요. 이 하루가 프로젝트 전체를 통틀어 가장 ROI가 높은 작업이 될 것입니다.
