Apple의 SystemLanguageModel은 모델 상태를 사용 가능과 사용할 수 없음이라는 두 갈래로 확인할 수 있도록 합니다. 공식 availability 설명을 먼저 확인하고, 이번 주에는 입력과 답변만 있는 작은 SwiftUI 기능부터 만들어 보세요. 개발 도구가 프로젝트를 빌드한다고 해서 실행 환경에서도 모델 호출이 된다는 뜻은 아닙니다. 먼저 호환 환경을 확인하고, 호출할 수 없는 경우의 안내 화면도 함께 준비해야 합니다.
이 글은 SwiftUI를 막 배우며 첫 텍스트 생성 기능을 만들어 보려는 학생을 위한 안내입니다.
간단한 화면은 만들었지만 Apple Foundation Models 요청 방법을 모르는 초보자도 따라 할 수 있습니다.
로컬 맥이 없어 원격 맥에서 수업 과제를 준비하려는 경우에는 실제 할당 환경의 지원 여부부터 확인하세요.
마지막 업데이트: 2026년 9월 25일. API와 환경 조건은 Apple의 Foundation Models 문서 및 아래에 연결한 개발자 문서를 기준으로 확인했습니다. 도구나 시스템 요구 사항이 바뀌면 프로젝트에 적용하기 전에 다시 대조하세요.
첫 단계: 모델 호출보다 화면 범위부터 좁히기
첫 과제의 목표는 AI 비서나 도구 호출이 아닙니다. 질문 한 줄을 입력하고, 버튼을 눌러 시스템 모델에 전달한 뒤, 받은 답변을 화면에 표시하는 데까지만 구현하세요. 작은 기능 하나로 입력, 상태 변경, 비동기 요청, 결과 표시라는 기본 흐름을 점검할 수 있습니다.
SwiftUI 화면을 수업 과제지에 비유하면, @State는 네가 적은 답을 담아 두는 칸이고 화면은 그 칸의 값이 바뀔 때 다시 그려지는 결과물입니다. Apple의 SwiftUI 상태 문서도 상태와 화면 갱신의 관계를 설명합니다. 첫 화면에서는 입력창, 실행 버튼, 안내 또는 답변 영역만 남겨 두세요.
| 구현 선택 | 확인할 수 있는 점 | 첫 과제에서의 판단 |
|---|---|---|
| 입력창과 고정 답변 문구 | 입력과 화면 갱신 | 화면을 먼저 확인할 때 적합합니다. |
| 입력창과 실제 모델 요청 | 입력부터 응답 표시까지 | 환경 확인을 마친 뒤 진행합니다. |
| 이미지, 도구 호출, 여러 기능을 한꺼번에 추가 | 복잡한 요청과 여러 실패 원인 | 첫 호출을 검증한 다음으로 미룹니다. |
먼저 고정 답변 문구로 버튼을 눌렀을 때 화면 상태가 바뀌는지 살펴보세요. 여기서도 변화가 없다면 모델 문제가 아니라 입력값 연결이나 상태 관리부터 확인해야 합니다.
환경 확인: 빌드 가능성과 실제 사용 가능성 나누기
프로젝트를 열기 전에 개발 도구, 실행할 운영 체제, 모델의 현재 사용 가능성을 따로 확인하세요. Apple의 Xcode 시스템 요구 사항은 Xcode 버전별 지원 환경을 안내합니다. Xcode 27을 사용한다면 프로젝트에서 선택한 SDK와 실행 대상이 해당 문서의 요구 사항에 맞는지 확인해야 합니다. 버전 이름만 보고 모든 맥에서 같은 기능을 쓸 수 있다고 판단하지 마세요.
| 확인 항목 | 무엇을 살펴보나요? | 확인 결과가 맞지 않을 때 |
|---|---|---|
| 개발 도구와 SDK | 설치된 Xcode와 프로젝트에서 선택한 SDK가 필요한 API를 제공하는지 확인합니다. | 공식 시스템 요구 사항을 확인하고 지원되는 도구 환경을 준비합니다. |
| 실행 대상 | 앱을 실행할 운영 체제와 기기가 프로젝트 조건에 맞는지 확인합니다. | 지원 여부를 확인할 수 있을 때까지 실제 호출 검증을 보류합니다. |
| 모델 availability | 앱 실행 중 SystemLanguageModel의 상태를 읽습니다. | 상태에 맞는 안내를 띄우고 화면 구현은 계속합니다. |
특히 원격 맥을 이용한다면 상품 이름이나 접속 가능 여부만으로 모델 호출을 보장할 수 없습니다. 실제로 배정된 맥의 환경과 모델 상태를 확인해야 합니다. VMSPIN의 원격 맥 환경을 살펴보더라도, 학습에 필요한 조건은 주문 전에 개별적으로 확인하세요.
주의: 시뮬레이터에서 화면이 열리거나 프로젝트가 빌드되는 것만으로 실제 모델 응답을 확인한 것은 아닙니다. 화면 동작, 요청 시도, 모델 사용 가능 여부를 서로 다른 결과로 기록하세요.
화면 완성: 입력과 상태 변화를 먼저 검수하기
화면은 입력값, 실행 상태, 안내 문구, 답변을 각각 구분해 두면 실패 원인을 찾기 쉽습니다. 예를 들어 상태 문구는 “질문을 입력하세요”, “요청 중입니다”, “모델을 사용할 수 없습니다”처럼 사용자가 다음 행동을 알 수 있게 작성하세요. 로딩 표시만 계속 남겨 두면 요청이 시작되지 않은 것인지, 환경 조건이 맞지 않는 것인지 구분할 수 없습니다.
화면을 먼저 실행한 뒤 다음 조건을 살펴보세요.
- 입력한 문장이 입력창에 보입니다.
- 버튼을 누르면 안내 문구나 진행 상태가 바뀝니다.
- 입력이 비어 있을 때 요청을 보내지 않거나, 입력을 요청하는 문구를 표시합니다.
- 모델을 쓸 수 없는 경우에도 화면에 상황이 드러납니다.
이 단계에서 모델을 부르지 않아도 화면 연습은 진행할 수 있습니다. 다만 테스트용 문장을 답변처럼 표시했다면 임시 응답이라는 점을 분명히 하세요. 그래야 화면 검수 결과를 실제 모델 호출 성공으로 오해하지 않습니다.
첫 요청: 세션과 질문을 한 흐름으로 연결하기
Foundation Models 프레임워크를 사용하려면 FoundationModels를 가져오고, LanguageModelSession을 만들어 질문을 전달합니다. 세션은 한 번의 대화 흐름을 맡는 대화 노트, 프롬프트는 그 노트에 적어 모델에 건네는 질문이라고 생각하면 됩니다. 세션 문서와 응답 메서드 설명에 나온 API를 프로젝트의 SDK와 대조하세요.
import FoundationModels
import SwiftUI
struct PracticeView: View {
@State private var prompt = ""
@State private var answer = ""
@State private var message = ""
var body: some View {
VStack {
TextField("질문을 입력하세요", text: $prompt)
Button("질문하기") {
Task {
await askModel()
}
}
Text(message)
Text(answer)
}
.padding()
}
@MainActor
private func askModel() async {
switch SystemLanguageModel.default.availability {
case .available:
message = "답변을 기다리는 중입니다."
case .unavailable:
message = "현재 환경에서 모델을 사용할 수 없습니다."
return
}
do {
let session = LanguageModelSession()
let response = try await session.respond(to: prompt)
answer = response.content
message = ""
} catch {
message = "요청을 완료하지 못했습니다. 환경과 입력을 확인하세요."
}
}
}
이 코드는 기본 연결 흐름을 보여 줍니다. 프로젝트에서 API 이름이나 사용할 수 있는 플랫폼 조건이 다르게 표시된다면 추측해 고치지 말고 Foundation Models 프레임워크 문서의 현재 설명을 확인하세요. 첫 연습에서는 텍스트 요청과 답변 표시까지만 검증하고 이미지, 도구 호출, 복잡한 지시문은 추가하지 않는 편이 좋습니다.
호출 점검: 사용할 수 없음과 요청 오류 구별하기
SystemLanguageModel의 availability는 런타임에 확인합니다. 사용 불가 상태의 이유에는 기기 지원 여부, Apple Intelligence 설정, 모델 준비 상태와 관련된 항목이 있습니다. 구체적인 이유 이름과 의미는 Apple이 정리한 사용 불가 이유를 기준으로 처리하세요. 상태별 원인을 하나로 뭉뚱그려 “오류”라고만 표시하지 말고, 사용자가 설정을 확인해야 하는지 다른 환경이 필요한지 안내해야 합니다.
availability를 확인한 결과가 사용 가능이면 세션에 요청을 보냅니다. 사용할 수 없는 상태라면 이유를 기록하고, 앱에는 다음 행동을 알려 주는 문구를 보여 주세요. 요청이 예외로 끝났을 때도 답변 영역에 성공한 것처럼 보이는 텍스트를 남기지 마세요.
완료 기준은 아래 결과를 따로 적는 것입니다.
- 화면에서 입력과 버튼 동작을 확인했습니다.
- 코드가 모델 요청을 시작했습니다.
- 실행 환경에서 availability가 사용 가능으로 확인됐습니다.
- 응답을 받아 답변 영역에 표시했습니다.
앞 단계가 성공해도 뒤 단계까지 성공했다는 뜻은 아닙니다. 특히 기기나 모델 상태를 확인하지 못했다면 결과를 “호출 성공”으로 기록하지 마세요.
자주 묻는 질문
모델이 아직 준비되지 않았을 때도 페이지를 완성할 수 있나요?
가능합니다. 입력값과 버튼 반응, 로딩 표시, 사용 불가 안내를 구현하고 고정 문구로 화면 갱신을 시험하세요. 단, 고정 문구는 모델 응답을 대신하지 않습니다. 실제 응답이 필요한 검증은 SystemLanguageModel의 상태가 사용 가능으로 확인되는 환경에서 따로 진행하고, 화면 검수와 모델 검수 결과를 구분해 기록하세요.
시뮬레이터와 실제 기기에서 확인할 결과는 어떻게 다른가요?
시뮬레이터에서 확인한 화면 표시나 빌드 결과는 UI와 프로젝트 구성을 점검하는 데 도움이 됩니다. 하지만 그것만으로 실행 환경의 Foundation Models 사용 가능성까지 입증되지는 않습니다. 실제 모델 호출이 과제의 검수 조건이라면 대상 환경에서 availability를 확인하고 응답을 받아 보세요. 지원 여부는 공식 문서와 실제 실행 상태를 함께 기준으로 삼아야 합니다.
원격 맥에서도 첫 프로젝트를 진행할 수 있나요?
코드 작성과 SwiftUI 화면 연습은 원격 맥에서 진행할 수 있습니다. 실제 모델 호출은 배정된 환경의 운영 체제, 개발 도구, 기기 조건, 모델 availability에 따라 달라질 수 있으므로 미리 된다고 단정하지 마세요. 이용 조건과 요금 안내를 확인하고, 필요한 모델 검증까지 가능한 환경인지 먼저 문의하거나 점검한 뒤 선택하세요.
Xcode 27을 설치하면 바로 모델을 호출할 수 있나요?
Xcode 27의 설치 여부만으로 호출 가능성을 판단할 수 없습니다. Xcode 시스템 요구 사항과 프로젝트 SDK 조건을 확인한 다음, 앱이 실행되는 환경에서 SystemLanguageModel의 availability를 읽어야 합니다. 빌드 성공은 개발 도구가 코드를 처리했다는 확인일 뿐입니다. 모델 상태가 사용할 수 없음으로 나오면 안내 화면을 완성하고, 조건을 충족하는 환경에서 다시 검증하세요.
화면 연습만 필요하다면 기존 컴퓨터에서 고정 응답으로 UI를 만들고, 실제 호출 검증은 지원되는 기기에서 진행하는 방법이 알맞습니다. 반면 학교 컴퓨터의 설치 권한 부족이나 개인 맥 부재로 호환 환경을 시험할 수 없다면, 현재 환경의 제약을 먼저 확인한 뒤 임시 원격 맥을 검토할 수 있습니다. 다만 원격 접속은 네트워크 상태에 영향을 받고, 배정 환경이 모델 호출 조건을 충족한다는 보장은 없으므로 사전 확인이 필요합니다. 장기간 같은 환경에서 무거운 작업을 계속할 계획이거나 물리적인 기기 연결이 필요한 경우라면 직접 보유한 맥이 더 맞을 수 있습니다. 짧은 수업 과제나 호환성 시험이 목적이라면 VMSPIN의 이용 조건을 확인하고, 실제로 배정되는 환경이 필요한 조건을 충족하는지 확인한 뒤 결정하세요.