FireStore에서 일주일치 식단의 전체 json 파일을 내려받게 됩니다.
편의상 cauWeeklyMeals.json 이라고 명명하겠습니다.
내려받은 cauWeeklyMeals.json 파일은 JsonManager에서 다루게 됩니다.
a. 로컬에 cauWeeklyMeals.json을 저장하는 함수를 실행합니다.
매번 FireStore에서 불러와 정제를 하는 것이 아닌 로컬에서 바로 불러오도록 하여 성능을 높이기 위함입니다.
b. cauWeeklyMeals.json을 String 으로 파싱하는 jsonToString() 함수를 실행합니다.
json과 같은 구조의 string 값을 반환합니다.
b의 과정을 사용하는 곳은 DataManager입니다.
DataManager의 stringToDict() 함수가 파싱된 string 값을 다시 dictionary 형태로 파싱합니다.
파싱된 dictionary 값은 getMealsForDay() 함수에서 Meal 모델에 맞추어 각 날짜, 시간대, 식당의 식단에 따라 파싱되고 최종적으로는 식단별로 이루어진 [Meal] 배열을 반환합니다.
반환된 [Meal] 배열은 getMealsForWeeks() 함수에서 MealsForDay 모델에 맞추어 date 별로 하나의 <Set>Meal이 생성되게 됩니다.
학생식단은 같은 식당에서 한가지 메뉴가 반복적으로 Meal 로 만들어지게 됩니다.3/18 수정
한가지 메뉴가 하나의 Meal로 만들어지는 경우와 일반 식단과 같은 형태의 Meal 두가지 종류가 있습니다.
따라서 Menu 수에 따라서 분기처리를 하여 적용해야할 것 같습니다.
(안성)라면 과 카우버거는 menu 데이터가 포탈에 제대로 나와있지 않습니다. 또한 변동되는 메뉴가 아니기 때문에 따로 데이터를 만들어두고 식당에 따라서 처리 하는 것이 나을 것 같습니다.
또한 카우버거의 경우 가격 또한 나와있지 않아 디자이너와의 논의 이후 가격을 따로 지정해야할 것 같습니다.
주말이라 운영을 안하는 경우는 status 값으로 알 수 있습니다.
status 값이 .CloseOnWeekends 인 경우에만 UI 안에서 분기처리를 해주시면 될 것 같습니다.
서울캠 참슬기 식당의 "중식(특식)" 시간이 다른 경우
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으로 들어가도 될 것 같습니다.
}
...
}
안성캠의 안성(라면) 의 경우
menu: ["<운영시간>6:00~23:00", "신라면", "너구리", "진라면", "틈새라면"]
위와 같은 menu가 나오게 됩니다. 따라서 안성(라면)의 경우에는 따로 cafeteria 에 따라서 UI에 바로 메뉴를 따로 넣어주는 것이 나을 것 같습니다.
데이터가 없는 경우
주말운영없음 이 아닌 데이터가 없는 경우는 Set 에 들어가지 않도록 처리하였습니다.
따라서 데이터가 없는 식당의 경우에는 전달이 되지 않게 됩니다.
식단 Json 정제 과정 및 정제 후 사용방법에 대한 문서화입니다.
json 파일의 정제 과정
FireStore에서 일주일치 식단의 전체
json
파일을 내려받게 됩니다. 편의상cauWeeklyMeals.json
이라고 명명하겠습니다.내려받은
cauWeeklyMeals.json
파일은 JsonManager에서 다루게 됩니다. a. 로컬에cauWeeklyMeals.json
을 저장하는 함수를 실행합니다. 매번 FireStore에서 불러와 정제를 하는 것이 아닌 로컬에서 바로 불러오도록 하여 성능을 높이기 위함입니다. b.cauWeeklyMeals.json
을String
으로 파싱하는jsonToString()
함수를 실행합니다.json
과 같은 구조의string
값을 반환합니다.b의 과정을 사용하는 곳은 DataManager입니다. DataManager의 stringToDict() 함수가 파싱된 string 값을 다시 dictionary 형태로 파싱합니다.
파싱된
dictionary
값은getMealsForDay()
함수에서Meal
모델에 맞추어 각 날짜, 시간대, 식당의 식단에 따라 파싱되고 최종적으로는 식단별로 이루어진[Meal]
배열을 반환합니다.반환된
[Meal]
배열은getMealsForWeeks()
함수에서 MealsForDay 모델에 맞추어 date 별로 하나의<Set>Meal
이 생성되게 됩니다.최종적으로 전달되는 구조는 date 와 그 날짜에 해당하는 모든 식단 Set 입니다.
정제 후 사용방법
식단 별 데이터 형식
Meal 모델에 맞추어 프론트에 전달되는 식단 별 데이터 형식입니다.
“실제 json 값” : 파싱된 값
으로 봐주시면 될 것 같습니다.“0” : .seoul
조식
"생활관식당(블루미르308관)" / .blueMirA
중식
"생활관식당(블루미르308관)" / .blueMirA
"참슬기식당(310관 B4층)" / .chamseulgi
참슬기 식당의 중식의 mealType 만이 다른 시간대로 지정되어 있어 .special 로 나타내게 됩니다..noraml
“중식(특식)” / .special
"생활관식당(블루미르309관)" / .blueMirB
"학생식당(303관B1층)" / .student
학생식단은 같은 식당에서 한가지 메뉴가 반복적으로 Meal 로 만들어지게 됩니다.3/18 수정 한가지 메뉴가 하나의 Meal로 만들어지는 경우와 일반 식단과 같은 형태의 Meal 두가지 종류가 있습니다. 따라서 Menu 수에 따라서 분기처리를 하여 적용해야할 것 같습니다."교직원식당(303관B1층)" / .staff
석식
"참슬기식당(310관 B4층)" / .chamseulgi
"생활관식당(블루미르309관)" / .blueMirB
"생활관식당(블루미르308관)" / .blueMirA
“1” : .ansung
조식
"(안성)라면" / .ramen
"(안성)카우버거" / .cauBurger
중식
"카우잇츠(cau eats)" / .cauEats
"(안성)라면" / .ramen
"(안성)카우버거" / .cauBurger
석식
"카우잇츠(cau eats)" / .cauEats
"(안성)라면" / .ramen
"(안성)카우버거" / .cauBurger
(안성)라면 과 카우버거는 menu 데이터가 포탈에 제대로 나와있지 않습니다. 또한 변동되는 메뉴가 아니기 때문에 따로 데이터를 만들어두고 식당에 따라서 처리 하는 것이 나을 것 같습니다. 또한 카우버거의 경우 가격 또한 나와있지 않아 디자이너와의 논의 이후 가격을 따로 지정해야할 것 같습니다.
정제 결과 예외처리 부분
대부분의 식단 데이터가
로 반환될 예정이지만 예외 상황이 몇가지 있습니다.
주말이라 운영을 안하는 경우는
status
값으로 알 수 있습니다.status
값이.CloseOnWeekends
인 경우에만 UI 안에서 분기처리를 해주시면 될 것 같습니다.mealType
의.special
이 위의 상황에 해당합니다. 따라서 UI 안에서 정해진 식당의 시간 Enum을 따로 만들어 매칭하시면 될 것 같습니다. 개인적인 생각으로는 아래와 같이 짜게되면 괜찮을 것 같습니다.안성캠의 안성(라면) 의 경우
menu: ["<운영시간>6:00~23:00", "신라면", "너구리", "진라면", "틈새라면"]
위와 같은menu
가 나오게 됩니다. 따라서 안성(라면)의 경우에는 따로cafeteria
에 따라서 UI에 바로 메뉴를 따로 넣어주는 것이 나을 것 같습니다.데이터가 없는 경우 에 들어가지 않도록 처리하였습니다.
따라서 데이터가 없는 식당의 경우에는 전달이 되지 않게 됩니다.
주말운영없음
이 아닌 데이터가 없는 경우는 Set추가적으로 부족한 부분이나 필요한 부분이 있다면 리뷰 부탁드립니다 !