Skip to content

feat: 모여봐요 탭을 캠퍼스로 교체하고 게시판을 진입점에서 제거 - #306

Merged
rdyjun merged 24 commits into
developfrom
feat/campus-tab
Sep 6, 2026
Merged

feat: 모여봐요 탭을 캠퍼스로 교체하고 게시판을 진입점에서 제거#306
rdyjun merged 24 commits into
developfrom
feat/campus-tab

Conversation

@rdyjun

@rdyjun rdyjun commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

하단 두 번째 탭을 모여봐요에서 캠퍼스로 바꾸고 맛집·학식·캠퍼스 생활 진입점을 모았습니다.

  • 맛집은 기존 GetRestaurantsUseCase로 상위 6개를 조회합니다. 캠퍼스 전용 Riverpod provider가 목록 상태를 관리하며 API·Repository·UseCase는 그대로 사용합니다.
  • 맛집 분류별 색상과 이모지, 오늘 학식, 도서관·챗봇·학사일정 링크를 표시합니다. 학식은 기존 CafeteriaViewModel을 사용하고 로딩·조회 실패·메뉴 없음 상태를 구분합니다.
  • 맛집·도서관은 기존 named route로 이동하고, 챗봇은 기존 로그인 검사와 LoginRequiredDialog를 사용합니다.
  • /board와 기존 게시판 화면은 같은 StatefulShellBranch 안에 유지합니다. 푸시로 게시판에 진입한 뒤에도 하단 탭으로 돌아갈 수 있습니다. 탭의 기본 화면은 /campus입니다.

변경 범위는 캠퍼스 UI, 탭 표시, 필요한 라우트 추가와 색상입니다. 공통 인증 함수·공통 섹션 헤더 추출, CI 설정 변경, 의존성 변경은 포함하지 않습니다.

검증: 커밋 505e70aiOS release 빌드가 성공했고 분석 로그의 error는 0개입니다. git diff --check와 변경 Dart 파일의 프로젝트 내부 import 검사도 통과했습니다. 기존 data/domain/providers, 공통 presentation/utils, CI 및 pubspec 파일에 변경이 없음을 확인했습니다. 로컬 Flutter SDK가 없어 기기에서 화면 동작을 실행해 확인하지는 못했습니다.

게시판(모집·장터)을 UI 에서 걷어내고 그 자리에 캠퍼스 탭을 넣는다.
모여봐요는 "모임" 이라는 뜻인데 맛집·학식·도서관처럼 "탐색" 에 가까운 것들이
들어가므로 이름도 함께 바꿨다.

캠퍼스 탭 구성
- 오늘 뭐 먹지: 좋아요 랭킹 상위 맛집. /restaurants/nearby 가 이미
  likeCount desc, distance asc 로 정렬해 내려주므로 앞에서 잘라 쓴다
- 학식: 오늘 메뉴. 대표 메뉴를 뽑지 않고 전부 같은 무게로 나열한다
- 캠퍼스 생활: 도서관·챗봇·학사일정

맛집 썸네일은 카테고리별 색 면으로 대신한다. 카카오 로컬 API 에 이미지 필드가
없어 가게 사진을 받을 수 없다. 분류가 없거나 새 카테고리가 생기면 밥 모양으로
떨어지게 두었다.

/board 라우트와 BoardPageScreen 은 지우지 않고 셸 밖 최상위 라우트로 옮겼다.
모집·장터 푸시 딥링크(push_router)와 홈 인기 모집이 아직 이 경로로 이동하고,
되돌릴 여지도 남겨둔다.

과팅은 이번에 넣지 않았다. getBlindDateOpen 이 authDio 를 써서 비회원이 못 쓰고,
닫혀 있을 때 false 대신 예외를 던져 "닫힘" 과 "오류" 를 구분할 수 없다.
데이터소스를 먼저 손봐야 한다.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

FutureBuilder 를 build() 안에서 만들어 부모가 리빌드될 때마다
/restaurants/nearby 를 새로 호출했다. topRestaurantsProvider 로 옮긴다.
프로젝트에서 FutureBuilder 를 쓰는 곳이 여기뿐이기도 했다 —
나머지는 모두 Riverpod 프로바이더와 AsyncValue.when 을 쓴다.
실패했을 때 안내 문구도 함께 넣었다.

그 밖에
- CampusPageScreen 이 ref 를 쓰지 않아 StatelessWidget 으로 내린다
- Scaffold 와 SafeArea 순서를 형제 탭(board_page_screen)과 맞춘다
- 기능 구분용 배경색을 ColorStyles.mintBg / amberBg 로 올린다
캠퍼스 학식은 오늘 하루치 문자열을 그대로 한 줄에 뿌리고 있었다. 주간
데이터는 이미 한 응답에 다 들어오는데 하루만 쓰고 버리던 셈이다. 좌우로
넘겨 월~금을 볼 수 있게 하고, 날짜는 넘긴 장을 따라 판 안에서 바뀐다.
구획 제목의 날짜 꼬리표는 뺐다 — 제목에 두면 화면이 페이지 상태를 들고
있어야 하고, 홈과 캠퍼스가 같은 것을 두 번 만들게 된다.

메뉴는 하루 일곱 항목쯤 오는데 그중 밥·김치·요구르트가 매일 같다. 일곱을
같은 무게로 늘어놓으면 자리의 절반을 매일 같은 글자가 먹는다. 그렇다고
대표 메뉴를 뽑을 수는 없다 — 어떤 메뉴가 앞에 올지 서버가 보장하지 않아
앞자리를 주메뉴로 올리면 엉뚱한 게 대표가 된다.

그래서 순서도 이름도 보지 않고 등장 일수만 센다. 그 주 급식일의 80% 이상에
나오는 항목만 아래로 내린다. 고정 목록을 박지 않는 이유는 그 목록이 곧
틀리기 때문이다 — 비빔밥이 나오는 날은 밥 이름이 다르고(그날은 내려가면
안 된다) 김치도 주에 따라 깍두기가 된다. 실제 한 주로 확인했다.

  배추김치 5/5, 요구르트 5/5, 백미밥 4/5 → 내려감
  나머지 스물몇 개는 전부 1/5 → 위에 남음
  금요일 오색나물비빔밥은 1/5 이라 위에 남음

셀 표본이 세 날이 안 되거나, 내리고 나서 위에 두 항목이 안 남으면 아무것도
내리지 않고 예전처럼 전부 한 무게로 보여준다.

세는 자리는 ViewModel 이다. 위젯에서 하면 rebuild 마다 다시 센다. 서버로
올리지 않은 이유는 /meal/current 가 월~금을 한 번에 내려줘 표본이 이미
클라이언트에 다 있고, 무엇을 뒤로 물릴지는 급식의 속성이 아니라 화면의
판단이라서다.

그리는 조각은 core/presentation/components 에 둔다. 홈도 같은 것을 쓴다.

곁들여 고친 것:

- 휴무 판정이 `koreanMenu.length < 10` 이었다. 서버가 보내는 `식단 정보 없음`
  이 마침 9자라 우연히 맞고 있었고, 짧은 메뉴가 하루 오면 그날이 통째로
  휴무가 된다. 그 문자열을 직접 본다.
- weekMeals 에 `오늘은 학식이 제공되지 않아요!` 라는 문구를 데이터로 채워
  넣던 것을 걷어냈다. 안내 문구가 데이터 필드에 있으면 다른 날을 보여줄 때도
  "오늘은" 이라고 말한다. 없음은 값이 아니라 상태로 둔다.
- 🍚 이모지를 뺐다. 구획 제목이 이미 `학식` 이라 한 번 더 말할 이유가 없다.
서버가 그 날 보내는 값은 `식단 정보 없음` 이다. 급식을 안 하는 날인지
크롤링이 그 날을 못 가져온 것인지 구분해 주지 않는다. 그런데 앱은
`학식을 하지 않는 날이에요` 라고 단정하고 있었다. 식당은 여는데 앱만
안 한다고 말하는 날이 생긴다.

서버가 말한 만큼만 말한다. 불러오기 자체가 실패한 경우는 예전대로
`학식을 불러오지 못했어요` 로 따로 뜬다.
@rdyjun
rdyjun merged commit 801efc6 into develop Sep 6, 2026
1 check passed
This was referenced Sep 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants