Conversation
angryPodo
left a comment
There was a problem hiding this comment.
고생했어요! 레퍼런스 없는 SDK 사용하느라 정말로 고생했습니다ㅎㅎ 고민거리 남겨놧으니 반영하고 리뷰 요청 다시 주세요!
core/ads/src/main/java/com/hilingual/core/ads/interstitial/HilingualInterstitialAd.kt
Outdated
Show resolved
Hide resolved
...aryfeedback/src/main/java/com/hilingual/presentation/diaryfeedback/DiaryFeedbackViewModel.kt
Show resolved
Hide resolved
.../diaryfeedback/src/main/java/com/hilingual/presentation/diaryfeedback/DiaryFeedbackScreen.kt
Outdated
Show resolved
Hide resolved
core/ads/src/main/java/com/hilingual/core/ads/interstitial/HilingualInterstitialAd.kt
Show resolved
Hide resolved
...aryfeedback/src/main/java/com/hilingual/presentation/diaryfeedback/DiaryFeedbackViewModel.kt
Outdated
Show resolved
Hide resolved
...aryfeedback/src/main/java/com/hilingual/presentation/diaryfeedback/DiaryFeedbackViewModel.kt
Show resolved
Hide resolved
...aryfeedback/src/main/java/com/hilingual/presentation/diaryfeedback/DiaryFeedbackViewModel.kt
Outdated
Show resolved
Hide resolved
...aryfeedback/src/main/java/com/hilingual/presentation/diaryfeedback/DiaryFeedbackViewModel.kt
Outdated
Show resolved
Hide resolved
nahy-512
left a comment
There was a problem hiding this comment.
작업 고생하셨습니다:)
isAdWatched 판단 기준이 궁금한데, 이 부분만 한번 확인해주시면 좋을 것 같습니다!
| } else { | ||
| viewModel.onAdWatched() | ||
| } |
There was a problem hiding this comment.
onAdWatched는 서버로 내가 Ad를 봤다고 보내는 로직으로 이해했는데요, 광고 시청을 완료했는지와 상관없이 호출해주는 걸까요??
There was a problem hiding this comment.
넵 광고 정상 시청과 실패 모두 동일하게 onAdDismissed를 호출하고 fetchAdWatched()로 넘어가도록 의도적으로 설계했습니다 ! fetchAdWatched() 내부에서 낙관적 업데이트 후 patchAdWatch() API를 호출하고 실패 시 onLogFailure에서 처리하는 구조로 모든 케이스를 일관되게 흘리는 방식입니다. 광고 실패가 사용자 책임이 아니기 때문에 실패했다고 피드백 화면 진입을 막는 건 잘못된 UX라고 판단했고 서버 동기화는 재시도 로직으로 보완할 예정입니다 !!
There was a problem hiding this comment.
고민이 되는 부분이었을텐데 광고 실패를 사용자의 책임으로 판단하지 않고 화면 진입을 할 수 있도록 처리한 설계가 좋은 것 같아요 🤩
Daljyeong
left a comment
There was a problem hiding this comment.
리뷰가 늦어서 미안합니다 🥲🙇🏻♀️
덕분에 광고 설계 구조를 더 익혀갈 수 있는 것 같아요! 작업 넘넘 고생하셨습니다 🚀
| private val diaryRepository: DiaryRepository, | ||
| private val diaryLocalRepository: DiaryLocalRepository, | ||
| private val textRecognitionRepository: TextRecognitionRepository, | ||
| adsPreloadManager: AdsPreloadManager, |
There was a problem hiding this comment.
여기엔 따로 private val이 안 붙은 이유가 궁금합니다 :)
There was a problem hiding this comment.
adsPreloadManager는 init 블록에서 preloadInterstitial 호출 후 더 이상 사용되지 않아서 private val로 프로퍼티화하지 않았습니다. 불필요한 참조를 ViewModel이 들고 있지 않도록 의도적으로 생략했습니다 !
| } else { | ||
| viewModel.onAdWatched() | ||
| } |
There was a problem hiding this comment.
고민이 되는 부분이었을텐데 광고 실패를 사용자의 책임으로 판단하지 않고 화면 진입을 할 수 있도록 처리한 설계가 좋은 것 같아요 🤩
| /*TODO: 서버 동기화 실패 처리 | ||
| patchAdWatch API 실패 시 서버는 여전히 isAdWatched = false 상태입니다. | ||
| WorkManager로 Sync 필요*/ |
There was a problem hiding this comment.
요거 너무 좋은데 포맷팅만 조금 고칩시다! 공백이라던가ㅎㅎ
angryPodo
left a comment
There was a problem hiding this comment.
너무 좋은데요! 머지합시다~~~ 완전 수고했어요! 이번 작업하면서 알게된거 아티클로 남기면 레퍼런스가 없어서 조회수 많이 나올수도..ㅋㅋ
Hyobeen-Park
left a comment
There was a problem hiding this comment.
저도 admob은 처음이라 신기하네요ㅎㅎ 수고하셨습니다~!
| showInterstitialAd( | ||
| activity = activity, | ||
| adUnitId = BuildConfig.ADMOB_INTERSTITIAL_UNIT_ID, | ||
| onAdDismissed = { viewModel.fetchAdWatched() }, |
There was a problem hiding this comment.
onAdDismissed = viewModel::fetchAdWatched
로 안하구 람다 생성해서 넘기신 이유가 무엇인가요?? 다른 의도나 추후 확장성을 고려하신건지 궁금합니다 🙂
There was a problem hiding this comment.
특별한 의도는 없었습니다! a437a07 말씀해주신 대로 viewModel::fetchAdWatched로 변경하겠습니다 !
…tial-ads # Conflicts: # core/ads/src/main/java/com/hilingual/core/ads/manager/AdsPreloadManager.kt # core/ads/src/main/java/com/hilingual/core/ads/manager/AdsPreloadManagerImpl.kt # presentation/diaryfeedback/src/main/java/com/hilingual/presentation/diaryfeedback/DiaryFeedbackScreen.kt
Related issue 🛠
Work Description ✏️
:core:ads — 전면광고 인프라 구축
AdsPreloadManager에preloadInterstitial()추가HilingualInterstitialAd.kt신규 생성 — 프리로드 캐시 hit 시 즉시 노출, miss 시 새로 로드 후 노출하는 폴백 로직 포함onAdFailed()로 피드백 화면이 반드시 노출되도록 방어 처리data 레이어 — 서버 연동 준비
DiaryContentModel,DiaryContentResponseDto에isAdWatched필드 추가/api/v1/diaries/{diaryId}/ad-watchAPI 전 레이어 연결 완료DiaryContentResponseDto.toModel()에서isAdWatched = false로 임시 고정DiaryFeedbackViewModel — 광고 상태 관리
isAdWatched == false이면ShowInterstitialAdSideEffect 발행onAdWatched()— 광고 정상 시청 시 patchAdWatch API 호출 후isAdWatched = true로 업데이트Screenshot 📸
Screen_Recording_20260315_184542.mp4
Uncompleted Tasks 😅
To Reviewers 📢
전면 광고 작업 완료했습니다! 광고 작업은 처음이라 더 좋은 방법 있다면 리뷰 남겨주세요! 그리고 프리로드는 피드백 Funnel의 진입점인
DiaryWriteViewModel.init에서 프리로드를 시작했습니다. 일기 작성 화면 진입 시점부터 백그라운드에서 광고를 미리 준비해두어 피드백 화면 진입 시 딜레이를 최소화하도록 해보았습니다!