Skip to content

[Feat] DoDo - app 전반적 기능 구현 - #4

Merged
sooloin merged 24 commits into
DoDo-Project:developfrom
sooloin:feature/4
Sep 9, 2026
Merged

sooloin merged 24 commits into
DoDo-Project:developfrom
sooloin:feature/4

Conversation

@sooloin

@sooloin sooloin commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

📄 작업 내용 (Description)

산책 탭에 실제 GPS 위치를 연동하고, 커뮤니티 게시글 이미지 표시, 마이도도 펫 정보 표시, 웹소켓/이미지 피커 안정성 등 API 연동 이후 발견된 이슈들을 개선했습니다.

  • 반려동물 이름 필드(name/petName) 응답 불확실성에 대응하는 getPetListName 유틸 추가 및 전 화면 적용
  • 산책 지도에 실제 GPS 위치(useCurrentLocation) 연동, 지도 마커·울타리 색상 개선
  • 커뮤니티 게시글 썸네일/상세 이미지 표시, 글 작성 후 목록 자동 갱신
  • 안드로이드 STOMP 웹소켓 프레임 처리 및 TextEncoder 폴리필 추가
  • 시스템 포토 피커 미지원 기기에서 이미지 선택 실패 시 에러 메시지 개선
  • 날짜 선택 모달 캘린더 행 수 고정으로 높이 흔들림 방지
  • expo-location, expo-dev-client, fast-text-encoding 패키지 추가

🔗 관련 이슈 (Related Issues)

  • Closes: #4

✅ 체크리스트 (Checklist)

  • PR 제목은 커밋 컨벤션을 따랐습니다.
  • 관련 이슈를 연결했습니다.
  • 스스로 코드를 검토하고 불필요한 코드를 제거했습니다.
  • 코드 스타일이 프로젝트 규칙과 일치합니다. (Style)
  • 새로운 기능에 대한 테스트 코드를 추가했거나, 기존 테스트가 모두 통과했습니다. (Test)

📸 스크린샷 (Screenshots)

Before After

💬 기타 사항 (Etc)

  • activity-tracking-screen.tsx, fence-settings-screen.tsx는 GPS 연동과 펫 이름 방어 처리가 함께 반영되어 있음!

sooloin added 24 commits August 16, 2026 21:54
- (tabs)/_layout.tsx: 웹 헤더(로고+nav+프로필)를 홈/산책/커뮤니티/마이도도
  4개 하단 탭바로 재설계
- (tabs)/index.tsx: 홈 화면 구현 (AI 건강 레포트 카드, 펫 정보 카드,
  공지사항 리스트) — 백엔드 연동 전이라 mock 데이터 사용
- (tabs)/walk.tsx, community.tsx, mypage.tsx: 나머지 탭 플레이스홀더 추가
- constants/theme.ts: DoDo 디자인 토큰(brand, background, border 등) 추가
- (tabs)/explore.tsx: Expo 기본 템플릿 화면 제거
- RN Web 탭 라벨 텍스트가 한글 받침에서 잘리는 flex-shrink 이슈 수정
- (tabs)/community/index.tsx: 인기 게시물/최근 게시물 리스트, 상단 "내 활동"
  링크, 우측 하단 글쓰기 FAB — PC 사이드바(글쓰기/내 활동)를 앱 패턴으로 재배치
- (tabs)/community/[boardId].tsx: 게시물 상세 (작성자/사진/본문/좋아요·싫어요/
  댓글) 한 화면으로 통합, boardId 기준 mock 데이터 조회
- (tabs)/community/_layout.tsx: 리스트→상세 이동용 자체 Stack 네비게이터,
  커스텀 뒤로가기 버튼 헤더에 연결
- (tabs)/community/new.tsx, my.tsx: 글쓰기/내 활동 화면 스텁 추가
- 백엔드 연동 전이라 mock 데이터 사용
- (tabs)/community/new.tsx: 게시글 작성 폼 (제목/내용/이미지 첨부) +
  하단 고정 액션바(취소/임시저장/게시하기), 제목·내용 입력 시에만
  게시하기 활성화
- (tabs)/community/my.tsx: 내 활동 화면 — 내 게시글/내 댓글 탭 전환,
  페이지네이션 UI. PC 사이드바(프로필/글쓰기/내활동)는 중복이라 제외
- components/community/post-row.tsx: 게시물 리스트 행을 공용 컴포넌트로
  분리해 커뮤니티 목록·내 활동 화면에서 재사용
- (tabs)/community/_layout.tsx: new/my 화면 헤더(뒤로가기) 옵션 추가
- 이미지 첨부는 UI만 구현, 실제 업로드는 이슈7(expo-image-picker) 이후 연동
- (tabs)/walk.tsx: 반려동물 선택 칩(5마리) + 울타리 정보(반경/사용상태) +
  수정 버튼 UI 구현, 칩 선택에 따라 하단 정보 전환
- 지도는 실제 렌더링 대신 플레이스홀더로 표시 — @mj-studio/react-native-naver-map은
  네이티브 모듈이라 이슈1(앱 식별자 확정 + 네이버 지도 콘솔 등록) 완료 후 설치 예정
- 산책(실시간 위치 추적) 화면은 이번 범위에서 제외, 울타리 설정만 우선 구현
- app.json: 앱 식별자(com.dodo.app) 확정, @mj-studio/react-native-naver-map
  config plugin 등록(Client ID 포함)
- (tabs)/walk.tsx + components/walk/fence-map.tsx: 산책 울타리 화면에
  실제 네이버 지도(NaverMapView, NaverMapCircleOverlay) 연동
- components/walk/fence-map.web.tsx: 네이버 지도가 네이티브 전용 모듈이라
  react-native-web에서 렌더링이 안 되는 문제 대응 — 지도 렌더링 부분만
  컴포넌트 단위로 분리해 웹 프리뷰에서는 안내 플레이스홀더로 대체
  (route 파일 단위 분리는 expo-router에서 동작하지 않아 컴포넌트 레벨로 해결)
- shared/lib/auth/tokenStorage.ts: accessToken/refreshToken은
  expo-secure-store, 비민감 프로필 정보는 AsyncStorage에 저장.
  웹은 SecureStore 미지원이라 AsyncStorage로 폴백 처리
- shared/lib/auth/authStore.ts: Zustand 기반 인증 상태 스토어 (웹의
  'dodo:auth-state-change' 커스텀 이벤트를 대체)
- shared/lib/auth/oauth.ts: expo-auth-session/expo-web-browser 기반
  소셜 로그인 플로우, CSRF state 검증 포함
- shared/lib/auth/refreshAccessToken.ts: 동시 요청 시 중복 리프레시를
  막는 in-flight promise 공유 처리
- shared/api/axios.ts: 요청 시 accessToken 자동 주입(+ 만료 임박 시
  사전 갱신), 401 응답 시 리프레시 후 재시도 인터셉터 추가
- app/_layout.tsx: react-native-url-polyfill 적용, 앱 시작 시 세션 hydrate
- OAuth 시작/리프레시 엔드포인트는 백엔드 스펙 미확정 상태라
  Spring Security 기본 컨벤션을 가정한 TODO로 표시해 둔 상태
- (tabs)/mypage/index.tsx: 프로필 카드 + 메뉴 리스트로 재구성
  (PC 사이드바를 마이페이지 표준 패턴으로 변환), 로그아웃은 실제
  authStore.clearSession() 연동
- pets/index.tsx, pets/new.tsx: 반려동물 리스트 + 등록 폼
  (종/성별 칩 선택, 생년월일 입력 시 만 나이 자동 계산)
- pets/[petId]/index.tsx, weight.tsx, notes.tsx: 반려동물 상세정보,
  체중 관리(react-native-svg 기반 추이 그래프 + 기록 추가/삭제),
  특이사항 관리(카테고리 필터/추가/삭제)
- family/index.tsx, apply.tsx, received.tsx: 가족 관리 메인
  (펫별 구성원/초대코드 발급), 가족 신청 관리, 받은 신청 목록.
  등록된 펫이 없으면 등록 유도 화면으로 전환
- device.tsx, walk-log.tsx, ai-report.tsx, profile-edit.tsx,
  notifications.tsx: 프로필 수정은 구현 완료, 나머지는 스텁으로 우선
  라우팅만 연결
- react-native-svg 설치
- 특이사항 카테고리 드롭다운이 다른 카드에 가려 보이던 z-index 버그 수정
- SafeAreaView 컴포넌트 대신 useSafeAreaInsets 훅으로 전환 (SafeAreaView가 New Architecture에서 검은 화면 유발)
- 홈/커뮤니티/산책 화면 상단 패딩에 insets.top 반영
- 탭 바 높이에 insets.bottom 반영, 루트 Stack에 배경색 contentStyle 추가
- Naver Maps SDK(com.naver.maps:map-sdk) 아티팩트가 없어 빌드 실패하던 문제 해결
- 커스텀 Expo config plugin으로 android/build.gradle에 네이버 Maven 저장소 주입
- 프론트가 구글/네이버에 직접 인가 코드를 요청하고 백엔드는 코드 교환만 수행하는 구조로 변경
- POST /auth/social-login, POST /auth/reissue 연동 (accessTokenExpiresIn 단위가 로그인은 ms, 재발급은 초 단위인 실제 백엔드 특성 반영)
- 마이도도 로그아웃 버튼에 실제 로그아웃 API 연동
- .env에 배포 주소/구글 클라이언트 ID 반영, 네이버는 백엔드 미배포로 선택값 처리
- @stomp/stompjs: 산책 실시간 위치 STOMP 연동용
- expo-image-picker: 사진 업로드 기능용 (앨범 접근 권한 플러그인 설정 포함)
- 도메인별 axios 함수/타입 전체 작성 (활동/커뮤니티/가족/울타리/파일/메인/펫/유저)
- 산책 실시간 위치용 STOMP 훅, 이미지 피커/캘린더/지역선택 등 재사용 컴포넌트 추가
- 지역(시/도·시/군/구) 데이터는 웹(dodo-frontend)에서 그대로 이식
- 구글 로그인을 네이티브 SDK에서 웹과 동일한 브라우저 리다이렉트 방식으로 재작성
  (Android가 커스텀 스킴 직접 리다이렉트를 차단하는 정책 문제 해결)
- 네이버 로그인도 동일 방식으로 활성화
- 회원가입을 약관 동의 → 프로필(닉네임 중복확인/지역선택/사진) → 알림설정 → 완료
  4단계 위저드로 재구현, 웹의 안전한 재시도 로직까지 이식
- 회원정보 수정, 알림 설정, 회원 탈퇴(이메일 인증 2단계) 연동
- 반려동물 등록/수정/상세/특이사항/체중 관리 연동, 사진·생년월일 캘린더 입력 추가
- 가족 관리/신청/받은신청 연동, 가족 프로필 사진+이름 그리드로 표시
- 목데이터 파일 삭제
- 게시글 피드/상세/작성/수정/삭제, 댓글 CRUD, 좋아요·싫어요 반응 연동
- 게시글 이미지 여러 장 첨부, 임시저장 및 재진입 시 불러오기 연동
- 내 활동(내 게시글/내 댓글) 연동
- 반려동물 프로필/AI 건강 리포트 요약 연동, 여러 마리 시 선택 전환 지원
- 울타리 설정을 실제 API 연동 + 생성/수정 UI 신규 구현
- 산책 활동 기록 기능 신규 구현: 시작/일시정지/종료, 기록 목록, 경로 리플레이,
  주변 인기 활동
- 실시간 위치 표시용 지도 컴포넌트 및 좌표 방어 로직 추가
@sooloin sooloin self-assigned this Sep 9, 2026
@sooloin
sooloin merged commit 995ae8f into DoDo-Project:develop Sep 9, 2026
1 check passed
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.

1 participant