HipstuCAU / nyam_nyam

오늘 먹을 메뉴를 고민하고 있는 학우들을 위해 만들었습니다.
2 stars 0 forks source link

Json 정제 과정 및 정제 후 사용방법에 대한 문서화 #30

Open TaekH opened 1 year ago

TaekH commented 1 year ago

식단 Json 정제 과정 및 정제 후 사용방법에 대한 문서화입니다.

json 파일의 정제 과정

  1. FireStore에서 일주일치 식단의 전체 json 파일을 내려받게 됩니다. 편의상 cauWeeklyMeals.json 이라고 명명하겠습니다.

  2. 내려받은 cauWeeklyMeals.json 파일은 JsonManager에서 다루게 됩니다. a. 로컬에 cauWeeklyMeals.json을 저장하는 함수를 실행합니다. 매번 FireStore에서 불러와 정제를 하는 것이 아닌 로컬에서 바로 불러오도록 하여 성능을 높이기 위함입니다. b. cauWeeklyMeals.jsonString 으로 파싱하는 jsonToString() 함수를 실행합니다. json과 같은 구조의 string 값을 반환합니다.

  3. b의 과정을 사용하는 곳은 DataManager입니다. DataManager의 stringToDict() 함수가 파싱된 string 값을 다시 dictionary 형태로 파싱합니다.

  4. 파싱된 dictionary 값은 getMealsForDay() 함수에서 Meal 모델에 맞추어 각 날짜, 시간대, 식당의 식단에 따라 파싱되고 최종적으로는 식단별로 이루어진 [Meal] 배열을 반환합니다.

  5. 반환된 [Meal] 배열은 getMealsForWeeks() 함수에서 MealsForDay 모델에 맞추어 date 별로 하나의 <Set>Meal이 생성되게 됩니다.

최종적으로 전달되는 구조는 date 와 그 날짜에 해당하는 모든 식단 Set 입니다.

정제 후 사용방법

식단 별 데이터 형식

Meal 모델에 맞추어 프론트에 전달되는 식단 별 데이터 형식입니다.

“실제 json 값” : 파싱된 값 으로 봐주시면 될 것 같습니다.

“0” : .seoul

조식

"생활관식당(블루미르308관)" / .blueMirA

NyamNyam.Meal(mealTime: NyamNyam.MealTime.dinner, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.blueMirA, price: "5500", menu: ["쌀밥", "홍합탕", "순대볶음", "교자만두튀김", "명엽채볶음", "오이생채", "포기김치"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 17:30:00 +0000, endDate: 2023-03-10 19:00:00 +0000)



중식

"생활관식당(블루미르308관)" / .blueMirA

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.blueMirA, price: "5500", menu: ["참치김치덮밥", "콩나물국", "야채고로케", "그린샐러드", "고춧잎무침", "꽈배기츄러스", "깍두기"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:30:00 +0000, endDate: 2023-03-10 13:30:00 +0000)


"참슬기식당(310관 B4층)" / .chamseulgi 참슬기 식당의 중식의 mealType 만이 다른 시간대로 지정되어 있어 .special 로 나타내게 됩니다.

.noraml

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.chamseulgi, price: "3200", menu: ["함박스테이크", "순살치킨까스", "야채샐러드", "단무지"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:00:00 +0000, endDate: 2023-03-10 13:30:00 +0000)

“중식(특식)” / .special

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.special, cafeteria: NyamNyam.Cafeteria.chamseulgi, price: "4500", menu: ["콩나물국", "제육볶음", "연두부양념장", "참나물무침", "깻잎지", "깍두기"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:30:00 +0000, endDate: 2023-03-10 13:30:00 +0000)


"생활관식당(블루미르309관)" / .blueMirB

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.blueMirA, price: "5500", menu: ["참치김치덮밥", "콩나물국", "야채고로케", "그린샐러드", "고춧잎무침", "꽈배기츄러스", "깍두기"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:30:00 +0000, endDate: 2023-03-10 13:30:00 +0000)]


"학생식당(303관B1층)" / .student

학생식단은 같은 식당에서 한가지 메뉴가 반복적으로 Meal 로 만들어지게 됩니다. 3/18 수정 한가지 메뉴가 하나의 Meal로 만들어지는 경우와 일반 식단과 같은 형태의 Meal 두가지 종류가 있습니다. 따라서 Menu 수에 따라서 분기처리를 하여 적용해야할 것 같습니다.

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.student, price: "5400", menu: ["알떡함박스테이크"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:30:00 +0000, endDate: 2023-03-10 14:00:00 +0000),
NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.student, price: "4000", menu: ["계란라면"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:30:00 +0000, endDate: 2023-03-10 14:00:00 +0000)
NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.student, price: "5500", menu: ["참치김치덮밥", "콩나물국", "야채고로케", "그린샐러드", "고춧잎무침", "꽈배기츄러스", "깍두기"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:30:00 +0000, endDate: 2023-03-10 13:30:00 +0000)]


"교직원식당(303관B1층)" / .staff

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.staff, price: "5500", menu: ["잡곡밥", "순대국밥", "청양마요깐풍기", "두부양념조림", "부추겉절이", "그린샐러드", "배추김치"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:00:00 +0000, endDate: 2023-03-10 13:30:00 +0000)



석식

"참슬기식당(310관 B4층)" / .chamseulgi

NyamNyam.Meal(mealTime: NyamNyam.MealTime.dinner, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.chamseulgi, price: "4500", menu: ["돈육고추장찌개", "갈치조림", "양장피냉채", "쑥갓두부나물", "건파래볶음", "깍두기"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 17:00:00 +0000, endDate: 2023-03-10 18:30:00 +0000)


"생활관식당(블루미르309관)" / .blueMirB

NyamNyam.Meal(mealTime: NyamNyam.MealTime.dinner, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.blueMirB, price: "6000", menu: ["씽푸짜장면", "씽푸짬뽕", "새우볶음밥", "마파두부덮밥", "수제탕수육"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 17:00:00 +0000, endDate: 2023-03-10 18:30:00 +0000)


"생활관식당(블루미르308관)" / .blueMirA

NyamNyam.Meal(mealTime: NyamNyam.MealTime.dinner, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.blueMirA, price: "5500", menu: ["쌀밥", "홍합탕", "순대볶음", "교자만두튀김", "명엽채볶음", "오이생채", "포기김치"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 17:30:00 +0000, endDate: 2023-03-10 19:00:00 +0000)



“1” : .ansung

조식

"(안성)라면" / .ramen

NyamNyam.Meal(mealTime: NyamNyam.MealTime.breakfast, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.ramen, price: "2000", menu: ["<운영시간>6:00~23:00", "신라면", "너구리", "진라면", "틈새라면"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 07:00:00 +0000, endDate: 2023-03-10 11:00:00 +0000)


"(안성)카우버거" / .cauBurger

NyamNyam.Meal(mealTime: NyamNyam.MealTime.breakfast, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.cauBurger, price: "0", menu: ["<운영시간>09:30~18:30/햄버거판매시간11:00~18:00"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 09:00:00 +0000, endDate: 2023-03-10 11:00:00 +0000)



중식

"카우잇츠(cau eats)" / .cauEats

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.cauEats, price: "3200", menu: ["필라프", "닭다리장각구이", "미역국", "김치"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:30:00 +0000, endDate: 2023-03-10 14:00:00 +0000)


"(안성)라면" / .ramen

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.ramen, price: "2000", menu: ["<운영시간>6:00~23:00", "신라면", "너구리", "진라면", "틈새라면"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:00:00 +0000, endDate: 2023-03-10 16:00:00 +0000)


"(안성)카우버거" / .cauBurger

NyamNyam.Meal(mealTime: NyamNyam.MealTime.lunch, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.cauBurger, price: "0", menu: ["<운영시간>09:30~18:30/햄버거판매시간11:00~18:00"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 11:00:00 +0000, endDate: 2023-03-10 16:00:00 +0000)



석식

"카우잇츠(cau eats)" / .cauEats

NyamNyam.Meal(mealTime: NyamNyam.MealTime.dinner, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.cauEats, price: "4500", menu: ["돈육고추장찌개", "갈치조림", "양장피냉채", "쑥갓두부나물", "어묵볶음", "깍두기"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 17:00:00 +0000, endDate: 2023-03-10 18:30:00 +0000)


"(안성)라면" / .ramen

NyamNyam.Meal(mealTime: NyamNyam.MealTime.dinner, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.ramen, price: "2000", menu: ["<운영시간>6:00~23:00", "신라면", "너구리", "진라면", "틈새라면"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 16:01:00 +0000, endDate: 2023-03-10 19:00:00 +0000)


"(안성)카우버거" / .cauBurger

NyamNyam.Meal(mealTime: NyamNyam.MealTime.dinner, type: NyamNyam.MealType.normal, cafeteria: NyamNyam.Cafeteria.cauBurger, price: "0", menu: ["<운영시간>09:30~18:30/햄버거판매시간11:00~18:00"], date: 2023-03-10 00:00:00 +0000, status: NyamNyam.Status.normal, startDate: 2023-03-10 16:01:00 +0000, endDate: 2023-03-10 18:30:00 +0000)

(안성)라면 과 카우버거는 menu 데이터가 포탈에 제대로 나와있지 않습니다. 또한 변동되는 메뉴가 아니기 때문에 따로 데이터를 만들어두고 식당에 따라서 처리 하는 것이 나을 것 같습니다. 또한 카우버거의 경우 가격 또한 나와있지 않아 디자이너와의 논의 이후 가격을 따로 지정해야할 것 같습니다.

정제 결과 예외처리 부분

예외처리 관련 및 UI에 들어갈 데이터 표 서울캠 참슬기 식당 블루미르308 블루미르309 학생식당 교직원 식당
조식 08:00~09:00
중식 11:30-13:30 / 11:00-13:30: .special 11:30~13:00 11:00~13:30 11:30~14:00 11:00~13:30
석식 17:00~18:30 17:30~19:00 16:30~18:30
주말 운영 여부 X (데이터 존재 X) O X (주말운영없음) X (데이터 존재 X) X (데이터 존재 X)
안성캠 안성(카우버거) 카우이츠 라면
조식 10:00~16:30 07:00~11:00
중식 10:00~16:30 11:30~14:00 11:00~16:00
석식 10:00~16:30 17:00~18:30 16:30~18:30
주말 운영 여부 X X O

대부분의 식단 데이터가

Meal(mealTime: .dinner, type: .normal, cafeteria: .cauEats, price: "4000", menu: ["카레라이스", "그릴소시지", "깍두기", "가쓰오국"], date: 2023-03-14 00:00:00 +0000, status: .normal)

로 반환될 예정이지만 예외 상황이 몇가지 있습니다.

  1. 주말이라 운영을 안하는 경우

주말이라 운영을 안하는 경우는 status 값으로 알 수 있습니다. status 값이 .CloseOnWeekends 인 경우에만 UI 안에서 분기처리를 해주시면 될 것 같습니다.

  1. 서울캠 참슬기 식당의 "중식(특식)" 시간이 다른 경우 mealType.special이 위의 상황에 해당합니다. 따라서 UI 안에서 정해진 식당의 시간 Enum을 따로 만들어 매칭하시면 될 것 같습니다. 개인적인 생각으로는 아래와 같이 짜게되면 괜찮을 것 같습니다.
    func setMealTime(_ meal: Meal) {
        let mealTime = (meal.cafeteria, meal.mealTime, meal.type)
        switch mealTime {
        case (Cafeteria.blueMirB, MealTime.dinner, MealType.normal):
            return "16:30~8:30" //Enum으로 들어가도 될 것 같습니다.
        }
        ...
    }
  1. 안성캠의 안성(라면) 의 경우 menu: ["<운영시간>6:00~23:00", "신라면", "너구리", "진라면", "틈새라면"] 위와 같은 menu가 나오게 됩니다. 따라서 안성(라면)의 경우에는 따로 cafeteria 에 따라서 UI에 바로 메뉴를 따로 넣어주는 것이 나을 것 같습니다.

  2. 데이터가 없는 경우 주말운영없음 이 아닌 데이터가 없는 경우는 Set 에 들어가지 않도록 처리하였습니다. 따라서 데이터가 없는 식당의 경우에는 전달이 되지 않게 됩니다.

추가적으로 부족한 부분이나 필요한 부분이 있다면 리뷰 부탁드립니다 !

feldblume5263 commented 1 year ago

꼼꼼한 정리 감사합니다 👍👍