Rest APIs and SwiftUI

Ellie Huxtable

REST API와 SwiftUI

최근에 SwiftUI 뷰에서 REST API의 데이터를 어떻게 가져와 렌더링하는지 물어본 분이 있었어요.

React 같은 것을 사용해 왔다면 실제로는 조금 다르게 처리한다는 점을 알아야 해요. init이나 onAppear에서 요청을 날리고 @State를 업데이트하면 되는 게 아니거든요. escaping 클로저가 까다롭고, struct는 변경할 수 없고, 뭐 그런 문제들이 있어요.

다행히 SwiftUI에는 이런 문제에 도움을 줄 수 있는 구성 요소들이 있어요 :) 다만 여기서는 GET 요청 등을 만드는 방법을 자세히 다루지는 않을게요. 저는 Just를 즐겨 사용해요.

자, 먼저 뷰부터 만들어 볼게요.

struct UserProfile: View {
    @ObservedObject user: User = User(username: "elm", name: "Ellie")

    var body: some View {
    	VStack {
        	Text("Username: \(self.user.username)")
        	Text("Name: \(self.user.name)")
        }
    }
}

그럼 여기서 user 객체는 어떻게 불러오면 될까요? @State일까요?

사실 그렇지 않아요. ObservableObject라는 것이 있어요. @Published 프로퍼티를 가진 객체예요. @Published 프로퍼티가 업데이트되면 이 객체를 포함하고 있는 모든 뷰에서 업데이트가 발생해요.

예를 보면 좀 더 쉽게 이해할 수 있을 거예요.

struct User: ObservableObject {
    @Published var username: String
    @Published var name: String

    init(username: String, name: String) {
    	self.username = username
        self.name = name
        
        self.load()
    }
    
    func load() {
    	somehowRequestDataAsynchronously();
        // so basically just change `username` or `name` in here
    }
}

뷰는 본질적으로 ‘관찰 가능한’ 무언가를 ‘관찰’하는 셈이에요. 즉, @ObservedObject@ObservableObject를 사용하는 거죠. 우리가 관찰하고 있는 객체의 @Published 프로퍼티가 업데이트되는 즉시 다시 렌더링되고, 뷰가 업데이트돼요!

이제 좀 정리가 됐기를 바라요!

원문은 Ellie Huxtable님이 에 게재했습니다.

이 글은 gpt-5.6-terra 모델을 사용해 번역했습니다.