내일배움캠프 iOS

UIKit) TIL # 34 CRUD (CoreData , Networking)

yjuni22 2024. 12. 5. 21:30

CRUD란?

  • Create = 데이터 생성
  • Read = 데이터 읽기
  • Update = 데이터 업데이트 (쓰기)
  • Delete = 데이터 삭제

Swift 로 기기 내 디스크에 데이터를 저장할 수 있는 대표적인 방법으로는 CoreData 와 UserDefaults 가 있음.

UserDefaults

  • Key-Value 기반의 경량 데이터 저장소.
  • 데이터를 파일 형태로 로컬 디스크에 저장.
  • iOS에서 제공하는 가장 단순한 데이터 저장 방식.
  • 간단한 설정 데이터(예: 사용자 선호, 앱 설정) 저장.
  • 사용자 로그인 상태, 점수, 간단한 문자열 등의 저장.
  • 데이터를 구조적으로 저장하거나 검색하지 않아도 되는 경우.

장점:

  1. 간단한 사용법:
    • Key-Value 쌍으로 데이터를 저장하고 읽는 방식이 간단합니다.
  2. 빠른 저장 및 읽기:
    • 작은 데이터를 저장하고 읽는 데 최적화되어 있습니다.

단점:

  1. 데이터 용량 제한:
    • UserDefaults는 경량 데이터(작은 문자열, 숫자, Bool 등) 저장에 적합하며, 수백 KB 이상의 데이터를 저장하면 성능에 문제가 발생할 수 있습니다.
  2. 복잡한 구조 관리 불가:
    • 관계형 데이터(예: 객체 간의 참조)를 저장하거나, 대량의 데이터를 관리하는 데 적합하지 않습니다.
  3. 데이터 무결성 보장 부족:
    • UserDefaults는 데이터베이스가 아니므로, 데이터 무결성을 보장하지 않습니다.

 

CoreData 란?

  • CoreData 는 앱에서 기기의 디스크에 데이터를 읽고 쓸 수 있게 돕는 프레임워크.
  • 복잡한 데이터 구조와 관계형 데이터를 관리하기 위해 설계.

장점:

  1. 복잡한 데이터 관리 가능:
    • 관계형 데이터(객체 간의 관계), 페이징, 정렬, 필터링 등 고급 기능을 지원합니다.
  2. 성능 최적화:
    • 대량의 데이터를 처리하거나 조건에 따라 데이터를 검색할 때 성능이 뛰어납니다.

단점:

  1. 초기 설정 및 사용이 복잡:
    • Core Data는 설계와 초기 설정에 시간이 걸립니다.
  2. 오버헤드:
    • 간단한 데이터를 저장하거나 빠르게 작업해야 하는 경우에는 불필요한 복잡성과 오버헤드가 발생할 수 있습니다.

 

CoreData 의 C, R

 func createData(name: String, phoneNumber: String) {
        guard let entity = NSEntityDescription.entity(forEntityName: PhoneBook.className, in: self.container.viewContext) else { return }
        let newPhoneBook = NSManagedObject(entity: entity, insertInto: self.container.viewContext)
        newPhoneBook.setValue(name, forKey: PhoneBook.Key.name)
        newPhoneBook.setValue(phoneNumber, forKey: PhoneBook.Key.phoneNumber)
        
        do {
            try self.container.viewContext.save()
            print("문맥 저장 성공")
        } catch {
            print("문맥 저장 실패")
        }
    }

    func readAllData() {
        do {
            let phoneBooks = try self.container.viewContext.fetch(PhoneBook.fetchRequest())
            
            for phoneBook in phoneBooks as [NSManagedObject] {
                if let name = phoneBook.value(forKey: PhoneBook.Key.name) as? String,
                   let phoneNumber = phoneBook.value(forKey: PhoneBook.Key.phoneNumber) {
                    print("name: \(name), phoneNumber: \(phoneNumber)")
                }
            }
        } catch {
            print("데이터 읽기 실패")
        }
    }

 

 

UserDefaults 코드

 

 // Create
        UserDefaults.standard.set("010-1111-2222", forKey: "phoneNumber")
        
        // Read
        let phoneNumber = UserDefaults.standard.string(forKey: "phoneNumber")
        print("저장된 전화번호: \(phoneNumber)")
        
        // Update
        // 같은 키에다가 set 을 하면 됨.
        UserDefaults.standard.set("010-6666-7777", forKey: "phoneNumber")
        let newPhoneNumber = UserDefaults.standard.string(forKey: "phoneNumber")
        print("바뀐 전화번호: \(newPhoneNumber)")
        
        // Delete
        UserDefaults.standard.removeObject(forKey: "phoneNumber")
        print("전화번호가 남아있는가: \(UserDefaults.standard.string(forKey: "phoneNumber"))")

 

UserDefaults 는 가장 간단한 사용방법 이기에 

  • 간단한 설정 데이터(예: 사용자 선호, 앱 설정) 저장.
  • 사용자 로그인 상태, 점수, 간단한 문자열 등의 저장.
  • 데이터를 구조적으로 저장하거나 검색하지 않아도 되는 경우.

에 손쉽게 사용할 수 있다.


Networking

네트워킹을 알기 전에

JSON데이터를 사용한다는 기본 개념이 있어야 한다.

서버와의 통신은 API 로 한다.

서버와의 통신에서 CRUD 가 이루어 질 때 

JSON 형태의 데이터로 전달한다.

 

우리는 스위프트 언어로 인코딩, 디코딩을 하여 데이터를 읽을 수 있다.

 

URLSession 을 사용하여 통신을 한다.