[ Swift ] UIKit VS SwiftUI
![[ Swift ] UIKit VS SwiftUI](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%25EB%25A7%25A4%25EC%259D%25BC%2B%25EC%259E%2591%25EC%258B%25AC%25EC%2582%25BC%25EC%259D%25BC%2B%25EC%258A%25A4%25EC%259C%2584%25ED%2594%2584%25ED%258A%25B8%26tag%3DTemplate%2B1%26description%3DUIKit%2BVS%2BSwiftUI%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%2523ffffff%26bgEndColor%3D%2523ffffff%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3Dhttps%253A%252F%252Fsource.inblog.dev%252Flogo%252F2025-12-09T23%253A46%253A09.465Z-ccd98cb3-d73e-4278-8446-ad640ba3dc13%26blogTitle%3DRN%2B%25EC%2582%25BD%25EC%25A7%2588%2B%25EC%259D%25BC%25EC%25A7%2580&w=3840&q=75)
iOS에서 화면(UI)을 만드는 방식은 크게 3가지로 정리된다.
UIKit + Storyboard/XIB(시각적으로 드래그해서 구성)
UIKit + Code(Programmatic UI)(UIKit을 코드로 구성)
SwiftUI(선언형 UI)
각 방식은 “정답”이 있는 게 아니라 팀 규모, 유지보수, 레거시, 지원 OS, UI 복잡도에 따라 선택 기준이 달라진다.
1) UIKit + Storyboard / XIB
개념
Xcode의 인터페이스 빌더에서 화면을 드래그 앤 드롭으로 구성하고, Auto Layout 제약을 잡은 뒤 IBOutlet/IBAction으로 코드와 연결하는 방식이다.
장점
프로토타이핑이 빠르다. 화면 구조를 시각적으로 바로 만들 수 있다.
진입 장벽이 낮다. UI를 “눈으로 보면서” 조정하기 쉬운 편이다.
레거시 프로젝트와 궁합이 좋다. 기존 앱에서 많이 쓰인다.
단점(실무에서 자주 부딪힘)
Git 충돌이 잦다. storyboard/xib는 파일 구조상 머지가 까다롭다.
런타임 에러가 생기기 쉽다. outlet 연결 누락/타입 불일치가 실행 중 크래시로 이어질 수 있다.
규모가 커질수록 유지보수가 불편해진다. 화면이 많아질수록 파일이 무거워지고 복잡해진다.
재사용/컴포넌트화가 답답해질 수 있다.
추천 상황
작은 프로젝트, 단순한 화면이 많을 때
빠르게 데모/PoC를 만들어야 할 때
기존 코드베이스가 storyboard 중심이라 유지보수가 목적일 때
2) UIKit + Code (Programmatic UI)
개념
UIKit을 그대로 사용하되, UIView 생성부터 addSubview, Auto Layout 제약 설정까지 전부 코드로 작성하는 방식이다. (필요하면 SnapKit 같은 DSL을 쓰기도 한다.)
장점
버전관리/리뷰/머지에 강하다. 화면 변경이 코드 diff로 명확하게 보인다.
재사용/컴포넌트화에 유리하다. 공통 UI(버튼/카드/셀 등)를 모듈로 만들기 쉽다.
동적 UI에 강하다. 조건에 따라 뷰를 만들고 제거하는 로직이 자연스럽다.
타입 안정성이 상대적으로 좋다. 연결 실수(outlet)로 인한 런타임 문제가 줄어드는 편이다.
단점
초반 학습 비용이 있다. Auto Layout을 코드로 다루는 데 익숙해져야 한다.
처음엔 생산성이 떨어질 수 있다. 특히 레이아웃을 처음부터 코드로 짜는 게 부담일 수 있다.
팀 컨벤션이 없으면 코드 스타일이 난잡해질 수 있다.
추천 상황
협업 인원이 많고 코드리뷰/머지가 중요한 팀
공통 컴포넌트 재사용이 많은 서비스
화면이 상태/조건에 따라 많이 바뀌는 앱
장기 유지보수와 확장성이 중요한 프로젝트
3) SwiftUI
개념
SwiftUI는 “어떻게 그릴지(절차)”를 나열하기보다, “현재 상태라면 이렇게 보여야 한다”를 선언하는 방식이다. 상태가 바뀌면 화면이 자동으로 갱신되는 구조다.
장점
코드가 짧고 UI 구조가 읽기 쉬운 편이다.
상태 기반 UI가 자연스럽다. 로딩/에러/빈화면/성공 같은 상태 분기가 깔끔하다.
멀티플랫폼 확장에 유리하다. iOS 중심으로 시작해도 다른 Apple 플랫폼까지 확장할 때 이점이 있다.
점진 도입이 가능하다. 기존 UIKit 앱에서도 “새 화면만 SwiftUI”처럼 섞어 쓸 수 있다.
단점(현업 포인트)
세밀한 커스텀/특수 UI는 UIKit이 더 편한 경우가 있다.
디버깅/성능 튜닝 방식이 다르다. UIKit 경험만으로는 초반에 낯설 수 있다.
지원 OS 범위에 따라 제약이 생긴다. 최신 API를 쓰고 싶어도 최소 버전 때문에 못 쓰는 경우가 있다.
추천 상황
신규 앱/신규 화면을 빠르게 만들고 싶을 때
상태 변화가 많은 화면(리스트/설정/폼 등)이 많을 때
장기적으로 SwiftUI 중심으로 가져가려는 팀
기존 앱이라도 “새 기능부터” 점진적으로 전환하고 싶을 때
4) 요즘 추세
최근 흐름은 신규 개발에서 SwiftUI 비중이 계속 커지는 방향이다. 다만 대형 서비스에는 UIKit 레거시가 크고, 복잡한 커스텀 UI/세밀한 제어는 여전히 UIKit이 강해 혼용(점진 도입)이 현실적인 선택이 되는 경우가 많다. 즉 “SwiftUI가 대세”이긴 하지만 “UIKit이 끝났다”가 아니라, 상황에 맞게 섞어서 쓰는 시대에 가깝다.
🌟 요약
레거시 유지보수 / 정교한 커스텀 UI / 복잡한 제어 → UIKit(코드 기반이 보통 유리하다)
협업/머지/컴포넌트 재사용/확장성 → UIKit(Code) 강점이 크다
신규 개발 / 상태 기반 UI / 빠른 개발 / 멀티플랫폼 고려 → SwiftUI가 유리하다
현실적인 베스트 프랙티스 → 기존 UIKit + 새 화면 SwiftUI 같은 점진 전환이 많다
구분 | UIKit + Storyboard/XIB | UIKit + Code(Programmatic UI) | SwiftUI |
|---|---|---|---|
한 줄 정의 | 화면을 시각적으로 조립하고 코드와 연결 | UIKit을 전부 코드로 구성 | 상태에 따라 UI를 선언형으로 표현 |
UI 작성 방식 | 드래그&드롭 + 제약조건 + IBOutlet/IBAction |
|
|
생산성(초기) | 빠름(프로토타입 강함) | 중간(숙련 전엔 느릴 수 있음) | 빠름(화면 구성 자체가 간결) |
유지보수/확장 | 규모 커질수록 복잡해지기 쉬움 | 규모 커져도 구조화/모듈화하기 좋음 | 구조 잘 잡으면 좋지만, 팀 경험치/버전 제약 영향 큼 |
Git/머지 | 불리함(XML 충돌 잦음) | 유리함(diff가 명확) | 유리함(diff가 명확) |
코드리뷰 | UI 변경 리뷰가 불편한 편 | 매우 유리 | 매우 유리 |
재사용/컴포넌트화 | 상대적으로 불편해질 수 있음 | 강함(컴포넌트 설계 쉬움) | 강함(뷰 조합 쉬움) |
동적 UI(조건/상태에 따라 변화) | 복잡해지기 쉬움 | 강함 | 매우 강함(상태 기반이 자연스러움) |
타입 안정성 | Outlet 실수로 런타임 이슈 가능 | 상대적으로 안전 | 상대적으로 안전 |
디버깅/트러블슈팅 | 연결 문제/제약 문제 추적이 번거로울 때 있음 | 추적이 비교적 명확 | 패러다임이 달라 초반 학습 필요 |
정교한 커스텀 UI/특수 제어 | 가능(레거시/생태계 풍부) | 가장 강한 편 | 가능하지만 UIKit이 더 편한 경우가 존재 |
팀 협업 | 소규모에선 괜찮지만 커지면 충돌 이슈 | 대규모 협업에 유리 | 대규모 협업에 유리(경험치 필요) |
추천 상황 | 작은 앱, 빠른 데모, 레거시 유지 | 대형/장기 프로젝트, 협업/모듈화 중요 | 신규 화면/신규 앱, 상태 중심 UI, 점진 도입 |
대표 단점 요약 | 머지/연결 실수/대규모 관리 | 초기 학습 비용/레이아웃 코드 작성 부담 | OS/팀 경험/세밀한 커스텀에서 제약 가능 |
요즘 추세 | 유지보수 위주로 남는 편 | UIKit 쓰는 팀은 코드 기반 선호 | 신규 개발에서 비중 증가, 혼용(점진 도입) 많음 |