๐Ÿ“‘ Project

[ Project ] WishListApp #3 / CoreData์— ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

EarthSea 2024. 4. 16. 18:09

 

 

 

 

์•ˆ๋…•ํ•˜์„ธ์š”! ๐ŸŒฑ

์˜ค๋Š˜์€ ์–ด์ œ ๋งŒ๋“  ์œ„์‹œ๋ฆฌ์ŠคํŠธ์˜ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ํ•ด๋‹น ์œ„์‹œ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฝ”์–ด๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜๋Š” ์ž‘์—…์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

ํ•จ๊ป˜ ๊ฐ€๋ณด์‹œ์ฃ !

 

 

CoreData ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

์šฐ์„  coreData์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ๊ฒ ์ฃ ?!

 

 

URLSession์—์„œ ๊ฐ€์ ธ์™”๋˜ ๋ฐ์ดํ„ฐ ์ •๋ณด๋“ค ์ค‘ images๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์ฃผ์—ˆ์–ด์š”!

struct Product: Codable {
    let id: Int
    let title, description: String
    let price: Int
    let discountPercentage: Double
    let brand, category: String
    let thumbnail: String
    let images: [String]
}

 

Editor -> Create NSManagedObject Subclass ๋ฅผ ์ด์šฉํ•˜์—ฌ CoreData์˜ ProductData ํด๋ž˜์Šค๋ฅผ ํ˜•์„ฑํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

CoreData์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜

์ „๋ฐ˜์ ์ธ CoreData๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ProductCoreDataManager ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์–ด ๊ทธ ์•ˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  setProductCoreData() ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค์‹œ๋‹ค!

struct ProductCoreDataManager {
    
    // ๋ฐ์ดํ„ฐ ๋งค๋‹ˆ์ €
    static let shared = ProductCoreDataManager()
    private init() {}
    
    // ์•ฑ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    
    // ์ž„์‹œ์ €์žฅ์†Œ
    lazy var context = appDelegate?.persistentContainer.viewContext
    
    // ์—”ํ„ฐํ‹ฐ ์ด๋ฆ„ (์ฝ”์–ด ๋ฐ์ดํ„ฐ์— ์ €์žฅ๋œ ๊ฐ์ฒด)
    let modelName: String = "ProductData"
    
    // TodoData๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ
    mutating func setProductCoreData(data: Product) {
        
        guard let context = context else { return }
        
        let fetchRequest: NSFetchRequest<ProductData> = ProductData.fetchRequest()
        fetchRequest.predicate = NSPredicate(format: "id == %d", data.id)
        
        do {
            let results = try context.fetch(fetchRequest)
            let newData: ProductData
            
            if results.isEmpty {
                // ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
                guard let entity = NSEntityDescription.entity(forEntityName: modelName, in: context) else { return }
                newData = NSManagedObject(entity: entity, insertInto: context) as! ProductData
            } else {
                // ๊ธฐ์กด ๊ฐ์ฒด ์—…๋ฐ์ดํŠธ
                newData = results.first!
            }
            
            // ์†์„ฑ ๊ฐ’ ์„ค์ •
            newData.id = Int64(data.id)
            newData.title = data.title
            newData.productDescription = data.description
            newData.price = Int64(data.price)
            newData.brand = data.brand
            newData.category = data.category
            newData.discountPercentage = data.discountPercentage
            newData.thumbnail = data.thumbnail
            
            // ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ €์žฅ
            try context.save()
            
            print(" ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
        } catch {
            print("Error updating ProductData: \(error)")
        }
    }
}

 

id๊ฐ€ ๋™์ผํ•œ ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ €์žฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์ฃผ์—ˆ์–ด์š”!

์ด์ œ ์ฝ”์–ด๋ฐ์ดํ„ฐ์— ๊ฐ’์„ ๋„ฃ๋Š” ๊ณผ์ •์€ ์‹์€ ์ฃฝ ๋จน๊ธฐ ์ž…๋‹ˆ๋‹ค!

 

 

์ฝ”์–ด๋ฐ์ดํ„ฐ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

https://jihae-qu.tistory.com/entry/Project-todoList-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-3

 

[ Project ] todoList ๊ตฌํ˜„ํ•˜๊ธฐ #3

์•ˆ๋…•ํ•˜์„ธ์š”โœจ ์˜ค๋Š˜์€ ์ œ๊ฐ€ ๋งŒ๋“  Todo List Project๋“ค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๋œฏ์–ด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. [ Project ] todoList ๊ตฌํ˜„ํ•˜๊ธฐ #2์—์„œ ๊ตฌํ˜„ํ•œ ๋ฐ์ดํ„ฐ๋“ค์— CoreData๋ฅผ ์ ์šฉํ•˜์˜€์–ด์š”! [ Project ] todoLi

jihae-qu.tistory.com

 

 

 

 

๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์ฝ”์–ด๋ฐ์ดํ„ฐ ์ €์žฅ

 

์•„๋ž˜์— ํ•จ์ˆ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” setProductCoreData(data: Product) ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋ฉ๋‹ˆ๋‹ค!

    @IBAction func addToWishTapped(_ sender: UIButton) {
        // ์ฝ”์–ด๋ฐ์ดํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜
     
    }

 

์šฐ์„  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ProductCoreDataManager์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๊ฒ ์ฃ ?!?

var coreDataManager = ProductCoreDataManager.shared

 

๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!!!

์ œ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” URLSession์„ ์‚ฌ์šฉํ•ด ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ JSONDecoder๋กœ ๋ณ€ํ™˜์‹œ์ผœ ์ด๋ฅผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”!

์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํŠผ์ด ํด๋ฆญํ–ˆ์„ ๋•Œ ์ฝ”์–ด๋ฐ์ดํ„ฐ๋งค๋‹ˆ์ ธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ๋’ค

var currentProduct: Product?

 

setData๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ถœ๋ ฅ์ด ๋˜์—ˆ์„ ๋•Œ, ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

func setDataAndLabel() {
    dataManager.getProductData(id: randomid ) { product in
        DispatchQueue.main.async {
            if let product = product {
                dump(product)
                self.setData(product)
            }
        }
    }
}

func setData(_ product: Product) {
    
    currentProduct = product
    
    print("ํ˜„์žฌ์˜ ์ œํ’ˆ ์ •๋ณด : \(currentProduct)")
    
//    if let url = URL(string: product.thumbnail) {
//        URLSession.shared.dataTask(with: url) { data, response, error in
//            if let data = data, error == nil {
//                DispatchQueue.main.async {
//                    self.productImageView.image = UIImage(data: data)
//                }
//            }
//        }.resume()
//    }
//    productBrandLabel.text = product.brand
//    productTitleLabel.text = product.title
//    productPriceLabel.text = "\(product.price) ์›"
//    productDescriptionLabel.text = product.description
}

 

์ž˜ ์ถœ๋ ฅ์ด ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด print()๋ฅผ ํ•˜์—ฌ ํ˜„์žฌ ์ œํ’ˆ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์•˜์–ด์š”!

์•„์ฃผ ์ž˜ ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค!

 

๊ทธ๋Ÿผ ์ด์ œ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์ฝ”์–ด๋ฐ์ดํ„ฐ๋งค๋‹ˆ์ €์—๊ฒŒ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉฐ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ”์–ด๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

@IBAction func addToWishTapped(_ sender: UIButton) {
    guard let product = currentProduct else { return }
    coreDataManager.setProductCoreData(data: product)
}