본문 바로가기

Project26

뿌대식: 클린 아키텍처 및 리팩토링 도입 이전문제점모델iOS와 위젯이 같은 모델을 사용하는 데 사용하는 방법은 조금씩 다름그래서 iOS의 로직을 변경하고 싶어도 변경하지 못하거나, 기존 코드를 지우지 못함로직데이터를 변경하는 로직이 흩어져있어 로직을 파악하기 어려움결합도가 높아 하나의 메서드를 고치기 위해 전체적으로 수정해야 함 class MainViewModel: ObservableObject { /// 현재 선택된 요일 @Published var selectedWeekComponent: WeekComponent? = .today /// 네트워크 요청을 통해 받은 응답 목록 @Published var cafeteriaResponseArray = [CafeteriaResponse]() /// 모달 .. 2024. 12. 2.
뿌대식: CI/CD 기능 추가는 더 이상 하고 있지 않지만, 내부적으로 버그를 고치거나 혹은 사용성을 개선하는 등의 작업을 하고 있었습니다. 결론부터 말하자면, 이번에 Github actions, Xcode Cloud를 사용해서 CI/CD를 도입했습니다.이유는 작고, 다양한 작업을 하다 보니 브랜치 통합과 앱 아카이빙처럼 코딩 외의 작업 시간이 늘고, 기다리는 시간이 지루했습니다.결정적으로 대대적인 리팩토링을 할 계획이라 반복 작업에서 발생할 대기 시간을 줄이고 싶었습니다. 결과배포, 개발 브랜치의 분리배포 브랜치: 앱스토어에 배포되는 실질적인 버전, 이 브랜치가 업데이트 되면 Xcode Cloud를 통해 빌드하고 앱스토어 커넥트에 업로드됨개발 브랜치: 개발이 이루어지고 있는 브랜치, 이 브랜치로 머지하기 위해선 iOS 빌.. 2024. 12. 1.
뿌대식: 네트워크 관련 개선 네트워크 분석 글에서 언급했듯 이번 리팩토링에서는 아래 두 가지를 개선했습니다.네트워크 호출 로직네트워크 요청 속도 개선  네트워크 호출 로직 관련개선 전 뿌대식의 네트워크 호출은 DB가 백업 중인지 검사 후, 학생 식당 혹은 기숙사 DB 데이터를 불러옵니다.네트워크 체이닝 때문에 arrowHead 코드가 생기고, 캠퍼스 전환 시 네트워크 호출이 중첩되는 문제가 있었습니다.  arrowHead 코드 문제네트워크 호출 관련 코드는 긴 편인데, 데이터베이스 백업을 검사와 식당 데이터가 다른 모델을 사용해 중복되는 코드가 존재했습니다.   네트워크 호출 중첩 문제네트워크 호출이 중첩되면, 쌓인 네트워크 호출이 완료될 때마다 현재 식당이 호출 횟수만큼 증가하는 이슈가 있었습니다. (캠퍼스 탭을 전환하는 만큼 쌓.. 2024. 8. 23.
뿌대식: 네트워크 분석 네트워크 관련 리팩토링을 진행하기 전, Instruments를 사용하여 뿌대식을 분석해 봤습니다.환경은 실기기 iPhone 14, iOS 17.5.1이며 각 캠퍼스에 대해 한 번씩 진행했습니다.  스냅샷부산 캠퍼스   밀양 캠퍼스  양산 캠퍼스  분석그동안 프로젝트를 진행하면서 식단이 로딩되는 속도가 느리다고 생각하고 있었는데, 그 이유가 응답 데이터 양으로 인한 속도 저하라고 생각했습니다. 그래서 네트워크 관련 리팩토링은 아래 두 가지를 염두했었습니다.중복 데이터 관련부산 - 밀양 - 부산 순으로 캠퍼스를 전환할 시 전환 시마다 네트워크 요청을 하는데, 식단은 탭을 이동하는 잠깐 사이 변경이 될 일이 없기 때문에 데이터 캐싱 처리네트워크 사용량 관련네트워크 요청 queryParam을 좀 더 세분화해 필.. 2024. 8. 19.
뿌대식: 뷰 컴포넌트 분리 개선 목표기존의 뷰 요소들이 MainView 파일 하나에서 모두 관리되기 때문에 원하는 뷰를 수정하려고 할 때 원하는 부분을 찾는 데 어려움이 있었습니다. 그래서 뷰 요소들을 각각의 파일로 분리하며 Binding을 통하여 데이터를 관리하기로 목표를 잡았습니다.  개선 전  메인 뷰에서 “앱 로고”, “설정 버튼” 등을 관리하는 title, “부산”, “밀양”, “양산” 캠퍼스에 대한 탭을 관리하는 campus, “월” ~ “금”과 해당하는 요일을 관리하는 week, “식당”과 “식단”을 관리하는 menu를 한 번에 관리합니다.  개선 후  각 뷰 요소들을 용도에 맞게 분리하고, 메인 뷰에서 통합하여 호출하도록 개선했습니다. 그리고, 상황에 맞게 커스텀하여 사용하던 텍스트, 이미지, 도형 등의 뷰 요소들을.. 2024. 8. 18.
뿌대식: 응답 모델 개선 개선 전 기존 프로젝트의 모델들(식당, 기숙사, 네트워크 응답, …)은 처음 모델을 생성한 의도와 다르게 필요에 따라 메서드가 하나씩 추가되었고, 메서드 간 종속성이 강하게 묶여있어 하나의 메서드를 수정하면 연관되는 모든 메서드를 수정했어야 했습니다. 그리고, 학생 식당과 기숙사의 응답 형식이 달라 각 응답을 보여주는 뷰가 2개 존재했습니다. 개선 목표는 학생 식당과 기숙사의 응답을 하나로 합치고, 뷰 또한 하나의 구조체로 표현하고자 했습니다.추가로, 필요에 따라 추가한 메서드들(예를 들어, static으로 선언된 rawValue를 통해 캠퍼스를 반환하는 메서드)을 재사용 가능하게 수정하는 것이었습니다.  개선 후  의도 결과를 설명하기 전, 오랜만에 열어본 프로젝트는 한눈에 보기 힘들 정도로 로직이 엉.. 2024. 8. 18.
뿌대식: 리팩토링 근황졸업 발표를 준비하느라 포스팅하진 않았지만, 뿌대식은 그간 많은 변화가 있었습니다. 우선, 기능적으로는 지정한 식당의 식단을 시간에 맞춰 보여주는 위젯을 추가하거나, 데이터베이스에 수동으로 업데이트해주던 방식에서 주기적으로 파싱해 데이터베이스에 업데이트하도록 교체했습니다.(부산대학교 측에 문의해 비상업적 목적으로 데이터를 사용하는 걸 승인받았습니다.) 내부적으로는 뷰 요소를 조금 더 유저친화적으로 개편하고, 한 번에 3MB 가까이 소모되던 네트워크 사용량을 로직 개선으로 1MB로 줄였습니다. 코드 퀄리티보다 기능 개발에 초점을 맞춰 진행하다 보니 기술 부채가 꽤나 많이 쌓여버려서, 부스트캠프가 끝난 지금 시간 여유가 있을 때 내부 안정화를 진행하려고 합니다.  프로젝트 다이어그램클래스 다이어그램 호출.. 2024. 8. 13.
뿌대식: 앱스토어 - 출시 운이 좋게도 심사를 요청하자마자 승인이 되서 빠르게 출시 됐습니다.  보통 새벽에 심사가 이루어지는데 앱이 제공하는 컨텐츠가 적기도 하고, 시간도 시간인지라 빠르게 심사가 이루어진 것 같습니다.  이제 앱스토어에서 부산대학교 학식 알리미 뿌대식을 다운로드 할 수 있게 되었습니다. 2024. 1. 11.
뿌대식: 앱스토어 - 심사 앱스토어 심사의 경우 워낙 상세하게 작성해주신 분들이 많기도 하고, 웬만한 건 바로바로 작성할 수 있으니 기본적인 항목은 생략하겠습니다. 저 같은 경우 앱을 처음 출시할 때 개인정보처리방침, 빌드 항목에서 난항을 겪은 적이 있어 이 부분을 설명하겠습니다. 앱스토어에 앱을 출시할 때 아무런 정보를 수집하지 않아도 정보를 수집하지 않는다는 개인정보처리방침 자체는 필요합니다. 지금은 보이지 않지만 정부 사이트 개인정보 보호에서 개인정보처리방침 만들기(링크)를 통해서 미리 작성해 둔 개인정보처리방침이 있어서 상황에 맞게 수정해서 쓰고 있습니다. 개인정보처리방침의 경우 사이트가 필요한데 이는 노션 웹 공유를 사용했습니다. 뿌대식 개인정보처리방침 빌드의 경우 앱스토어에 올라가는 실질적인 앱 파일로 앱스토어 커넥트(.. 2024. 1. 11.
뿌대식: 앱스토어 - 심사 사전 준비 앱스토어에 심사를 요청하기 위해선 우선 사전작업이 조금 필요합니다. 앱 스크린샷 AppID 생성 신규 앱 등록 앱스토어 심사에는 앱 스크린샷이 필요하고, 다양한 크기의 스크린샷이 들어갑니다. 최소 기준은 6.5인치, 5.5인치의 스크린샷으로 피그마를 통해 작업했습니다. 참고로, 앱스토어 스크린샷 사이즈는 애플 디벨로퍼 사이트의 스크린샷 사양(링크)에서도 확인할 수 있습니다. 만약 저처럼 피그마로 작업하신다면 6.5인치: (가로: 428, 세로: 926), 5.5인치: (가로: 414, 세로: 736) 사이즈로 작업하셔도 무방합니다. AppID는 앱에 필요한 기능에 따라서 항목을 포함해주고, Description은 AppID의 설명, Bundle ID는 프로젝트의 번들 아이디(예: com.apple.App.. 2024. 1. 11.
뿌대식: 앱스토어 - 프로젝트 설정 앱스토어에 앱을 제출하기 위한 설정을 해줍니다. 앱의 기본 언어를 영어에서 한글로 변경했습니다. Project - {ProjectName} - Localization - Localization iOS용 앱이므로 아이패트, 맥의 Destination을 제거했습니다. 화면 방향을 Portait, 수직 정방향을 제외하고 해제 해줍니다. plist의 아이패드에 관한 값을 제거해줍니다. 이 항목 때문인지는 모르겠는데, 심사 시 아이패드 타겟을 제거해도 아이패드에 관한 사항으로 리젝 당하는 경우가 있었습니다. PpuDaeSik이라는 이름을 홈 화면에서도 나타낼 건 아니기에 앱 이름을 지정해주고, 앱의 카테고리도 함께 지정해줍니다. 앱 아이콘을 추가 했습니다. 앱 아이콘은 1024x1024 크기의 이미지를 각 앱스토.. 2024. 1. 11.
뿌대식: 개발 - 북마크, 기본 캠퍼스 북마크와 메뉴를 볼 기본 캠퍼스에 대한 데이터를 앱 내에서 저장할 수 있도록 합니다. 원래는 Core Data를 사용하려고 했으나, 데이터의 양이 많지 않고 가짓수도 적어서 Core Data 대신 조금 느려도 사용이 간편한 UserDefaults를 사용했습니다. func saveDefaultCampus() { UserDefaults.standard.setValue(defaultCampus, forKey: "defaultCampus") } func saveBookmark() { UserDefaults.standard.setValue(bookmark, forKey: "bookmark") } func loadDefaultCampus() { guard let defaultCampus = UserDefaults... 2024. 1. 10.
뿌대식: 개발 - 시트 기본 캠퍼스 지정을 위한 시트를 추가합니다.(모달/Modal 이라고도 부릅니다.) struct Sheet: View { @State var selectedCampus = Campus.부산 var body: some View { VStack { RoundedRectangle(cornerRadius: 2.5) .foregroundColor(.darkGray100) .frame(width: UIScreen.getWidth(36), height: UIScreen.getHeight(5)) HStack { Text("기본 캠퍼스") .foregroundColor(.black100) Spacer() Picker(selection: $selectedCampus) { ForEach(Campus.allCases, id: .. 2024. 1. 10.
뿌대식: 개발 - MVVM 프로젝트 규모가 크지 않아 굳이 디자인 패턴을 적용하지 않아도 되긴 하지만, 유지보수의 용이를 위해 MVVM을 채택했습니다. 기존 코드들은 필요에 따라 해당 파일 내에 작성했었는데 Model, View, View Model 용도에 맞춰 코드를 옮겼습니다. enum Campus: String, CaseIterable { case 부산, 밀양, 양산 var restaurant: [Restaurant] { switch self { case .부산: [Restaurant.금정회관학생, Restaurant.금정회관교직원, Restaurant.샛벌회관, Restaurant.학생회관학생, Restaurant.진리관, Restaurant.웅비관, Restaurant.자유관] case .밀양: [Restaurant.학생.. 2024. 1. 10.
뿌대식: 개발 - 통신 화면에 데이터를 보여주기 위해서 HTTP 요청을 위한 코드를 작성합니다. import Moya import SwiftUI enum API { case queryDatabase(_ campus: Campus) } extension API: TargetType { var baseURL: URL { let url = "" guard let baseURL = URL(string: url) else { fatalError() } return baseURL } var path: String { switch self { case .queryDatabase(let campus): var databaseID: String { switch campus { case .부산: "///" case .밀양: "///" case .. 2024. 1. 9.
뿌대식: 개발 - 메인화면 본격적인 개발을 시작합니다. 화면의 각 요소들을 컴포넌트화 하여 body에서 취합해주고, 캠퍼스와 요일의 경우 열거형으로 선언해줍니다. enum Campus: String, CaseIterable { case 부산, 밀양, 양산 var restaurant: [String] { switch self { case .부산: ["금정회관 학생", "금정회관 교직원", "샛벌회관", "학생회관 학생", "진리관", "웅비관", "자유관"] case .밀양: ["학생회관 학생", "학생회관 교직원", "비마관"] case .양산: ["편의동", "행림관"] } } } 캠퍼스 열거형의 경우 캠퍼스 별로 식당을 computed property로 선언해줍니다. 이는 나중에 자료형으로 메뉴를 관리할 때 사용할 예정입니다... 2024. 1. 4.
뿌대식: 개발 - 프로젝트 설정 개발에 앞서 프로젝트에 대한 설정을 해줍니다. 즐겨찾기, 기본 캠퍼스 등 로컬 데이터 저장을 위한 Core Data 추가 깃에서 .DS_Store 처럼 필요 없는 데이터를 커밋하지 않기 위한 깃 이그노어 설정 피그마 사이즈를 스크린 사이즈에 맞춰 변환 디자인 시스템 색상 추가 디자인 시스템 폰트 HTTP 요청을 위한 패키지 추가 2024. 1. 3.
뿌대식: 디자인 - 뷰 트리 디자인 시스템이 구축되었으니 뷰를 기반으로 파생될 수 있는 경우의 수를 만들어줍니다. (개인적으로 뷰 트리라고 부르고 있긴한데, 정확한 명칭은 모르겠네요.) 2024. 1. 2.
뿌대식: 디자인 - 디자인 시스템 유지보수 및 개발을 용이하게 하기 위해 피그마 디자인 시스템을 구축합니다. 구축할 디자인 시스템의 구성은 아래와 같습니다. 컬러 폰트 컴포넌트 2024. 1. 2.
뿌대식: 디자인 - 화면 설계 와이어프레임을 따라 뷰를 그려줄 겁니다. 디자인은 와이어프레임, 툴은 피그마 그리고 컴포넌트는 피그마 iOS 17 컴포넌트 및 SF 심볼을 사용합니다. 2024. 1. 2.
뿌대식: 디자인 - 부산대학교 상징 부산대학교 상징 & UI 부산대학교 학교상징물 부산대학교 학교캐릭터 부산대학교 공식 홈페이지에 따르면 부산대학교에 관한 상징, UI, 상징물, 캐릭터에 대한 간략한 설명은 다음과 같습니다. 상징 - 발전 변모된 교표의 모습을 오늘의 심벌로 이미지화 한 것 독수리 - 웅비, 도약, 희망 책 - 학문과 진리 탐구 도안화 심볼 - 국립부산대학교 머리글자 ㄱ, ㅂ, ㄷ의 도안화 환(環) - 평화와 공존 상징물 효원(曉原) / 효원인 - 우리말로 새벽벌이란 뜻으로 새벽공기같은 참신함과 원효대사같은 수도정진과 성취의 의미 무지개문 - 개교10주년을 기리기 위해 당시의 정문에 궁형(弓形)으로 구축한 우리학교 대표적 상징물 활 모양 곡선 - 자비와 사랑 풍경(風磬) - 대학의 자율 웅비의 탑 - 학문과 예지를 길러 비.. 2024. 1. 1.
뿌대식: 와이어프레임 캠퍼스, 식당, 요일 별로 메뉴를 제공하고, 설정을 통해 앱에 접속했을 때 처음으로 보일 캠퍼스 혹은 오류 및 피드백을 제공받을 수 있는 문의를 제공해줍니다. 추가로 식당의 즐겨찾기를 통해 즐겨찾기한 식당을 우선적으로 보여주는 방식입니다. 1차 와이어프레임 구상이 끝난 후 생각해보니 즐겨찾기를 통해 식당을 우선 정렬하므로 식당 필터는 필요하지 않을 것 같아서 제거했습니다. 2024. 1. 1.
뿌대식: 데이터베이스 재설계 이전 데이터베이스는 관계형으로 “캠퍼스” 테이블의 “부산, 밀양, 양산”부터 점차 리다이렉션하도록 설계했습니다. 최종적으로 오늘 혹은 지정한 요일의 식단을 반환하도록 생각 했었지만, 아래의 문제가 있어서 재설계 했습니다. 필요한 정보를 찾아가는 과정에서 API 요청이 너무 많다. CRUD 중 Read만 해도 된다. 노션 API는 초당 3번의 요청만 가능하다. API에 Query Param, Body를 통한 필터링이 가능하다. 캠퍼스 별 테이블에서 필요한 정보를 카테고리를 사용해서 필터링 할 계획입니다. 또한, 결과적으로 식당이 가장 많은 부산 테이블의 경우 모든 데이터를 요청했을 때 111.78KB, 식당이 가장 적은 양산의 경우 23.92KB로 정규화되지 않은 데이터베이스여도 문제 없을 것 같아요. 필.. 2024. 1. 1.
뿌대식: 데이터베이스 키워드 아래 키워드를 가진 테이블 바탕으로 데이터베이스를 모델링합니다. 캠퍼스 식당 식사 분류 메뉴 트리 수정 뿌대식: 부산대학교 학식 식당 종류의 트리를 데이터 모델에 맞춰 재설계 했습니다. 부산대학교 ├── 부산캠퍼스 │ ├── 금정회관 학생 식당 │ │ └── 조식(천원아침, 정식), 중식(정식, 일품1), 석식(정식, 일품1) │ ├── 금정회관 교직원 식당 │ │ └── 중식(정식) │ ├── 샛벌회관 식당 │ │ └── 중식(정식, 일품), 석식(정식) │ ├── 학생회관 교직원 식당 │ ├── 학생회관 학생 식당 │ │ └── 중식(특정식, 일품) │ ├── 진리관(기숙사) │ │ └── 조식(조기, 조식), 중식, 석식 │ ├── 웅비관(기숙사) │ │ └── 조식(조기, 조식), 중식, .. 2023. 12. 30.