Merged
Conversation
- 부모 로그인 시, 자녀 목록이 비어있을 경우를 대비하여 `firstOrNull`을 사용하여 안전하게 첫 번째 자녀의 ID를 저장하도록 수정했습니다. - 자녀 회원가입 화면(`AuthKidSignupScreen`)의 `KidInputField`에 `imeAction`을 `ImeAction.Next`로 설정하여 키보드에서 다음 입력 필드로 이동할 수 있도록 사용성을 개선했습니다. - `AuthKidSignupScreen` 함수의 파라미터 순서를 일부 조정했습니다.
- 자녀 회원가입(`KidSignupViewModel`) 성공 시, 수신한 토큰(Access, Refresh)을 `TokenManager`를 통해 저장하도록 로직을 추가했습니다.
- `KidInputField`의 `KeyboardOptions`을 `KeyboardType.Uri`로 설정하고 자동 완성을 비활성화하여 초대코드 입력 경험을 개선했습니다.
- 자녀 미션 화면(`KidMissionScreen`)에서 미션 완료 팝업(`KieroDialog`)의 UI 및 로직을 수정했습니다.
- 미션 완료 후 확인 버튼을 누를 때 팝업이 닫히도록 변경했습니다.
- 미션 보상 금액이 동적으로 표시되도록 수정했습니다.
- 미션 완료 상태(`isCompletedMission`)를 관리하는 로직을 추가했습니다.
- 자녀 미션 화면의 고블린 이미지 위치와 말풍선 상단 패딩을 조정했습니다.
- 자녀 미션 화면 상단의 보유 코인 개수가 실시간으로 반영되도록 수정했습니다.
- 자녀 이름 표시 방식을 '성+이름'에서 '이름'만 표시되도록 `KidMissionContract`를 변경했습니다.
- 소원 빌기 성공 후 확인 버튼 클릭 시, 다이얼로그가 닫히도록 로직을 수정했습니다. - 소원 아이템 구매 실패 시, 에러 메시지 스낵바가 표시된 후 다이얼로그가 닫히도록 변경했습니다. - 자녀의 이름을 성(lastName)을 제외하고 이름(firstName)만 표시하도록 수정했습니다. - 소원 리스트가 홀수일 경우에도 레이아웃이 깨지지 않도록 `KidWishGridList`의 구조를 개선했습니다. - 소원 빌기 다이얼로그의 확인 버튼 로직을 `isCompletedWish` 상태에 따라 분기 처리하도록 수정했습니다.
- 회원가입 프로세스에서 더 이상 사용하지 않는 자녀 연동 확인 로직(`checkExistingChild`, `checkChildRegistration`)을 제거했습니다. - 회원가입 완료 후 시작하기 버튼의 색상을 메인 컬러로 변경했습니다. - 자녀 정보 입력 필드(`ParentSignUpAddChildScreen`)의 `imeAction`을 `Next`로 명시하여 키보드 액션을 개선했습니다. - 로그아웃 및 데모 데이터 관련 로직에서 비활성화된 코드를 정리했습니다. - 부모 일정 화면(`ParentScheduleScreen`)에 로딩 인디케이터를 추가했습니다. - `ParentEventDto`의 패키지 경로를 수정했습니다.
- SSE(Server-Sent Events) 연결 시 `readTimeout`을 0으로 설정하여 타임아웃이 발생하지 않도록 수정했습니다. - 중복된 슬래시(`//`)를 제거하여 SSE 연결 URL을 수정했습니다. (`/api/v1/subscribe` -> `api/v1/subscribe`) - 사용하지 않는 `suspendRunCatching` import 구문을 제거했습니다. - `FeedDataDto`와 `InviteDataDto`의 패키지 경로를 `...remote.dto.event`에서 `...remote.dto.response`로 변경하여 일관성을 맞췄습니다.
- `KidJourneyViewModel`과 `KidMissionViewModel`에 `SseManager`를 주입하여 SSE 구독 로직을 추가했습니다. - SSE를 통해 새로운 일정이나 미션 이벤트가 수신되면, 토스트 메시지를 표시하고 관련 데이터를 다시 불러와 화면을 갱신하도록 구현했습니다. - 기존의 10초 주기 폴링 방식 데이터 갱신 로직(`startAutoRefresh`)을 제거하고 SSE 기반의 실시간 업데이트로 변경했습니다. - `SseManager`에서 SSE 구독 실패 시, 3초 후 재연결을 시도하는 예외 처리 및 재시도 로직을 추가했습니다. - 자녀 인증 화면(`KidInputField`)의 입력 필드에 5자 길이 제한을 추가했습니다. - 일부 DTO 클래스의 패키지 경로를 `dto.event`에서 `dto.response`로 수정하여 일관성을 개선했습니다.
- 여정, 미션 화면에 SSE 적용하여 실시간으로 데이터 업데이트 - 부모 일정 화면 진입 시 SSE 연결 시작하도록 수정 - KidInputField에 inputTransformation 파라미터 추가
- 부모 로그인 화면(`AuthParentScreen`)의 고블린 말풍선 위치를 조정하고, 뒤로 가기 버튼 클릭 시 이전 화면으로 이동하도록 `BackHandler`를 추가했습니다. - SSE 연결 실패(`onFailure`) 시, `Throwable` 정보를 로깅할 수 있도록 `close(t)`를 호출하도록 수정했습니다. - 부모 정보 UI 모델(`ParentInfoUiModel`)에서 더 이상 사용하지 않는 이름 포매팅 로직(`formattedParentName`)을 제거하고, 관련 화면(`ParentSignUpScreen`)도 수정했습니다. - SSE 구독 로직(`SseManager`)의 `subscriptionLoop`에서 `isActive` 파라미터를 제거하고, `currentCoroutineContext().isActive`를 사용하여 코루틴의 활성 상태를 직접 확인하도록 변경했습니다. - 스플래시 화면에서 인증 화면(`AuthGraph`)으로 이동 시, 이전 스택을 모두 제거하고 단일 인스턴스로 실행되도록 내비게이션 로직을 수정했습니다. (`popUpTo<Splash>`, `launchSingleTop = true`) - 자녀 여정(`KidJourneyViewModel`) 및 미션(`KidMissionViewModel`) 화면의 SSE 이벤트 수신 시, 디버깅을 위한 로그를 추가했습니다. - 부모 로그인 화면에서 사용하던 작은 고블린 이미지를 제거하고, 하나의 고블린 이미지만 사용하도록 정리했습니다.
dmp100
approved these changes
Jan 22, 2026
seungjae708
approved these changes
Jan 22, 2026
Collaborator
seungjae708
left a comment
There was a problem hiding this comment.
SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!SSE의 신! SSE의 신! SSE의 신!
…into mod/#61-qa-reflect-four # Conflicts: # app/src/main/java/com/kiero/presentation/parent/alarm/viewmodel/ParentAlarmViewModel.kt
…into mod/#61-qa-reflect-four
…ro/Kiero-Android into mod/#61-qa-reflect-four
- `PresignedUrl`을 받아 S3에 이미지를 업로드하는 로직을 구현했습니다. - `S3Service` 인터페이스를 정의하여 `PUT` 요청으로 이미지를 업로드하는 API를 추가했습니다. - 이미지 업로드를 담당하는 `PresignedUrlRepository`를 추가했습니다. 이 Repository는 URI로부터 이미지 데이터를 읽어 `RequestBody`로 변환하고, `S3Service`를 통해 업로드를 수행합니다. - API 응답을 처리하기 위한 `PresignedUrlResponse` DTO와 `PresignedUrlModel` 데이터 클래스를 추가했습니다.
- Hilt 모듈(`ScheduleServiceModule`)에 `S3Service`를 추가하여 S3 파일 업로드를 위한 Retrofit 인스턴스를 생성하도록 구현했습니다. - 자동 일정 입력 필드(`ScrollableAutoInputField`)의 하단 여백을 65dp에서 60dp로 조정했습니다. - 더 이상 사용하지 않는 `img_kid_coin.png` 이미지 파일을 삭제했습니다.
- **로그아웃 로직 개선**
- 로그아웃 시 SSE 구독을 명시적으로 중지(`sseManager.stopSubscription()`)하는 로직을 추가했습니다.
- 데모 데이터 삭제(`demoRepository.deleteDemo()`) 로직을 로그아웃 프로세스에 포함시켰습니다.
- **SSE (Server-Sent Events) 수정**
- `SseManager`의 `CoroutineScope`에 `Dispatchers.IO`를 명시하여 I/O 작업을 위한 스레드에서 실행되도록 수정했습니다.
- `SharedFlow`의 `replay` 값을 `1`에서 `0`으로 변경하고 `extraBufferCapacity`를 `1`로 설정하여, 구독 시점에 캐시된 과거 이벤트가 재발행되는 것을 방지했습니다.
- **UI 및 사용자 경험(UX) 개선**
- 부모 회원가입 화면에서 특정 안드로이드 버전(SDK <= S_V2)의 스낵바 하단 패딩을 조정하여 UI 깨짐을 수정했습니다.
- 부모 일정 화면(`ParentScheduleScreen`)에서 부모 이름이 포맷팅 없이 원본(`parentName`) 그대로 표시되도록 수정했습니다.
- 부모 회원가입 초대 코드 유효 시간을 1분에서 10분으로 연장했습니다.
- 부모 미션 화면(`ParentMissionScreen`)의 `stickyHeader`에서 불필요한 `key` 파라미터를 제거했습니다.
- **회원가입 로직 수정**
- 부모 회원가입 중 '뒤로가기' 버튼 클릭 시, 이전 단계(자녀 추가)로 이동하거나, 선택 화면으로 이동하도록 로직을 수정했습니다.
- 회원가입 완료 후 시작하기 버튼을 눌렀을 때 호출되던 데모 관련 코드를 제거했습니다.
- 부모 알림(`ParentAlarmScreen`) 화면에 `Pull to Refresh` 기능을 추가하여 사용자가 아래로 당겨서 새로고침할 수 있도록 구현했습니다.
- 로그아웃 로직을 개선하여, SSE 구독을 먼저 중지하고 API 호출과 로컬 데이터(토큰) 삭제를 병렬 및 순차적으로 처리하도록 수정했습니다.
- 알림 카드(`ParentAlarmCard`) UI를 개선했습니다.
- 인증 사진의 비율과 스케일(`ContentScale.Crop`)을 조정하고 모서리를 둥글게 처리했습니다.
- 카드 내부 요소들의 간격을 조정하여 디자인을 개선했습니다.
- 반복 미션 추가 화면(`ParentAutoAddScreen`)의 레이아웃을 수정하여 키보드가 올라왔을 때 버튼이 가려지지 않도록 `imePadding` 적용 순서를 변경했습니다.
- 일부 불필요한 `import` 구문 및 `coroutineScope`를 제거했습니다.
- 자동 미션 보상 정보에 사용되는 코인 이미지를 올바른 리소스(`R.drawable.img_coin`)로 수정했습니다.
- 자녀 회원가입(`KidSignupViewModel`) 성공 시, 데모 데이터 생성을 위한 `postDemo` API를 호출하는 로직을 추가했습니다.
- API 호출 실패 시, 1초 간격으로 최대 3회 재시도를 하도록 구현했습니다.
- 미션 완료(`KidMissionViewModel`) 후, 코인 정보를 다시 불러오는 `fetchCoin()` 호출 로직을 추가하여 보유 코인 개수를 즉시 갱신하도록 수정했습니다.
- 소원 화면(`KidWishViewModel`)에서 코인 정보 로드 실패 시, 스낵바를 통해 에러 메시지를 표시하도록 예외 처리를 추가했습니다.
- 자녀 소원 화면(`KidWishScreen`)의 스낵바에 하단 패딩(60)을 추가하여 UI가 가려지지 않도록 수정했습니다.
- 일부 화면의 코인 이미지에 고정된 크기(20.dp)를 적용하고, 사용하지 않는 `forcePixelToDp` 코드를 제거했습니다.
- `DemoService`, `DemoDataSource`, `DemoDataSourceImpl`에서 `deleteDemo`와 `postDemo` 함수의 반환 타입을 `BaseResponse<Unit>`에서 `Response<Unit>`으로 수정했습니다.
- 카메라를 통해 촬영된 이미지를 S3에 업로드하는 로직을 수정했습니다.
- 기존 로직을 비활성화하고, `PresignedUrlRepository`를 사용하여 Presigned URL을 받아온 후 이미지를 업로드하고, 완료되면 서버에 이미지 URL을 전송하는 방식으로 변경했습니다.
- `postImage` 함수 호출 시 전달하는 `fileName`에서 `schedule/` 경로를 제거했습니다.
- 로그인 후 회원가입 화면으로 이동 시, 이전 화면 스택이 모두 제거되도록 `navOptions`을 수정했습니다.
- `KieroDialog` 컴포넌트를 개선했습니다.
- `isDisabled` 속성을 추가하여 확인 버튼 비활성화를 가능하게 했습니다.
- `title`이 `null`일 경우, 제목 텍스트가 렌더링되지 않도록 수정했습니다.
- `MainScreen`의 인터넷 연결 오류 다이얼로그(`KieroDialog`)에 `isDisabled` 속성을 적용했습니다.
- 스낵바의 하단 패딩을 동적으로 조절할 수 있도록 `bottomPadding` 상태를 추가하고, 스낵바 종류에 따라 패딩 값을 변경하도록 수정했습니다.
- 자녀 여정 화면의 미션 날짜 표시 방식을 개선하여, "내일까지"와 같은 상대적인 표현이 가능하도록 `createDateTitle` 유틸 함수를 수정했습니다.
- 부모 미션 목록 화면에서 날짜 정보 표시(`MissionInfo`) 컴포넌트를 제거했습니다.
- 자녀 카메라 화면(`KidCameraScreen`)에서 이미지 파일을 저장할 디렉토리가 없을 경우 생성하도록 로직을 보강하고, 파일 생성 실패 시 예외 처리를 추가했습니다.
- `AuthParentViewModel`에서 `navigateUp` 호출 시, `UiState`를 `Empty`로 초기화하도록 수정했습니다.
- 미션 보상 정보(`MissionAwardInfo`)에 사용된 코인 이미지를 `img_kid_coin`에서 `img_coin`으로 변경했습니다.
- 반복 미션 편집 화면(`ParentAutoMissionEditForm`)에서 미션 이름 수정 시, `TextFieldValue`를 사용하여 텍스트가 변경되어도 커서가 맨 뒤로 이동하도록 수정했습니다. - `ParentAutoInputField` 컴포넌트의 내부 상태 관리 로직을 제거하고, `TextFieldValue`를 직접 받아 처리하도록 리팩토링했습니다. - 반복 미션 추가 화면(`ParentAutoAddScreen`)에서 토스트 메시지를 스낵바로 표시하도록 수정했습니다.
- **스플래시 화면 로직 개선 (`SplashViewModel`)**
- 앱 시작 시 토큰 유효성을 먼저 검사하고, 유효할 경우에만 토큰 갱신을 시도하도록 로직을 변경했습니다.
- 부모와 자녀의 로그인 처리 로직을 각각 `handleParentLogin()`, `handleKidLogin()` 함수로 분리하여 코드 가독성을 높였습니다.
- 부모의 경우, 자녀 목록 조회 후 분기 처리하여 자녀가 없으면 부모 온보딩으로, 있으면 홈 화면으로 이동하도록 수정했습니다.
- **토큰 갱신 API 호출 방식 변경 (`TokenRefreshServiceImpl`)**
- 부모 토큰(`PARENT`) 갱신 시, `refreshToken`을 `Bearer` 토큰 방식에서 `refreshToken=$refreshToken` 형식의 쿼리 파라미터로 전달하도록 수정했습니다.
- **UI 및 사용자 경험(UX) 개선**
- 반복 미션 자동 추가 입력 필드(`ScrollableAutoInputField`)에서 텍스트 변경 시 커서 위치가 유지되지 않던 문제를 `TextFieldValue`를 사용하여 해결했습니다.
- 부모 일정 화면(`ParentScheduleScreen`)에서 불필요하게 표시되던 로딩 인디케이터(`KieroLoadingIndicator`)를 제거했습니다.
- **Coil 이미지 로더 설정 최적화**
- `KieroApplication`에서 Coil `ImageLoader`의 설정을 개선했습니다.
- 메모리 캐시(`MemoryCache`)와 디스크 캐시(`DiskCache`)를 추가하여 이미지 로딩 성능을 향상시켰습니다.
- 디버그 빌드 시 `DebugLogger`를 활성화하여 이미지 로딩 과정을 쉽게 추적할 수 있도록 했습니다.
- `respectCacheHeaders(false)`를 설정하여 캐시 헤더를 무시하고 일관된 캐싱 정책을 유지하도록 했습니다.
- **GIF 이미지 로딩 최적화**
- `KieroGifImage` 컴포저블에서 `ImageRequest`에 `precision(Precision.INEXACT)` 설정을 추가하여, GIF 이미지의 크기를 정확하게 맞추지 않고 더 효율적으로 로드하도록 수정했습니다.
- **네비게이션 로직 개선**
- `KieroNavHost`에서 화면 이동 시 스택을 초기화하는 `navOptions`를 `remember`로 캐싱하여, 컴포지션이 발생할 때마다 객체가 새로 생성되는 것을 방지했습니다.
- 불필요한 `Timber.e` 로그를 `Timber.d`로 변경하고, 일부 중복된 `navOptions` 선언 코드를 제거하여 코드를 간소화했습니다.
- 알림장 분석 API(`analyzeNotice`) 호출 후, 반환된 추천 미션(`suggestedMissions`) 목록이 비어있을 경우 "알림장 내용을 분석하지 못했어요."라는 토스트 메시지를 표시하도록 수정했습니다. - API 호출 실패 또는 타임아웃 발생 시에도 동일한 토스트 메시지를 표시하도록 예외 처리를 보강했습니다. - 에러 발생 시 로그를 남기도록 `Timber` 로깅을 추가했습니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



ISSUE
❗ WORK DESCRIPTION
📢 TO REVIEWERS
📸 SCREENSHOT