Swift Academy · 강의

본문 재평가 최소화

불필요한 뷰 재계산을 줄입니다.

레슨 2/413개 단계

본문 재평가 최소화은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

body는 자주 다시 계산됩니다

SwiftUI는 입력값이 변경될 때마다 뷰의 body를 호출합니다. 무겁거나 지나치게 많은 요소와 연결된 body는 너무 자주 다시 계산되어 성능을 저하시킵니다.

다시 평가되는 원인

뷰가 읽는 @State, @Binding, 관찰 대상 객체 또는 환경 값이 변경되거나, 부모가 새 값을 전달하면 body가 다시 실행됩니다.

struct Row: View {
    let title: String // changes -> body re-runs
    var body: some View { Text(title) }
}

관찰 범위 좁히기

뷰가 전체 대형 model을 읽으면 해당 model의 모든 변경으로 body가 다시 실행됩니다. 뷰에 필요한 구체적인 값만 전달하세요.

// Instead of passing the whole model:
struct Price: View {
    let amount: Decimal // narrow input
    var body: some View { Text(amount, format: .currency(code: "USD")) }
}

큰 뷰 나누기

거대한 body를 작은 하위 뷰로 나누세요. SwiftUI는 전체 화면이 아니라 실제로 입력값이 변경된 하위 뷰만 다시 평가합니다.

struct Screen: View {
    var body: some View {
        VStack {
            Header()   // re-runs only if its inputs change
            ItemList()
            Footer()
        }
    }
}

Observable과 필드 수준 추적

@Observable 매크로를 사용하면 SwiftUI가 뷰에서 읽는 정확한 프로퍼티를 추적합니다. model.name만 읽는 뷰는 model.count의 변경을 무시합니다.

@Observable final class Model {
    var name = ""
    var count = 0
}
// A view reading only name won’t re-run when count changes

body에서 작업 피하기

body는 UI를 저렴하게 설명해야 합니다. 비용이 큰 계산(정렬, 필터링)은 model이나 캐시된 프로퍼티에 두고, 모든 body 호출마다 다시 계산하지 마세요.

// Bad: sort inside body (runs every recompute)
// Good: sort once in the model, expose sorted array

안정적인 클로저와 입력값

렌더링할 때마다 새로 만든 배열이나 클로저를 전달하면 SwiftUI의 동일성 검사를 무력화할 수 있습니다. 안정적인 값을 상위 범위로 옮겨 다시 계산할 때도 입력값이 동일하게 비교되도록 하세요.

// Hoist constants out of body
private let columns = [GridItem(.flexible())]

비용이 큰 초기화 구문 주의하기

뷰의 init은 여러 번 실행될 수 있습니다. SwiftUI는 뷰를 렌더링하지 않을 때도 뷰 값을 자주 만들므로, 그 안에서 비용이 큰 작업을 하지 마세요.

struct Card: View {
    init(_ item: Item) { /* keep this trivial */ }
    var body: some View { Text("Card") }
}

환경 값 읽기는 업데이트를 유발합니다

환경 값을 읽으면 뷰가 해당 값의 변경을 구독합니다. 다시 평가되는 범위를 제한하려면 필요한 가장 작은 하위 뷰에서만 환경 값을 읽으세요.

@Environment(\.colorScheme) private var scheme

지연 container

LazyVStack/LazyHStack과 List를 사용하면 화면 밖의 row가 필요할 때까지 만들어지지 않으므로, 큰 컬렉션에서 body 호출을 줄일 수 있습니다.

ScrollView {
    LazyVStack {
        ForEach(items) { RowView(item: $0) }
    }
}

측정한 후 최적화하기

어떤 body가 병목인지 추측하지 마세요. SwiftUI 계측 도구로 body 평가 횟수가 높은 뷰를 찾은 다음 해당 뷰에 이 기법을 적용하세요.

빠른 확인: 다시 평가하기

body 재평가에 대한 이해도를 테스트합니다.

복습: body 재평가 최소화하기

입력값이 변경되면 body가 다시 실행되므로, 범위가 좁은 값만 전달하고 큰 뷰를 작은 하위 뷰로 나누며 @Observable의 필드 수준 추적을 활용하세요. body와 초기화 구문을 가볍게 유지하고, 안정적인 입력값을 상위 범위로 옮기며, 환경 값 읽기를 최소화하고, 큰 컬렉션에는 지연 container를 사용하세요.

최적화하기 전에 항상 SwiftUI 계측 도구로 병목 지점을 확인하세요.

무료로 시작

AI 튜터와 함께 Swift을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
122
레슨
409

자주 묻는 질문

“본문 재평가 최소화” 강의는 무료인가요?

네 — “본문 재평가 최소화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“본문 재평가 최소화”에서 뭘 배우나요?

불필요한 뷰 재계산을 줄입니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“본문 재평가 최소화” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 뷰 동일성 이해하기
  2. 본문 재평가 최소화
  3. Equatable 뷰와 @State 범위
  4. SwiftUI Instrument로 프로파일링하기
← Swift Academy(으)로 돌아가기