Skip to content

홈 화면 기능 구현#134

Merged
a06246 merged 4 commits intomainfrom
k
Dec 14, 2025
Merged

홈 화면 기능 구현#134
a06246 merged 4 commits intomainfrom
k

Conversation

@a06246
Copy link
Member

@a06246 a06246 commented Dec 14, 2025

No description provided.

@a06246 a06246 merged commit d9e5524 into main Dec 14, 2025
1 check passed
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

Code review by ChatGPT

</NavigationContainer>
</DateProvider>
);
}

Choose a reason for hiding this comment

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

코드 리뷰

  1. 새로운 화면 추가: HomeWidgetEditScreen을 추가했습니다. 파일의 모든 경로가 올바르게 설정되었는지 확인해야 합니다. 특히 HomeWidgetEditScreen의 구현체가 누락되었거나 잘못된 경로일 경우, 이를 해결해야 합니다.

  2. 중복된 스크린 이름 확인: 일부 스크린의 이름이 ROUTES와 충돌할 수 있습니다. 예를 들어, 'KakaoOnboarding'과 같은 특정 스크린이 ROUTES에서 관리되고 있는지와 충돌 가능성을 검토해야 합니다.

  3. 타입스크립트 안전성: iconName의 타입을 any로 사용하는 대신, 명확한 타입을 지정하는 것이 좋습니다. 이를 통해 코드의 가독성과 안정성을 높일 수 있습니다.

  4. 전반적인 코드 구조: 각 스크린을 논리적으로 정리하는 것이 좋습니다. 예를 들어, 각 인증 스크린을 모아두고 주 화면을 따로 관리하는 방식으로 개선할 수 있습니다.

  5. 주석 작성: 각 스크린에 대한 주석을 추가하여, 코드의 맥락을 이해할 수 있도록 돕는 것이 좋습니다.

  6. 성능 고려: screenOptions에서 불필요한 렌더링을 피하기 위해 리액트 메모이제이션을 사용하는 것을 고려해 볼 수 있습니다. 예를 들어, useMemo를 이용하여 tabBarIcon 함수를 최적화할 수 있습니다.

이와 같은 문제들을 해결할 필요가 있으며, 이를 통해 코드의 안정성과 성능을 개선할 수 있습니다.

// setLoading(false는 하지 않음 - Linking 이벤트에서 처리될 때까지 대기
}
} catch (error: any) {
console.error("❌ [카카오 로그인] 에러:", error);

Choose a reason for hiding this comment

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

코드 패치에서 여러 가지 개선 사항과 잠재적인 문제들을 발견했습니다.

  1. 의존성 배열의 결정: 기존 useEffect의 의존성 배열에 navigation을 포함시켰던 것을 handleKakaoDeepLink으로 변경하였는데, 이는 내부 함수에 종속성을 적절히 관리하는 데 좋습니다. 하지만 handleKakaoDeepLink가 변경될 경우에만 useEffect가 호출되므로, 동작의 일관성을 유지할 수 있는지 확인이 필요합니다.

  2. 명시적 오류 처리: 예외적인 상황을 위해 try-catch 블록이 많이 사용되었지만, 각 catch 블록에서 구체적인 에러 처리가 부족합니다. 어떤 에러가 발생했는지를 더 명확하게 알리기 위해 에러 메시지를 사용자에게 전달하는 방법이나 로깅을 더 상세히 작성하는 것이 좋습니다.

  3. 비동기 호출의 취소 신호: setLoading(false)에 대한 처리는, 비동기 호출이 완료된 후에만 호출되도록 보장해야 합니다. 예를 들어, API 호출이 취소되었거나 오류가 발생한 경우에 대한 처리가 불확실합니다.

  4. 코드 리펙토링: if (!code)if (!accessToken)과 같은 조건문에서 중복 로그는 줄여야 합니다. 이들을 공동으로 처리하여 코드의 가독성을 높이는 것이 좋습니다.

  5. Linking 이벤트 및 초기 URL 확인: 앱이 처음 시작될 때 checkInitialUrl의 호출이 성공적으로 작동하지 않을 경우 대처할 수 있는 방법을 추가하시면 좋습니다. 현재는 URL을 확인할 수 있는 기본적인 구조가 잘 구현되어 있는데, 예외 처리 로직이 더 추가되면 유용합니다.

  6. TypeScript 명시적 타입 지정: error: any와 같은 위치에서 구체적인 에러 타입을 지정하면 더욱 견고한 코드를 작성할 수 있습니다.

요약하자면, 이 코드는 몇 가지 개선 포인트와 잠재적인 문제를 가지고 있습니다. 이 문제를 해결한 후에 코드를 병합하는 것을 권장합니다.

},
calorieSection: {
backgroundColor: colors.cardBackground,
borderRadius: 16,

Choose a reason for hiding this comment

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

코드 리뷰

이 코드 패치에는 몇 가지 개선할 점과 잠재적 버그가 있습니다.

1. loadCalendarCalories 함수 비동기 처리

  • nutritionPromisesworkoutTimePromises의 병렬 호출은 잘 처리되었습니다. 그러나, 두 함수에서 발생할 수 있는 에러를 별도로 처리하는 방법이 더 좋을 수 있습니다. 예를 들어, Promise.all()로 처리 도중에 Error가 발생할 경우 모든 Promise가 취소되므로, 각각의 Promise 내부에서 개별적으로 예외 처리를 했으면 합니다.

2. 코드 중복

  • formatWorkoutTime 함수는 두 곳에서 중복 정의되고 있습니다. 이 함수를 별도의 유틸리티 파일로 이동하여 코드 중복을 제거하는 것이 좋습니다.

3. 상태 업데이트의 효율성

  • setCalendarCaloriessetDailyWorkoutSeconds를 연속적으로 호출하였습니다. 상태가 비동기로 업데이트되는 React 상태의 특성상, 이러한 업데이트가 서로 영향을 줄 수 있습니다. 두 상태를 하나의 업데이트로 묶을 수 있다면 더 좋을 것입니다.

4. 코드 이해성

  • 상태 변수 및 함수명은 더욱 명확할 수 있습니다. 예를 들어, dailyWorkoutSeconds 같은 변수보다 workoutTimeByDate와 같이 날짜를 명시적으로 제시하는 이름이 더 명확할 것입니다.

5. 최적화

  • console.log는 디버깅에는 유용하지만, 프로덕션 환경에서는 주의해서 사용해야 합니다. 조건부로 로그를 출력하는 방법이나, 필요 시 로그 수준을 조정할 수 있는 방법이 필요합니다.

위의 내용을 반영하면 코드 품질 및 유지 보수성이 향상될 것입니다.

},
goalCard: {
backgroundColor: "#3a3a3a",
borderRadius: 20,

Choose a reason for hiding this comment

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

코드 변경 사항에서 몇 가지 주의할 점과 개선 사항이 있습니다.

  1. 병렬 API 호출 처리: loadCalendarCalories 함수에서 Promise.all을 사용하여 칼로리 데이터와 운동 시간 데이터를 병렬로 로드하는 부분이 있습니다. 이는 성능을 향상시키는 방법이지만, 응답 순서와 에러 처리를 한 번 더 검토할 필요가 있습니다. 예를 들어, 두 API 호출 간의 의존성이 있는 경우, 병렬 처리로 인해 문제가 발생할 수 있습니다. 이러한 경우에는 Promise.all 대신에 순차적으로 호출하는 것이 더 안전할 수 있습니다.

  2. 에러 핸들링: 운동 시간 조회 API의 에러 처리가 로깅만으로 되어 있는데, 사용자에게 오류 메시지를 보여주는 로직이 포함되면 좋을 것입니다. 이렇게 하면 사용자 경험을 향상시킬 수 있습니다.

  3. 불필요한 임시 변수 제거: setDailyWorkoutSeconds와 같은 상태 변경 can be optimized to avoid unnecessary state updates.

  4. formatWorkoutTime 함수: formatWorkoutTime 함수가 코드 두 곳에 반복적으로 사용되고 있습니다. 이를 별도의 유틸리티 함수로 분리하여 중복을 줄이면 코드를 더 깔끔하게 유지할 수 있습니다.

  5. 타입 안전성: totalSeconds: number의 타입이 homeAPI.getTodayProgress(date)에서 반환되는 값에 따라 다를 수 있습니다. 내부 데이터의 형태나 API 변경이 있을 경우, 타입이 실제 데이터와 불일치할 수 있습니다. 이를 위해 타입 가드 또는 검증 로직을 추가하는 것이 좋습니다.

  6. 스타일 수정: calendarWorkoutTime의 새 스타일은 제대로 적용되고 있는지 확인해야 합니다. 기존에 사용하던 스타일을 덮어쓰지 않도록 확인할 필요가 있습니다.

이 모든 점을 고려하여 PR을 머지하기 전에 해당 사항을 검토하시는 것이 좋겠습니다.

},
});

export default HomeScreen;

Choose a reason for hiding this comment

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

이 코드 패치에는 여러 가지 버그, 위험 요소 및 개선 제안이 있습니다.

  1. 비동기 호출 오류 처리가 불완전합니다.: 여러 API 호출을 Promise.all로 병렬 처리하는 부분에서 실패한 경우에 대한 처리가 부족합니다. 예를 들어, homeAPI.getTodayProgress(date) 호출이 실패하면 이와 관련된 상태가 리셋되는 로직이 없습니다. 이로 인해 사용자에게 잘못된 데이터를 보여주거나 앱이 예기치 않게 종료될 수 있습니다.

  2. 상태 관리 문제: 여러 개의 상태를 관리하다 보니, 상태 스냅샷을 잘못 가져올 위험성이 있습니다. 예를 들어, 상태가 업데이트되기 전에 이전 상태를 참조하는 부분이 있어 race condition이 발생할 수 있습니다.

  3. 주석 추가: 주석이 추가되어 있지만 알림/코멘트와 같은 사소한 부분에도 주석이 추가된다면 더욱 이해하기 쉽고 유지보수에 용이할 것입니다.

  4. 요청 횟수 최적화: loadAICommentsloadMealRecommendation에서 요청을 반복적으로 하는데, 이 과정에서 API의 부하를 줄이기 위해 한번의 호출로 모든 데이터를 받을 수 있도록 설계를 고려할 수 있습니다.

  5. 변수 명명 규칙: 상태변수와 일반 로컬 변수를 구분할 때 명확한 네이밍 컨벤션을 유지해야 합니다. 예를 들어, targetMealType와 같이 의미가 모호해질 수 있는 이름은 피하는 것이 좋습니다.

  6. 불필요한 가독성 낮은 코드 블록: 비슷한 로직이 반복되는 부분(예: setMealRecommendation에 대한 로직을 함수로 분리)에서는 재사용성을 고려하여 별도의 함수로 분리하면 가독성이 높아질 것입니다.

  7. 상태 초기화: 특정 조건에서 상태가 제대로 초기화되지 않을 수 있어, setMealRecommendation에서 null 값이 설정될 때의 조건이 명확히 처리되지 않았습니다. 이 부분은 문제를 일으킬 수 있습니다.

  8. CSS 스타일 최적화: 많은 경우에서 스타일 값이 중복되거나 불필요하게 복잡해 보입니다. 이 부분은 CSS 모듈을 사용하여 관리하거나, 공통 요소를 스타일링 할 때 하나의 스타일 클래스를 공유하도록 리팩토링할 수 있습니다.

이와 같은 문제들을 해결하기 위해서는 코드의 구조를 다시 생각해 보고 리팩토링을 고려하는 것이 좋습니다.

return <DietScreen navigation={navigation} route={{...route, params: {...route?.params, activeTab: dietActiveTab}}} />;
default:
return null;
}

Choose a reason for hiding this comment

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

이 코드 패치에는 몇 가지 우려 사항이 있습니다:

  1. 상태 관리의 불확실성: dietActiveTab의 초기값이 undefined로 설정되어 있습니다. 이후에 setDietActiveTab가 호출되기 전까지 상태를 사용하는 부분이 있을 수 있습니다. 이러한 경우, 컴포넌트가 렌더링될 때 dietActiveTabundefined일 수 있으므로, 이를 처리할 로직이 필요합니다.

  2. 비동기 관련 문제: setParams 호출 후 바로 dietActiveTabundefined로 설정하고 있습니다. 이후 로직에서는 이 값이 여전히 사용될 수 있습니다. 상태 업데이트가 비동기적으로 발생하기 때문에 다음 렌더링에서 dietActiveTab이 제대로 반영될 것인지 확인해야 합니다.

  3. 리팩토링 제안: useEffect 훅에서 route.params.dietActiveTab의 존재 여부를 확인할 때, 이를 === undefined와 같은 명시적인 비교로 체크하는 것이 좋습니다. 이를 통해 코드의 가독성이 향상됩니다.

  4. 상태 의존성: useEffect 내에서 route?.params?.dietActiveTab를 의존성 배열에 추가하여 상태가 변경될 때 올바르게 핸들링하도록 하지만, navigation 또한 의존성 배열에 포함되어 있는 것에 유의해야 합니다. 이 값이 변경될 경우 추가적인 사이드 이펙트가 발생할 수 있습니다.

이상으로 몇 가지 주의할 점과 개선 사항을 제안하니, 이를 반영한 후 다시 검토하는 것이 좋습니다.


// 영양 목표 조회
// GET /food/nutrition-goal/get?user_id={user_id}&date={date}
getNutritionGoal: async (date: string): Promise<any> => {

Choose a reason for hiding this comment

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

코드 리뷰 의견

  1. 타입 선언: getTodayProgress 메소드의 타입 선언에 Promise<...>로 쓰고 있지만 실제 코드에서 정의한 부분이 전형적인 함수를 조금 다르게 쓰고 있습니다. 타입스크립트 코드에서는 Promise<...>를 반환하는 것이기 때문에 함수의 반환이 Promise 타입으로 되어 있어야 합니다.

  2. HTTP 요청 URL 하드코딩: 여러 API 호출에서 동일한 IP 주소 (예: http://43.200.40.140:8000/)를 하드코딩하는 것은 좋지 않습니다. 환경 변수나 설정 파일을 통해 관리하는 것이 바람직합니다.

  3. 에러 처리: 각 API 호출에서 console.error로 에러를 로그하고 있지만, 사용자가 요청하는 부분에서는 오류 메시지를 어떻게 처리할 것인지가 명확하지 않습니다. 사용자에게 보다 유익한 정보를 제공할 수 있도록 UI에서 처리할 수 있는 방법이 필요합니다.

  4. 데이터 구조 변경에 대한 염려: 응답 데이터를 사용하는 부분에서 JSON으로 파싱하면서 data가 항상 JSON 구조를 가진다고 가정하고 있습니다. 만약 데이터가 잘못된 형식을 가진 경우, 예외 처리가 충분치 않습니다.

  5. 重複 코드: 주간, 월간 운동 및 영양 코멘트를 조회하는 함수들 (예: getWeeklyExerciseComment, getMonthlyNutritionComment 등)에서 유사한 코드가 많이 반복되고 있습니다. 이러한 부분을 공통 함수로 분리하여 코드 중복을 최소화하고 유지보수성을 높일 수 있습니다.

  6. 기타 작은 개선 사항:

    • API 호출에 대한 응답 형식이 일관되지 않을 경우 에러를 보다 쉽게 추적할 수 있도록 로깅을 개선할 필요가 있습니다.
    • 불필요한 catch 문에서 오류를 비워 두기보다는 디버깅을 쉽게 하기 위해 로그를 남기는 것이 좋습니다.

throw error;
}
},
};

Choose a reason for hiding this comment

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

이 코드 패치에는 몇 가지 주의해야 할 점이 있습니다:

  1. TypeScript 타입: Promise<null> 또는 Promise<any>에 대한 TypeScript의 반환 타입을 명시하는 것이 좋습니다. 현재 return null as any;와 같은 방식으로 null 반환을 처리하면 타입 안정성이 떨어질 수 있습니다.

  2. error.status 체크: 함수에서 error.status를 체크하고 있지만, error 객체가 항상 status 속성을 갖고 있다는 보장은 없습니다. 이로 인해 예상치 못한 오류가 발생할 수 있으므로, error 객체의 구조를 명확히 확인하는 것이 필요합니다. 예를 들어, if (error && error.status === 401)과 같이 조건문을 사용하여 error가 정의되어 있는지 먼저 확인하세요.

  3. null 반환 처리: 404 오류 발생 시 null을 반환하는 것은 해당 호출을 옹호하는 사용 사례가 확실하지 않으면 좋지 않은 아이디어일 수 있습니다. 대신 적절한 오류 처리를 고려하거나, 호출하는 측에서 이 값을 구분하여 처리할 수 있도록 명확한 반환을 제공하는 것이 좋습니다.

  4. 로깅: 현재 로깅 메시지가 영어와 한국어가 섞여 있습니다. 일관된 메시지를 제공하는 것이 좋습니다. 이로 인해 사용자나 개발자가 로그를 읽을 때 혼란을 줄일 수 있습니다.

  5. async/await 관리: 호출하는 API의 응답을 한 번만 가져오고 있으므로, .then().catch()를 사용하는 것도 대안이 될 수 있습니다. 하지만 이건 개인적인 스타일의 문제로 두 가지 방법 모두 나쁘지 않습니다.

이러한 사항들을 반영하여 코드를 수정하는 것이 좋습니다.

},
};

/**

Choose a reason for hiding this comment

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

이 코드 패치에는 몇 가지 잠재적인 문제가 있습니다.

  1. 에러 핸들링: catch 블록에서 오류 메시지를 error 객체로 출력하고 있습니다. 그러나 error 타입이 any로 지정되어 있어, 특정 속性을 보장할 수 없습니다. 이를 구체화하여 예상되는 에러 형식을 적용하는 것이 좋습니다.

  2. 타입 안전성: request 함수를 호출할 때 타입 안전성을 확보하기 위해 TypeScript의 unknown 타입으로 시작하여 적절한 검사나 변환을 통해 안전하게 처리하는 것이 좋습니다.

  3. 미사용 로그: 함수에서 console.log로 출력하는 정보가 필요하지 않거나 과도할 수 있습니다. 프로덕션 코드에서는 불필요한 로그를 제거하여 성능을 개선하고 보안을 강화하는 것이 좋습니다.

  4. API 응답 확인: API의 응답 형식(예: status 코드, 헤더 등)을 간편하게 검증하지 않고, 단순히 응답을 받는 부분이 있습니다. 응답의 성공 여부를 확인하고, 실패 시 적절한 예외 처리를 추가하면 안정성을 높일 수 있습니다.

  5. 교차 URL 스크립트 (XSS): 외부 입력 값을 로그에 출력하는 경우, 해당 값이 신뢰할 수 없는 경우에는 XSS 공격에 취약해질 수 있습니다. 사용자에게서 받은 데이터를 로그에 출력할 때는 항상 검증하고 필터링해야 합니다.

이러한 개선 사항과 잠재적 버그를 고려하여 추가적인 수정을 하는 것이 좋습니다.

};
} catch (error: any) {
if (axios.isAxiosError(error)) {
console.error("[WORKOUT][TIME] 오늘 운동 시간 조회 에러:", {

Choose a reason for hiding this comment

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

코드 패치는 일부 개선 사항이 필요합니다. 다음은 주의할 점입니다:

  1. 선택적 프로퍼티의 사용: totalSeconds와 같은 선택적 필드를 사용하는 경우, 실제로 이 값이 undefined일 때 어떻게 처리할 것인지 명시적으로 고려해야 합니다. 지금은 기본값으로 0을 사용하고 있지만, API 응답에서 이 필드가 없을 때의 로직이 명확하지 않습니다.

  2. 유효성 검사 부족: data.userId에서 기본값으로 userId를 사용하는데, 이는 API 응답에서 userId가 없을 경우에 대한 대비가 부족합니다. 누락된 경우 적절한 예외 처리가 필요합니다.

  3. 로그 메시지의 유용성: 응답 로그에 '오늘 운동 시간 조회 응답'을 기록하고 있지만, JSON 응답의 예시를 포함하여 어떤 데이터가 로그로 출력되는지 명확하게 할 수 있습니다. 이는 추후 디버깅에 도움이 될 것입니다.

  4. 에러 처리 개선: 현재 에러를 잡고 로그를 찍고 있지만, 사용자에게 에러 메시지를 적절히 전달하거나 UI에서 반영할 수 있는 추가적인 처리로 개선할 수 있습니다.

  5. API URL 하드코딩: 주석으로 남긴 API URL은 운영 환경에서 보안상 노출될 수 있으므로, 하드코딩된 URL은 환경 변수나 설정 파일로 옮기는 것이 좋습니다.

  6. 정상적인 HTTP 응답 처리 체크: 현재 코드는 API 응답이 정상적일 때만 동작합니다. 이 외의 상황에서도 코드가 예외를 발생시키지 않고 안정적으로 작동하게 해야 합니다. 예를 들어, HTTP 상태 코드가 200이 아닐 경우에 대한 처리가 필요합니다.

이러한 문제를 해결하면 더욱 견고한 코드를 만들 수 있습니다.

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