질문 1️⃣ : URLSession에 대해 아는대로 설명해주세요.
URLSession은 iOS에서 네트워크 통신을 하는 객체로,
백그라운드에서 비동기적으로 네트워크 데이터를 가져오거나 보내는 작업을 수행하는 객체입니다.
URLSession은 cash와 cookie의 기능도 가지고 있으며,
configuration 프로퍼티를 통해 다양한 네트워킹 설정을 할 수 있습니다.
간단한 요청일 경우 .shared 프로퍼티를 사용하기도 합니다.
네트워크로 주고받는 파일은 주로 JSON 형식으로 정의됩니다.
JSON과 Swift 데이터 모델 간 변환을 수행할 때
Decodable 또는 Incodable, 또는 이 둘이 결합된 Codable 프로토콜을 사용할 수 있습니다.
질문 2️⃣ : 앱의 콘텐츠나 데이터 자체를 내부 저장/보관하는 특별한 객체로는 무엇이 있는지 아는 대로 설명해주세요.
내부 저장소란, 앱 종료와 함께 사라지지 않는 데이터를 저장하기 위해 사용되는 개념입니다.
UserDefaults, KeyChain, 파일 시스템, CoreData 등이 있습니다.
(4가지 모두 앱에 저장됩니다.)
▶️ UserDefaults
userDefaults는 간단한 key-value 데이터를 저장하는데 사용됩니다. (key는 String 타입)
주로 설정 값이나 사용자 기본 설정과 같은 작은 데이터를 저장할 때 사용됩니다.
장점: 딕셔너리와 비슷하다(key-value).
단점: 보안상으로 취약하다. 해킹을 당할 경우 key-value가 암호화되지 않은 상태로 공개될 수 있다.
// 데이터 추가 및 업데이트
UserDefaults.standard.set(value, forKey: key)
// 데이터 조회 | value메소드 결과값은 Any? 타입이여서 as를 사용한 타입 변환 후 사용
UserDefaults.standard.value(forKey: key)
// 데이터 조회 | 타입 변환 대신 특정 타입으로 반환할 경우 (String)
UserDefaults.standard.string(forKey: key)
// 데이터 삭제
UserDefaults.standard.removeObject(forKey: key)
▶️ KeyChain
KeyChain은 iOS 앱에서 보안 정보를 안전하게 저장하고 관리하기 위한 매커니즘입니다.
키체인은 사용자의 비밀번호, 토큰, 인증서, 민감한 데이터와 같은 보안 관련 정보를 저장하는데 사용됩니다.
키체인은 암호화되어 있어 앱 외부에서 쉽게 접근할 수 없으며, 사용자 데이터의 안정성을 보장합니다.
장점: 암호화되어있어서 해킹해도 이상한 언어로 보일 것이다.
Add
// MARK: - ADD
// Keychain에 저장할 데이터를 추가하는 쿼리 생성
let addQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword, // Keychain 내에서 다루고자 하는 데이터의 유형을 지정합니다.
kSecAttrService as String: "service", // 데이터를 저장하는 서비스나 앱을 식별하는데 사용됩니다.
kSecAttrAccount as String: "key", // Keychain에서 데이터를 찾거나 식별하는데에 사용됩니다.
kSecValueData as String: "data" // 실제로 Keychain에 저장될 데이터를 의미합니다.
]
// 데이터를 Keychain에 추가합니다.
let addStatus = SecItemAdd(addQuery as CFDictionary, nil)
Get
// MARK: - GET
// Keychain에서 데이터를 조회 위한 쿼리 생성
let getQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword, // Keychain 내에서 다루고자 하는 데이터의 유형을 지정합니다.
kSecAttrService as String: "service", // 데이터를 저장하는 서비스나 앱을 식별하는데 사용됩니다.
kSecAttrAccount as String: "key", // Keychain에서 데이터를 찾거나 식별하는데에 사용됩니다.
kSecReturnData as String: kCFBooleanTrue, // Keychain에서 데이터를 가져올 때 반환할 데이터의 형태를 지정합니다.
kSecMatchLimit as String: kSecMatchLimitOne // 일치하는 항목의 수를 제한하는데 사용됩니다.
]
// 데이터를 Keychain에서 조회합니다.
var item: CFTypeRef?
let getStatus = SecItemCopyMatching(getQuery as CFDictionary, &item)
Update
// MARK: - UPDATE
// Keychain에서 데이터를 업데이트하기 위한 쿼리 생성
let updateQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword, // Keychain 내에서 다루고자 하는 데이터의 유형을 지정합니다.
kSecAttrService as String: "service", // 데이터를 저장하는 서비스나 앱을 식별하는데 사용됩니다.
kSecAttrAccount as String: "key", // Keychain에서 데이터를 찾거나 식별하는데에 사용됩니다.
]
// 업데이트할 데이터로 속성 설정
let attributes: [String: Any] = [
kSecValueData as String: "newData"
]
// 데이터를 Keychain에서 업데이트합니다.
let updateStatus = SecItemUpdate(updateQuery as CFDictionary, attributes as CFDictionary)
Delete
// MARK: - DELETE
// Keychain에서 데이터를 삭제하기 위한 쿼리 생성
let deleteQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword, // Keychain 내에서 다루고자 하는 데이터의 유형을 지정합니다.
kSecAttrService as String: "service", // 데이터를 저장하는 서비스나 앱을 식별하는데 사용됩니다.
kSecAttrAccount as String: "key", // Keychain에서 데이터를 찾거나 식별하는데에 사용됩니다.
]
// 데이터를 Keychain에서 삭제합니다.
let deleteStatus = SecItemDelete(deleteQuery as CFDictionary)
▶️ 파일 시스템
앱 내부 또는 외부 파일 시스템에 데이터를 저장할 수 있습니다.
주로 텍스트 파일, 이미지, 동영상 등의 데이터를 저장할 때 사용됩니다.
Write
let fileName = "example.txt"
let content = "이것은 파일에 쓰여진 내용입니다."
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { // 저장할 위치 지정
let fileURL = dir.appendingPathComponent(fileName) // appendingPathComponent: 파일 URL 가져오기. 없으면 새로 생성
do {
try content.write(to: fileURL, atomically: false, encoding: .utf8) // write: 파일 url에 컨텐츠데이터 저장
print("파일이 성공적으로 생성되었습니다.")
} catch {
print("파일 생성 중 에러가 발생했습니다: \(error.localizedDescription)")
}
}
Read
let fileName = "example.txt"
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = dir.appendingPathComponent(fileName)
do {
let content = try String(contentsOf: fileURL, encoding: .utf8) // 컨텐츠 데이터 가져오기
print("파일 내용: \(content)")
} catch {
print("파일 읽기 중 에러가 발생했습니다: \(error.localizedDescription)")
}
}
▶️ Core Data
CoreData는 앱에서 데이터를 관리하고 영구적으로 저장하는 데 사용되는 프레임워크입니다.
CoreData는 Model, Context, Store coordinator 3개의 stack으로 구성되어 있습니다.
데이터 모델을 정의하고 이를 기반으로 데이터를 읽고 쓸 수 있습니다.
장점: 모델을 구성해서 여러 데이터를 체계적으로 관리할 수 있다.
<Core Data 프레임워크>

Managed Object Model (NSManagedObejctModel) → 애플리케이션의 데이터 모델을 정의하는 객체입니다. 엔티티(Entity)와 그들의 속성들을 정의하고, 이러한 모델은 데이터베이스 스키마에 해당합니다.
Managed Object Context (NSManagedObjectContext) → 애플리케이션의 데이터를 가져오거나 수정하는데 사용되는 객체입니다. 주로 메모리에서 데이터를 관리하고 데이터베이스와 상호 작용합니다.
Persistent Store Coordinator (NSPersistentStoreCoordinator) → 영구 저장소를 관리하고 데이터베이스와의 통신을 담당하는 객체입니다. SQLite, XML, Binary 등 다양한 데이터 저장소 유형과의 연결을 관리합니다.
Persistent Store (NSPersistentStore) → 실제로 데이터를 영구적으로 저장하는데 사용되는 데이터베이스 파일이나 다른 형태의 저장소입니다.
질문 3️⃣ : CoreData의 각 Entity, Attribute, Relationship의 역할을 아는 대로 설명해주세요.
CoreData의 3가지 구성요소 중 Model에서는 앱의 데이터 모델을 정의합니다.
데이터 모델 파일은 Entity, Attribute, Relationship으로 구성됩니다.
But coreData는 DataBase는 아니라는.. 요상한 특징이 있습니다.
▶️ Entity
데이터 구조를 정의하는 것!
Entity는 객체의 유형을 정의하고, 해당 객체들이 갖는 속성들을 나타냅니다.
주요 속성으로 Entity Name, Abstract Entity, Parent Entity, Class Name, Module 등이 있습니다.
▶️ Attribute
프로퍼티와 유사!
Attribute는 Entity가 가지는 속성들을 나타냅니다.
주요 속성으로 Attribute Type, Optional, Validation, Default Value 등이 있습니다.
▶️ Relationship
struct와의 차별점! 두 엔티티 간의 관계를 맺을 수 있는 특징이 CoreData의 큰 장점! (1:1, 1:다, 다:다)
Relationship은 두 개 이상의 Entity가 있을 때 상호 관계를 추가할 수 있습니다.
주요 속성으로 Optional, Destination, Delete Rule, Type 등이 있습니다.
질문 4️⃣ : 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체가 무엇인지 아는대로 설명해주세요.
UIButton, UILabel 등과 같은 앱 화면의 콘텐츠는 모두 UIView입니다.
그리고 이 UIVIew를 관리하는 객체는 UIViewController입니다.
MVC 패턴에서 ViewController는
Model과 View를 관리한다!
UIViewController는
기본 데이터의 변경에 대한 응답으로 뷰의 내용을 업데이트 하고,
뷰와 유저의 interaction에 대해 응답,
뷰 크기 조정 및 전체 인터페이스의 레이아웃 관리,
앱에서 다른 뷰 컨트롤러를 포함한 다른 객체와의 조정(Coordinating)의 책임을 가집니다.
뷰 컨트롤러는 연결되어있는 화면이 나타나고 사라지는
생명주기 단계에 해당되는 함수를 자동적으로 호출합니다.
▪️ loadView()
▪️ loadViewIfNeeded()
▪️ viewDidLoad()
▪️ viewWillAppear(_ animated: Bool)
▪️ viewWillLayoutSubviews()
▪️ viewDidLayoutSubviews()
▪️ viewDidAppear(_ animated: Bool)
▪️ viewWillDisappear(_ animated: Bool)
▪️ viewDidDisappear(_ animated: Bool)
(출처: https://medium.com/@vipandey54/uiviewcontroller-lifecycle-7ca2d36f4f07)
*추가로 UIViewController 객체의 상위 클래스는 UIResponder로, UIResponder는 이벤트에 응답하고 이벤트를 처리하는 역할을 하는 인터페이스 입니다. 이벤트가 발생하면 UIKit은 이벤트를 리스폰더에게 전달하고 리스폰더는 이벤트를 처리하게 됩니다.
'Swift > 기술면접' 카테고리의 다른 글
기술 면접 대비 (1) - UIViewController의 역할 / Optional이란 / 스토리보드와 코드 UI 구현 비교 (0) | 2024.04.04 |
---|