diff --git a/.DS_Store b/.DS_Store index 9f7ac0f..1679c7a 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/OpenMarket/.DS_Store b/OpenMarket/.DS_Store new file mode 100644 index 0000000..e6cc1f5 Binary files /dev/null and b/OpenMarket/.DS_Store differ diff --git a/OpenMarket/OpenMarket.xcodeproj/project.pbxproj b/OpenMarket/OpenMarket.xcodeproj/project.pbxproj index 9dd21db..06fdf8f 100644 --- a/OpenMarket/OpenMarket.xcodeproj/project.pbxproj +++ b/OpenMarket/OpenMarket.xcodeproj/project.pbxproj @@ -7,15 +7,36 @@ objects = { /* Begin PBXBuildFile section */ + 260EED732907ACF700ED0628 /* Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EED722907ACF700ED0628 /* Product.swift */; }; + 260EED752907AD4100ED0628 /* Page.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EED742907AD4100ED0628 /* Page.swift */; }; + 2623FC792910DF3F0030BD85 /* SessionData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2623FC782910DF3F0030BD85 /* SessionData.swift */; }; + 26D8C5162912050C0058845B /* URLType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26D8C5152912050C0058845B /* URLType.swift */; }; C70FB0FB25BEF61C00C9924E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70FB0FA25BEF61C00C9924E /* AppDelegate.swift */; }; C70FB0FD25BEF61C00C9924E /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70FB0FC25BEF61C00C9924E /* SceneDelegate.swift */; }; C70FB0FF25BEF61C00C9924E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70FB0FE25BEF61C00C9924E /* ViewController.swift */; }; C70FB10225BEF61C00C9924E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C70FB10025BEF61C00C9924E /* Main.storyboard */; }; C70FB10425BEF61D00C9924E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C70FB10325BEF61D00C9924E /* Assets.xcassets */; }; C70FB10725BEF61D00C9924E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C70FB10525BEF61D00C9924E /* LaunchScreen.storyboard */; }; + FB7200DB2907BE57005C35FA /* JSONParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB7200DA2907BE57005C35FA /* JSONParser.swift */; }; + FB7200DD2907C0A7005C35FA /* MyError.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB7200DC2907C0A7005C35FA /* MyError.swift */; }; + FB7200E52907C275005C35FA /* OpenMarketDataParsingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB7200E42907C275005C35FA /* OpenMarketDataParsingTest.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + FB7200E62907C275005C35FA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C70FB0EF25BEF61C00C9924E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C70FB0F625BEF61C00C9924E; + remoteInfo = OpenMarket; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ + 260EED722907ACF700ED0628 /* Product.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Product.swift; sourceTree = ""; }; + 260EED742907AD4100ED0628 /* Page.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Page.swift; sourceTree = ""; }; + 2623FC782910DF3F0030BD85 /* SessionData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionData.swift; sourceTree = ""; }; + 26D8C5152912050C0058845B /* URLType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLType.swift; sourceTree = ""; }; C70FB0F725BEF61C00C9924E /* OpenMarket.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenMarket.app; sourceTree = BUILT_PRODUCTS_DIR; }; C70FB0FA25BEF61C00C9924E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; C70FB0FC25BEF61C00C9924E /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -24,6 +45,10 @@ C70FB10325BEF61D00C9924E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; C70FB10625BEF61D00C9924E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; C70FB10825BEF61D00C9924E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FB7200DA2907BE57005C35FA /* JSONParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONParser.swift; sourceTree = ""; }; + FB7200DC2907C0A7005C35FA /* MyError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyError.swift; sourceTree = ""; }; + FB7200E22907C275005C35FA /* OpenMarketDataParsingTest.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OpenMarketDataParsingTest.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + FB7200E42907C275005C35FA /* OpenMarketDataParsingTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenMarketDataParsingTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -34,13 +59,53 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + FB7200DF2907C275005C35FA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 260EED6F2907AC0F00ED0628 /* Model */ = { + isa = PBXGroup; + children = ( + 260EED742907AD4100ED0628 /* Page.swift */, + 260EED722907ACF700ED0628 /* Product.swift */, + FB7200DA2907BE57005C35FA /* JSONParser.swift */, + FB7200DC2907C0A7005C35FA /* MyError.swift */, + 2623FC782910DF3F0030BD85 /* SessionData.swift */, + 26D8C5152912050C0058845B /* URLType.swift */, + ); + path = Model; + sourceTree = ""; + }; + 260EED702907AC1900ED0628 /* Controller */ = { + isa = PBXGroup; + children = ( + C70FB0FA25BEF61C00C9924E /* AppDelegate.swift */, + C70FB0FC25BEF61C00C9924E /* SceneDelegate.swift */, + C70FB0FE25BEF61C00C9924E /* ViewController.swift */, + ); + path = Controller; + sourceTree = ""; + }; + 260EED712907AC1F00ED0628 /* View */ = { + isa = PBXGroup; + children = ( + C70FB10025BEF61C00C9924E /* Main.storyboard */, + C70FB10525BEF61D00C9924E /* LaunchScreen.storyboard */, + ); + path = View; + sourceTree = ""; + }; C70FB0EE25BEF61C00C9924E = { isa = PBXGroup; children = ( C70FB0F925BEF61C00C9924E /* OpenMarket */, + FB7200E32907C275005C35FA /* OpenMarketDataParsingTest */, C70FB0F825BEF61C00C9924E /* Products */, ); sourceTree = ""; @@ -49,6 +114,7 @@ isa = PBXGroup; children = ( C70FB0F725BEF61C00C9924E /* OpenMarket.app */, + FB7200E22907C275005C35FA /* OpenMarketDataParsingTest.xctest */, ); name = Products; sourceTree = ""; @@ -56,17 +122,23 @@ C70FB0F925BEF61C00C9924E /* OpenMarket */ = { isa = PBXGroup; children = ( - C70FB0FA25BEF61C00C9924E /* AppDelegate.swift */, - C70FB0FC25BEF61C00C9924E /* SceneDelegate.swift */, - C70FB0FE25BEF61C00C9924E /* ViewController.swift */, - C70FB10025BEF61C00C9924E /* Main.storyboard */, + 260EED6F2907AC0F00ED0628 /* Model */, + 260EED712907AC1F00ED0628 /* View */, + 260EED702907AC1900ED0628 /* Controller */, C70FB10325BEF61D00C9924E /* Assets.xcassets */, - C70FB10525BEF61D00C9924E /* LaunchScreen.storyboard */, C70FB10825BEF61D00C9924E /* Info.plist */, ); path = OpenMarket; sourceTree = ""; }; + FB7200E32907C275005C35FA /* OpenMarketDataParsingTest */ = { + isa = PBXGroup; + children = ( + FB7200E42907C275005C35FA /* OpenMarketDataParsingTest.swift */, + ); + path = OpenMarketDataParsingTest; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -87,18 +159,40 @@ productReference = C70FB0F725BEF61C00C9924E /* OpenMarket.app */; productType = "com.apple.product-type.application"; }; + FB7200E12907C275005C35FA /* OpenMarketDataParsingTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = FB7200E82907C275005C35FA /* Build configuration list for PBXNativeTarget "OpenMarketDataParsingTest" */; + buildPhases = ( + FB7200DE2907C275005C35FA /* Sources */, + FB7200DF2907C275005C35FA /* Frameworks */, + FB7200E02907C275005C35FA /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + FB7200E72907C275005C35FA /* PBXTargetDependency */, + ); + name = OpenMarketDataParsingTest; + productName = OpenMarketDataParsingTest; + productReference = FB7200E22907C275005C35FA /* OpenMarketDataParsingTest.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ C70FB0EF25BEF61C00C9924E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1230; + LastSwiftUpdateCheck = 1320; LastUpgradeCheck = 1230; TargetAttributes = { C70FB0F625BEF61C00C9924E = { CreatedOnToolsVersion = 12.3; }; + FB7200E12907C275005C35FA = { + CreatedOnToolsVersion = 13.2.1; + TestTargetID = C70FB0F625BEF61C00C9924E; + }; }; }; buildConfigurationList = C70FB0F225BEF61C00C9924E /* Build configuration list for PBXProject "OpenMarket" */; @@ -115,6 +209,7 @@ projectRoot = ""; targets = ( C70FB0F625BEF61C00C9924E /* OpenMarket */, + FB7200E12907C275005C35FA /* OpenMarketDataParsingTest */, ); }; /* End PBXProject section */ @@ -130,6 +225,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + FB7200E02907C275005C35FA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -137,14 +239,36 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 260EED732907ACF700ED0628 /* Product.swift in Sources */, + 26D8C5162912050C0058845B /* URLType.swift in Sources */, C70FB0FF25BEF61C00C9924E /* ViewController.swift in Sources */, + 2623FC792910DF3F0030BD85 /* SessionData.swift in Sources */, + FB7200DB2907BE57005C35FA /* JSONParser.swift in Sources */, C70FB0FB25BEF61C00C9924E /* AppDelegate.swift in Sources */, C70FB0FD25BEF61C00C9924E /* SceneDelegate.swift in Sources */, + FB7200DD2907C0A7005C35FA /* MyError.swift in Sources */, + 260EED752907AD4100ED0628 /* Page.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FB7200DE2907C275005C35FA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FB7200E52907C275005C35FA /* OpenMarketDataParsingTest.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + FB7200E72907C275005C35FA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C70FB0F625BEF61C00C9924E /* OpenMarket */; + targetProxy = FB7200E62907C275005C35FA /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ C70FB10025BEF61C00C9924E /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -319,6 +443,46 @@ }; name = Release; }; + FB7200E92907C275005C35FA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = LG3BJWGHMX; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = kr.hs.dgsw.OpenMarketDataParsingTest; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/OpenMarket.app/OpenMarket"; + }; + name = Debug; + }; + FB7200EA2907C275005C35FA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = LG3BJWGHMX; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = kr.hs.dgsw.OpenMarketDataParsingTest; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/OpenMarket.app/OpenMarket"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -340,6 +504,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + FB7200E82907C275005C35FA /* Build configuration list for PBXNativeTarget "OpenMarketDataParsingTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FB7200E92907C275005C35FA /* Debug */, + FB7200EA2907C275005C35FA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = C70FB0EF25BEF61C00C9924E /* Project object */; diff --git a/OpenMarket/OpenMarket/.DS_Store b/OpenMarket/OpenMarket/.DS_Store new file mode 100644 index 0000000..48e8e7b Binary files /dev/null and b/OpenMarket/OpenMarket/.DS_Store differ diff --git a/OpenMarket/OpenMarket/Assets.xcassets/products.dataset/Contents.json b/OpenMarket/OpenMarket/Assets.xcassets/products.dataset/Contents.json new file mode 100644 index 0000000..baf5417 --- /dev/null +++ b/OpenMarket/OpenMarket/Assets.xcassets/products.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "data" : [ + { + "filename" : "products.json", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/OpenMarket/OpenMarket/Assets.xcassets/products.dataset/products.json b/OpenMarket/OpenMarket/Assets.xcassets/products.dataset/products.json new file mode 100644 index 0000000..29dc320 --- /dev/null +++ b/OpenMarket/OpenMarket/Assets.xcassets/products.dataset/products.json @@ -0,0 +1,142 @@ +{ + "page_no": 1, + "items_per_page": 20, + "total_count": 10, + "offset": 0, + "limit": 20, + "pages": [ + { + "id": 20, + "vendor_id": 3, + "name": "Test Product", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/3/thumb/5a0cd56b6d3411ecabfa97fd953cf965.jpg", + "currency": "KRW",ㅊ + "price": 0, + "bargain_price": 0, + "discounted_price": 0, + "stock": 0, + "created_at": "2022-01-04T00:00:00.00", + "issued_at": "2022-01-04T00:00:00.00" + }, + { + "id": 19, + "vendor_id": 3, + "name": "Test Product", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/3/thumb/5493c5886d3411ecabfa433b72466e30.jpg", + "currency": "KRW", + "price": 0, + "bargain_price": 0, + "discounted_price": 0, + "stock": 0, + "created_at": "2022-01-04T00:00:00.00", + "issued_at": "2022-01-04T00:00:00.00" + }, + { + "id": 18, + "vendor_id": 3, + "name": "Test Product", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/3/thumb/57501bd56d3311ecabfa3fd049db386d.jpeg", + "currency": "KRW", + "price": 0, + "bargain_price": 0, + "discounted_price": 0, + "stock": 0, + "created_at": "2022-01-04T00:00:00.00", + "issued_at": "2022-01-04T00:00:00.00" + }, + { + "id": 17, + "vendor_id": 3, + "name": "Test Product", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/3/thumb/1d02e0726d3311ecabfafdc8ea5e6b5b.jpg", + "currency": "KRW", + "price": 0, + "bargain_price": 0, + "discounted_price": 0, + "stock": 0, + "created_at": "2022-01-04T00:00:00.00", + "issued_at": "2022-01-04T00:00:00.00" + }, + { + "id": 16, + "vendor_id": 2, + "name": "팥빙수", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/2/thumb/8279f1c16c6111ecbf33d51698ab7ead.png", + "currency": "KRW", + "price": 2000, + "bargain_price": 2000, + "discounted_price": 0, + "stock": 0, + "created_at": "2022-01-03T00:00:00.00", + "issued_at": "2022-01-03T00:00:00.00" + }, + { + "id": 15, + "vendor_id": 3, + "name": "pizza", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/3/thumb/f510cb6e689f11ecbf33d124b2c61dc4.jpg", + "currency": "KRW", + "price": 25000, + "bargain_price": 25000, + "discounted_price": 0, + "stock": 0, + "created_at": "2021-12-29T00:00:00.00", + "issued_at": "2021-12-29T00:00:00.00" + }, + { + "id": 13, + "vendor_id": 2, + "name": "팥빙수", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/2/thumb/f70ad56a689911ecbf33f11af721febf.png", + "currency": "KRW", + "price": 2000, + "bargain_price": 2000, + "discounted_price": 0, + "stock": 0, + "created_at": "2021-12-29T00:00:00.00", + "issued_at": "2021-12-29T00:00:00.00" + }, + { + "id": 4, + "vendor_id": 3, + "name": "Test Product", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/3/thumb/87aa7c8966df11ecad1df993f20d4a2a.jpg", + "currency": "KRW", + "price": 1000, + "bargain_price": 999, + "discounted_price": 1, + "stock": 100000, + "created_at": "2021-12-27T00:00:00.00", + "issued_at": "2021-12-27T00:00:00.00" + }, + { + "id": 3, + "vendor_id": 3, + "name": "Test Product", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/3/thumb/2f6021a066dc11ec9626955448777bf5.jpg", + "currency": "KRW", + "price": 1000, + "bargain_price": 1000, + "discounted_price": 0, + "stock": 0, + "created_at": "2021-12-27T00:00:00.00", + "issued_at": "2021-12-27T00:00:00.00" + }, + { + "id": 2, + "vendor_id": 2, + "name": "팥빙수", + "thumbnail": "https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/training-resources/2/thumb/a3257844661911ec8eff5b6e36134cb4.png", + "currency": "KRW", + "price": 2000, + "bargain_price": 2000, + "discounted_price": 0, + "stock": 0, + "created_at": "2021-12-26T00:00:00.00", + "issued_at": "2021-12-26T00:00:00.00" + } + ], + "last_page": 1, + "has_next": false, + "has_prev": false +} diff --git a/OpenMarket/OpenMarket/AppDelegate.swift b/OpenMarket/OpenMarket/Controller/AppDelegate.swift similarity index 100% rename from OpenMarket/OpenMarket/AppDelegate.swift rename to OpenMarket/OpenMarket/Controller/AppDelegate.swift diff --git a/OpenMarket/OpenMarket/SceneDelegate.swift b/OpenMarket/OpenMarket/Controller/SceneDelegate.swift similarity index 100% rename from OpenMarket/OpenMarket/SceneDelegate.swift rename to OpenMarket/OpenMarket/Controller/SceneDelegate.swift diff --git a/OpenMarket/OpenMarket/ViewController.swift b/OpenMarket/OpenMarket/Controller/ViewController.swift similarity index 74% rename from OpenMarket/OpenMarket/ViewController.swift rename to OpenMarket/OpenMarket/Controller/ViewController.swift index 7c6a800..13a8e93 100644 --- a/OpenMarket/OpenMarket/ViewController.swift +++ b/OpenMarket/OpenMarket/Controller/ViewController.swift @@ -2,17 +2,13 @@ // OpenMarket - ViewController.swift // Created by yagom. // Copyright © yagom. All rights reserved. -// - +// import UIKit class ViewController: UIViewController { - override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. + try? print(SessionData().getSessionData(from: .healthChecker)) } - - } diff --git a/OpenMarket/OpenMarket/Model/.DS_Store b/OpenMarket/OpenMarket/Model/.DS_Store new file mode 100644 index 0000000..61543f7 Binary files /dev/null and b/OpenMarket/OpenMarket/Model/.DS_Store differ diff --git a/OpenMarket/OpenMarket/Model/JSONParser.swift b/OpenMarket/OpenMarket/Model/JSONParser.swift new file mode 100644 index 0000000..5717249 --- /dev/null +++ b/OpenMarket/OpenMarket/Model/JSONParser.swift @@ -0,0 +1,20 @@ +// +// JSONParser.swift +// OpenMarket +// +// Created by 천승희 on 2022/10/25. +// + +import UIKit + +struct JSONParser { + enum DecodeType { + case string + } + func decode(data: Data?) throws -> T { + guard let data = data, let decodingData = try? JSONDecoder().decode(T.self, from: data) else { + throw MyError.parsingError + } + return decodingData + } +} diff --git a/OpenMarket/OpenMarket/Model/MyError.swift b/OpenMarket/OpenMarket/Model/MyError.swift new file mode 100644 index 0000000..d72f326 --- /dev/null +++ b/OpenMarket/OpenMarket/Model/MyError.swift @@ -0,0 +1,22 @@ +// +// Error.swift +// OpenMarket +// +// Created by 천승희 on 2022/10/25. +// + +import Foundation + +enum MyError: Error, LocalizedError { + case unvalidURL + case parsingError + + var errorDescription: String { + switch self { + case .unvalidURL: + return "url 생성 실패" + case .parsingError: + return "dataParsing 실패" + } + } +} diff --git a/OpenMarket/OpenMarket/Model/Page.swift b/OpenMarket/OpenMarket/Model/Page.swift new file mode 100644 index 0000000..fa91c3b --- /dev/null +++ b/OpenMarket/OpenMarket/Model/Page.swift @@ -0,0 +1,23 @@ +// +// Page.swift +// OpenMarket +// +// Created by Schro on 2022/10/25. +// + +import Foundation +struct Page: Decodable { + var pageNo: Int + var itemsPerPage: Int + var totalCount: Int + var offset: Int + var limit: Int + var pages: [Product] + var lastPage: Int + var hasNext: Bool + var hasPrev: Bool + + enum CodingKeys: String, CodingKey { + case pageNo, itemsPerPage, totalCount, offset, limit, pages, lastPage, hasNext, hasPrev + } +} diff --git a/OpenMarket/OpenMarket/Model/Product.swift b/OpenMarket/OpenMarket/Model/Product.swift new file mode 100644 index 0000000..1f2c777 --- /dev/null +++ b/OpenMarket/OpenMarket/Model/Product.swift @@ -0,0 +1,30 @@ +// +// Item.swift +// OpenMarket +// +// Created by Schro on 2022/10/25. +// + +import Foundation +struct Product: Decodable { + var id: Int + var vendorId: Int + var name: String + var thumbnail: String + var currency: String + var price: Float + var bargainPrice: Float + var discountedPrice: Float + var stock: Int + var createdAt: String + var issuedAt: String + + enum CodingKeys: String, CodingKey { + case vendorId = "vendor_id" + case bargainPrice = "bargain_price" + case discountedPrice = "discounted_price" + case createdAt = "created_at" + case issuedAt = "issued_at" + case id, name, thumbnail, currency, price, stock + } +} diff --git a/OpenMarket/OpenMarket/Model/SessionData.swift b/OpenMarket/OpenMarket/Model/SessionData.swift new file mode 100644 index 0000000..f86ae95 --- /dev/null +++ b/OpenMarket/OpenMarket/Model/SessionData.swift @@ -0,0 +1,41 @@ +// +// SessionData.swift +// OpenMarket +// +// Created by Schro on 2022/11/01. +// + +import UIKit + +struct SessionData { + private let host: String = "https://openmarket.yagom-academy.kr/" + + private func getURL(from url: URLType) -> URL? { + URL(string: "\(host)\(url.description)") + } + + func getSessionData(from dataDescription: URLType) throws -> T { + var resultData: Data? + let semaphore = DispatchSemaphore(value: 0) + guard let url = getURL(from: dataDescription) else { + throw MyError.parsingError + } + var request = URLRequest(url: url, timeoutInterval: Double.infinity) + request.httpMethod = "GET" + + let task = URLSession.shared.dataTask(with: request) { data, response, error in + guard let data = data else { + return + } + resultData = data + semaphore.signal() + } + task.resume() + semaphore.wait() + + guard let decodingData = try? JSONParser().decode(data: resultData) else { + throw MyError.parsingError + } + return decodingData + } +} diff --git a/OpenMarket/OpenMarket/Model/URLType.swift b/OpenMarket/OpenMarket/Model/URLType.swift new file mode 100644 index 0000000..b3e4d0d --- /dev/null +++ b/OpenMarket/OpenMarket/Model/URLType.swift @@ -0,0 +1,19 @@ +// +// URLType.swift +// OpenMarket +// +// Created by Schro on 2022/11/02. +// + +import Foundation + +enum URLType { + case healthChecker + + var description: String { + switch self { + case .healthChecker: + return "healthChecker" + } + } +} diff --git a/OpenMarket/OpenMarket/Base.lproj/LaunchScreen.storyboard b/OpenMarket/OpenMarket/View/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from OpenMarket/OpenMarket/Base.lproj/LaunchScreen.storyboard rename to OpenMarket/OpenMarket/View/Base.lproj/LaunchScreen.storyboard diff --git a/OpenMarket/OpenMarket/Base.lproj/Main.storyboard b/OpenMarket/OpenMarket/View/Base.lproj/Main.storyboard similarity index 100% rename from OpenMarket/OpenMarket/Base.lproj/Main.storyboard rename to OpenMarket/OpenMarket/View/Base.lproj/Main.storyboard diff --git a/OpenMarket/OpenMarketDataParsingTest/OpenMarketDataParsingTest.swift b/OpenMarket/OpenMarketDataParsingTest/OpenMarketDataParsingTest.swift new file mode 100644 index 0000000..f71aa02 --- /dev/null +++ b/OpenMarket/OpenMarketDataParsingTest/OpenMarketDataParsingTest.swift @@ -0,0 +1,45 @@ +// +// OpenMarketDataParsingTest.swift +// OpenMarketDataParsingTest +// +// Created by 천승희 on 2022/10/25. +// + +import XCTest +@testable import OpenMarket + +class OpenMarketDataParsingTest: XCTestCase { + var pageData: Page? + + override func setUpWithError() throws { + try super.setUpWithError() + } + + override func tearDownWithError() throws { + try super.tearDownWithError() + pageData = nil + } + + func test_페이지_데이터_파싱_여부_확인() { + var isNotNil: Bool = false + pageData = try? JSONParser().getData() + if pageData != nil { + isNotNil = true + } + XCTAssertTrue(isNotNil) + } + + func test_데이터_파싱후_페이지번호_출력() { + let pageNo = 1 + pageData = try? JSONParser().getData() + let result = pageData?.pageNo + XCTAssertEqual(result, pageNo) + } + + func test_데이터_파싱후_첫번째_아이템_아이디_출력() { + let id = 20 + pageData = try? JSONParser().getData() + let result = pageData?.pages[0].id + XCTAssertEqual(result, id) + } +}