반응형
SwiftUI 성능 문제 실전 케이스 (List, Navigation, WebView 최적화)
SwiftUI는 생산성이 높지만, 조금만 구조가 복잡해지면 성능 문제가 바로 드러납니다.
특히 실무에서는 다음 3가지에서 문제가 많이 발생합니다.
- List / Scroll 성능
- NavigationStack 상태 꼬임
- WKWebView 렌더링 문제
이 글에서는 실제로 많이 발생하는 케이스와 해결 방법을 정리합니다.
1. Case 1: List 스크롤 끊김
문제
- 스크롤 시 버벅임
- 프레임 드랍
원인
- Heavy View 포함
- 이미지 로딩 과다
- 불필요한 재렌더링
잘못된 코드
List(items) { item in
HeavyView(item: item)
}
해결 방법
struct ItemRow: View {
let item: Item
var body: some View {
Text(item.title)
}
}
List(items) { item in
ItemRow(item: item)
}
- View 분리
- 이미지 캐싱 사용
- 필요한 부분만 렌더링
2. Case 2: NavigationStack push 지연
문제
- 화면 전환 시 딜레이
- push 시 끊김
원인
- Destination View가 무거움
- onAppear에서 API 호출
해결 방법
.navigationDestination(for: Route.self) { route in
switch route {
case .detail(let id):
DetailView(id: id)
.task {
await loadData()
}
}
}
- View 생성 최소화
- 데이터 로딩 지연 처리
3. Case 3: WebView 로딩 지연
문제
- WebView 진입 시 느림
- 깜빡임 발생
원인
- 매번 새 WKWebView 생성
- 쿠키 재설정
해결 방법
class WebViewStore: ObservableObject {
let webView = WKWebView()
}
@StateObject private var store = WebViewStore()
- WebView 재사용
- 쿠키 한 번만 설정
4. Case 4: body 과도 호출
문제
- View가 계속 다시 그려짐
원인
- State 범위 과다
- 불필요한 ObservableObject
해결 방법
- State 최소화
- View 분리
- EquatableView 활용
5. Case 5: ScrollView 메모리 증가
문제
- 메모리 계속 증가
원인
- LazyStack 미사용
해결
ScrollView {
LazyVStack {
ForEach(items) { item in
ItemView(item: item)
}
}
}
6. 성능 최적화 핵심 정리
| 문제 | 해결 |
|---|---|
| List 렉 | View 분리 |
| Navigation 지연 | lazy 로딩 |
| WebView 느림 | 재사용 |
| body 호출 과다 | State 분리 |
| 메모리 증가 | LazyStack |
7. 실무 체크리스트
- LazyStack 사용 여부
- State 범위 최소화
- WebView 재사용
- 이미지 캐싱
- View 분리
8. 결론
SwiftUI 성능의 핵심은 다음입니다.
불필요한 View 생성과 Layout 계산을 줄이는 것
- State → 최소화
- View → 분리
- Layout → 단순화
이 원칙만 지켜도 대부분의 성능 문제를 해결할 수 있습니다.
다음 글에서는 SwiftUI 애니메이션 실무 (버벅임 없이 구현하는 방법)을 다루면 UI 완성도가 크게 올라갑니다.
반응형
'IT' 카테고리의 다른 글
| SwiftUI 키보드 대응 완벽 가이드 (입력창 가림, 자동 스크롤 문제 해결) (0) | 2026.04.03 |
|---|---|
| SwiftUI 애니메이션 실무 가이드 (버벅임 없이 자연스럽게 구현하는 방법) (0) | 2026.04.03 |
| SwiftUI Navigation + WebView 연동 완벽 가이드 (딥링크, 푸시, 라우팅까지) (0) | 2026.04.03 |
| SwiftUI WKWebView 완전 정리 (쿠키, 로그인 유지, JS 통신까지) (0) | 2026.04.03 |
| SwiftUI SafeArea 완벽 이해 (layout 깨짐, NavigationBar 겹침 해결) (0) | 2026.04.03 |