Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
209 commits
Select commit Hold shift + click to select a range
45c3abc
[BOOK-382] chore: metro 의존성 추가
easyhooon Nov 10, 2025
265ed6b
[BOOK-434] refactor: feature 모듈 metro migration
easyhooon Nov 10, 2025
457d2d9
[BOOK-434] refactor: repository 모듈 metro migration
easyhooon Nov 10, 2025
1f6c226
[BOOK-434] refactor: Hilt -> Metro WIP
easyhooon Nov 11, 2025
80231ec
[BOOK-434] refactor: @Inject -> @AssistedInject
easyhooon Nov 11, 2025
869e8db
[BOOK-434] refactor: DataGraph AppGraph 책임 분리
easyhooon Nov 11, 2025
d128622
[BOOK-434] refactor: @Provides -> @Binds
easyhooon Nov 11, 2025
5273273
[BOOK-434] feat: UnavailableContent 구성
easyhooon Nov 12, 2025
238d1ac
[BOOK-434] refactor: CircuitGraph AppGraph 에서 분리
easyhooon Nov 12, 2025
50da68a
[BOOK-434] chore: CrossFadeNavDecoratorFactory 주입 방식 원복
easyhooon Nov 12, 2025
e8af5fa
[BOOK-434] chore: annotation 순서 변경
easyhooon Nov 12, 2025
69a57b1
[BOOK-434] fix: build problem WIP
easyhooon Nov 13, 2025
7083ee8
[BOOK-434] fix: ApplicationContext 주입 방식 변경
easyhooon Nov 14, 2025
3704bdc
[BOOK-434] chore: metro version update
easyhooon Nov 18, 2025
8f2b542
[BOOK-434] chore: hilt 의존성 제거
easyhooon Nov 19, 2025
a579a3f
[BOOK-434] chore: metro plugin 직접 주입 방식으로 변경
easyhooon Nov 19, 2025
ea31299
[BOOK-434] chore: 라이브러리 버전 최신화
easyhooon Nov 19, 2025
61fe0a9
Merge branch 'develop' into BOOK-434-refactor/#222
easyhooon Nov 20, 2025
0970f3e
[BOOK-434] chore: metro version upgrade
easyhooon Nov 20, 2025
419ce1a
[BOOK-434] fix: Build Error
easyhooon Nov 20, 2025
f538d44
[BOOK-434] fix: Runtime Build
easyhooon Nov 20, 2025
e998355
[BOOK-434] chore: code style check success
easyhooon Nov 21, 2025
819c4b5
[BOOK-434] fix: stability.config.conf 파일 생성 및 루트 프로젝트 위치를 바라보도록 수정
easyhooon Nov 21, 2025
9b83728
[BOOK-434] chore: .stability 파일 최신화
easyhooon Nov 21, 2025
8bd0329
[BOOK-473] refactor: 람다 기반 modifier 적용
easyhooon Dec 3, 2025
c0c35a5
[BOOK-473] chore: code style check success
easyhooon Dec 3, 2025
76f8cdb
[BOOK-434] chore: 주석처리된 코드 제거
easyhooon Dec 3, 2025
67fd699
Merge pull request #227 from YAPP-Github/BOOK-434-refactor/#222
easyhooon Dec 3, 2025
dbbb6c4
Merge branch 'develop' into BOOK-473-refactor/#229
easyhooon Dec 3, 2025
7eb465a
[BOOK-473] chore: compose stability check success
easyhooon Dec 3, 2025
4bd9d8e
[BOOK-473] refactor: 누락된 background -> drawBehind { drawRect() } 전환
easyhooon Dec 3, 2025
7af2cca
Update troubleshooting links in README.md
easyhooon Dec 9, 2025
c272aef
Remove link on handling one-time events in Android
easyhooon Dec 9, 2025
5abda29
[BOOK-473] chore: 고정 컬러값 및 if else 컬러 분기처리 다시 background Modifier로 원복
easyhooon Dec 9, 2025
41f3684
[BOOK-473] chore: code style check success
easyhooon Dec 9, 2025
bd2af22
Update project dependencies in README
easyhooon Dec 9, 2025
020daf2
Update Kotlin version in README.md
easyhooon Dec 9, 2025
f428b99
[BOOK-473] refactor: 중복된 cornerShape 변수로 추출
easyhooon Dec 9, 2025
494a7db
[BOOK-474] feat: 구글 로그인 구현
easyhooon Dec 17, 2025
3fa8b2d
[BOOK-474] feat: 구글 로그인 버튼 border 적용 및 변경된 색상 반영
easyhooon Dec 17, 2025
79cdf06
[BOOK-474] chore: style check success
easyhooon Dec 17, 2025
f8a88c1
[BOOK-474] refactor: Login 모듈 패키지 구조 변경
easyhooon Dec 17, 2025
ca2b3f0
[BOOK-474] chore: 필요 없는 Companion 키워드 제거
easyhooon Dec 17, 2025
7e70487
Merge pull request #231 from YAPP-Github/easyhooon-patch-1
easyhooon Dec 18, 2025
194d574
Merge pull request #230 from YAPP-Github/BOOK-473-refactor/#229
easyhooon Dec 18, 2025
d4e3170
[BOOK-475] feat: LoginTooltipBox 구성
easyhooon Dec 18, 2025
7a45576
[BOOK-477] feat: QuoteStepV2 UI/UX 개편
seoyoon513 Dec 20, 2025
d554264
[BOOK-477] feat: EmotionStepV2 UI/UX 개편 WIP
seoyoon513 Dec 20, 2025
b0181ee
[BOOK-477] feat: ReedChip 컴포넌트 구현
seoyoon513 Dec 20, 2025
f44caf5
[BOOK-477] feat: EmotionDetailBottomSheet 구현
seoyoon513 Dec 20, 2025
1dfefd7
[BOOK-477] feat: Chip 컴포넌트 분리(Selectable/Removable)
seoyoon513 Dec 20, 2025
8d70b00
[BOOK-477] feat: 세부 감정 선택 및 제거 UI/UX 구현
seoyoon513 Dec 20, 2025
8077e47
[BOOK-477] feat: memoState 추가
seoyoon513 Dec 20, 2025
4cfab70
[BOOK-477] fix: EmotionStep에서 기록 완료 버튼 활성화 기준 committedEmotion으로 변경
seoyoon513 Dec 20, 2025
5887d7e
[BOOK-477] chore: code style check success
seoyoon513 Dec 20, 2025
562c97c
[BOOK-477] chore: 토끼 리뷰 반영
seoyoon513 Dec 20, 2025
1457e9b
[BOOK-477] chore: designsystem.stability 최신화
seoyoon513 Dec 20, 2025
9ddd667
[BOOK-478] feat: 온보딩 화면 그래픽 및 문구 수정
seoyoon513 Dec 20, 2025
b850457
[BOOK-477] feat: 감정선택 이미지 리소스 변경
seoyoon513 Dec 20, 2025
b8d3e44
[BOOK-477] chore: record.stability 최신화
seoyoon513 Dec 20, 2025
25c1f6b
Merge pull request #238 from YAPP-Github/BOOK-478-feature/#237
seoyoon513 Dec 21, 2025
c3ca075
[BOOK-479] feat: 책 검색 결과 없을 경우, 카카오톡 채널 안내 및 채팅 이동 구현
easyhooon Dec 24, 2025
48374b8
[BOOK-479] refactor: localProperty 조회 함수 공통화
easyhooon Dec 24, 2025
6116acf
[BOOK-479] chore: .stability 파일 최신화
easyhooon Dec 24, 2025
b065c0c
[BOOK-479] chore: 토끼 리뷰 반영
easyhooon Dec 24, 2025
55d9c59
[BOOK-475] feat: 최근 로그인 방식 관리를 위한 DataStore 환경 구축
easyhooon Dec 26, 2025
4fee138
[BOOK-475] feat: 로그인 버튼에 로그인 툴팁 배치
easyhooon Dec 26, 2025
50ebe6e
[BOOK-475] chore: code style check success
easyhooon Dec 26, 2025
810ad58
[BOOK-475] chore: compose stability check success
easyhooon Dec 29, 2025
afd2256
[BOOK-475] chore: code style check success
easyhooon Dec 29, 2025
de8b84c
Merge pull request #241 from YAPP-Github/BOOK-479-feature/#240
easyhooon Dec 31, 2025
fa5db3f
[BOOK-477] feat: 문장 기록 입력 시 스캔 버튼이 키보드에 가려지지 않도록 설정
seoyoon513 Dec 31, 2025
21c99a4
Merge pull request #236 from YAPP-Github/BOOK-477-feature/#235
seoyoon513 Dec 31, 2025
8159e56
[BOOK-482] feat: Reading-Records v2 스펙에 맞게 모델 스키마 변경
seoyoon513 Dec 31, 2025
f411f52
[BOOK-481] feat: 도서 상세 화면 UI 변경 사항 반영
easyhooon Jan 3, 2026
0ca1793
[BOOK-481] chore: 추가된 색상 변수 추가
easyhooon Jan 3, 2026
ecebaf4
[BOOK-481] feat: 도서 상세 화면 내가 모은 씨앗 컴포넌트 UI 변경 사항 반영
easyhooon Jan 3, 2026
dfa39e3
[BOOK-481] chore: 다크 모드 프리뷰 제거
easyhooon Jan 3, 2026
2760a1c
[BOOK-481] feat: 도서 상세화면에서 사용하는 API 버저닝 적용
easyhooon Jan 3, 2026
38bc93f
[BOOK-481] refactor: 씨앗 통계 Preview 개선
easyhooon Jan 3, 2026
f27801e
[BOOK-481] refactor: 씨앗 통계 API 버전 원복
easyhooon Jan 3, 2026
4609583
[BOOK-481] chore: code style, stability check success
easyhooon Jan 3, 2026
2bdccef
Merge remote-tracking branch 'origin/develop' into BOOK-481-feature/#242
easyhooon Jan 3, 2026
cc76510
[BOOK-481] chore: Emotion Item 기타 감정 임시 대응
easyhooon Jan 3, 2026
cbc36d7
[BOOK-481] chore: stability check success
easyhooon Jan 3, 2026
0654c04
[BOOK-481] refactor: record.stability unstable -> stable
easyhooon Jan 3, 2026
7a650da
[BOOK-481] refactor: detail.stability check stable
easyhooon Jan 3, 2026
5014318
[BOOK-481] chore: 토끼 리뷰 반영
easyhooon Jan 3, 2026
98d4841
[BOOK-482] feat: emotions API 구성 WIP
seoyoon513 Dec 31, 2025
f58c308
[BOOK-482] feat: V2 API 작업 WIP
seoyoon513 Jan 1, 2026
d51436d
[BOOK-482] feat: 미사용 V1 컴포넌트 삭제
seoyoon513 Jan 8, 2026
307916b
[BOOK-482] feat: emotions API 연동 및 미사용 state 정리
seoyoon513 Jan 8, 2026
124869f
[BOOK-482] feat: 감정 선택 플로우를 임시 로컬 데이터에서 서버 데이터 기반으로 전환
seoyoon513 Jan 8, 2026
0ecd802
[BOOK-482] feat: 기타 감정 선택지 추가
seoyoon513 Jan 8, 2026
243a754
[BOOK-482] feat: 기록 상세 화면 UI 변경사항 반영
seoyoon513 Jan 8, 2026
67c6a33
[BOOK-482] feat: 기록 수정 화면 WIP
seoyoon513 Jan 8, 2026
a0dfb9b
[BOOK-482] feat: 기록 수정 UI 및 API 변경사항 적용
seoyoon513 Jan 8, 2026
5e68b07
[BOOK-482] feat: 기록 카드 '기타' 리소스 추가 및 EmotionCode를 사용하도록 수정
seoyoon513 Jan 8, 2026
65b22b2
[BOOK-482] chore: 빌드 에러를 막기 위한 임시 코드 추가
seoyoon513 Jan 8, 2026
7e44f39
[BOOK-482] refactor: 버저닝에 따른 독서 기록 모델 분리 ReadingRecord, ReadingRecordV2
seoyoon513 Jan 8, 2026
e6e1b7f
[BOOK-482] chore: code style check success
seoyoon513 Jan 8, 2026
ffcebad
[BOOK-482] refactor: 미사용 감정 그래픽 리소스 삭제 및 네이밍 수정
seoyoon513 Jan 8, 2026
fc9ff9f
[BOOK-482] feat: 독서 기록 프로그래스바 3단계 -> 2단계로 축소
seoyoon513 Jan 9, 2026
6f3ff77
[BOOK-481] chore: apply stabilityDump
easyhooon Jan 9, 2026
8451e75
[BOOK-481] chore: ci 과정내에 stabilityDump 로직 추가
easyhooon Jan 9, 2026
c579c86
[BOOK-482] feat: 페이지 입력 optional 처리
seoyoon513 Jan 10, 2026
9d3e7be
[BOOK-482] fix: 리뷰 아이템 날짜 영역 UI 찌그러지는 문제 수정
seoyoon513 Jan 10, 2026
927604f
[BOOK-482] feat: 감정 선택 & 수정 화면 에러 핸들링 추가
seoyoon513 Jan 10, 2026
135ab71
[BOOK-481] chore: 라이브러리 버전 최신화
easyhooon Jan 12, 2026
c3b5561
[BOOK-482] fix: 기타 감정 선택 시 세부 감정 맵 초기화
seoyoon513 Jan 12, 2026
062c494
[BOOK-482] feat: 감정 수정 시 확인 다이얼로그 추가
seoyoon513 Jan 12, 2026
2a7068c
Merge pull request #245 from YAPP-Github/BOOK-481-feature/#242
easyhooon Jan 12, 2026
bc262ae
[BOOK-482] refactor: 감정 상태 Map -> PersistentMap으로 변경
seoyoon513 Jan 12, 2026
3389860
[BOOK-482] refactor: V2 suffix 제거
seoyoon513 Jan 12, 2026
fda02ec
[BOOK-482] chore: 감정 씨앗 리소스 변경
seoyoon513 Jan 12, 2026
ccfe6a7
[BOOK-482] feat: 기록 수정 화면 감상평 -> 메모 라벨 변경
seoyoon513 Jan 12, 2026
611ee4f
[BOOK-482] fix: 토끼 리뷰 반영
seoyoon513 Jan 12, 2026
f2f5532
Merge branch 'develop' into BOOK-482-feature/#244
seoyoon513 Jan 12, 2026
bad3fe2
[BOOK-482] fix: 빌드 오류 해결
seoyoon513 Jan 12, 2026
59b953c
[BOOK-482] fix: compose-bom 업그레이드 롤백
seoyoon513 Jan 13, 2026
5849c3d
[BOOK-482] refactor: Rename `committedEmotion` to `committedEmotionCode`
seoyoon513 Jan 13, 2026
0cd02b7
[BOOK-482] chore: compose stability 최신화
easyhooon Jan 14, 2026
76ce237
[BOOK-487] chore: targetSdk 35 -> 36 upgrade
easyhooon Jan 15, 2026
4b8264e
[BOOK-487] refactor: circuit 버전 업데이트 및 변경 사항 반영
easyhooon Jan 15, 2026
4f609c4
Merge pull request #246 from YAPP-Github/BOOK-482-feature/#244
seoyoon513 Jan 15, 2026
1dd8263
[BOOK-487] chore: 라이브러리 버전 최신화
easyhooon Jan 15, 2026
52dd7bd
Merge remote-tracking branch 'origin/develop' into BOOK-487-chore/#248
easyhooon Jan 15, 2026
f2aa710
[BOOK-490] feat: 도서 상세 API 변경 사항 반영 및 V2 suffix 제거
easyhooon Jan 15, 2026
d271be6
[BOOK-491] feat: 카메라 하단 영역 컴포넌트 추가
seoyoon513 Jan 15, 2026
96a7fbf
[BOOK-491] feat: 갤러리 이미지 연동 및 OCR 화면 구조 리팩토링
seoyoon513 Jan 15, 2026
7f95b18
[BOOK-491] feat: OCR 이미지 스캔 로딩 UI 추가
seoyoon513 Jan 15, 2026
cd38271
[BOOK-492] refactor: compose-shadow 라이브러리 제거 및 compose first party mo…
easyhooon Jan 16, 2026
d89ed4b
[BOOK-490] feat: 독서 기록 목록 조회 (V2) DTO 변경사항 반영
easyhooon Jan 16, 2026
a278f6a
[BOOK-490] refactor: EmotionModel, EmotionCode -> EmotionCode로 통일
easyhooon Jan 16, 2026
aece95c
[BOOK-490] refactor: Domain Model 클래스들 @Stable -> @Immutable 어노테이션 적용 변경
easyhooon Jan 16, 2026
793c642
[BOOK-490] chore: code style check success
easyhooon Jan 16, 2026
1f62d87
[BOOK-490] chore: 사용하지 않게된 registerResponse DTO 제거
easyhooon Jan 16, 2026
9779ef2
[BOOK-490] chore: run build success
easyhooon Jan 18, 2026
149d18e
[BOOK-490] chore: model 모듈 내 state 클래스들 별도 state 패키지로 이동
easyhooon Jan 18, 2026
db9e404
[BOOK-492] chore: 토끼 리뷰 반영
easyhooon Jan 19, 2026
b7c5a33
[BOOK-491] feat: 인식 실패 dialog추가 및 패키지명 변경 (view -> content)
seoyoon513 Jan 21, 2026
f304d2a
[BOOK-491] feat: 갤러리에서 선택한 이미지 OCR 인식 기능 추가
seoyoon513 Jan 21, 2026
ef0c300
[BOOK-491] feat: 텍스트 인식 실패 케이스 처리
seoyoon513 Jan 21, 2026
65b7f39
[BOOK-491] chore: code style check success
seoyoon513 Jan 21, 2026
56e75fd
Merge pull request #255 from YAPP-Github/BOOK-492-refactor/#254
easyhooon Jan 21, 2026
237de4a
[BOOK-491] feat: ReedDialog에 dismissOnClickOutside, dismissOnBackPres…
seoyoon513 Jan 21, 2026
f234163
Merge remote-tracking branch 'origin/develop' into BOOK-487-chore/#248
easyhooon Jan 21, 2026
c70b2e3
Merge pull request #252 from YAPP-Github/BOOK-487-chore/#248
easyhooon Jan 21, 2026
53a4508
[BOOK-491] refactor: Presenter 내에 하드코딩된 문자열 제거
easyhooon Jan 22, 2026
7af19b7
[BOOK-491] refactor: 원시 타입 State 최적화 적용 (boxing 오버헤드 제거)
easyhooon Jan 22, 2026
0575085
[BOOK-490] feat: 선택한 기록, 기록 수정 화면 전달시 도서 정보 fallback 처리 구현
easyhooon Jan 22, 2026
d889432
[BOOK-491] feat: 인식 실패 카운트 초기화 작업 추가
seoyoon513 Jan 22, 2026
c576319
Merge remote-tracking branch 'origin/BOOK-491-feature/#251' into BOOK…
seoyoon513 Jan 22, 2026
4f07099
Merge pull request #257 from YAPP-Github/BOOK-491-feature/#251
seoyoon513 Jan 23, 2026
c012c78
[BOOK-490] fix: representativeEmotion nullable로 변경
easyhooon Jan 24, 2026
c880642
Merge remote-tracking branch 'origin/develop' into BOOK-474-feature/#232
easyhooon Jan 26, 2026
ad7a380
[BOOK-474] chore: code style check success
easyhooon Jan 26, 2026
839e7d2
[BOOK-490] feat: 씨앗 통계 API endpoint v2로 업데이트
easyhooon Jan 27, 2026
16708c3
[BOOK-497] refactor: TokenAuthenticator 동시성 처리 개선 및 Provider -> Lazy 적용
easyhooon Jan 27, 2026
56ca841
[BOOK-474] chore: GOOGLE_WEB_CLIENT_ID 하나로 통일
easyhooon Jan 28, 2026
ec90171
Merge pull request #234 from YAPP-Github/BOOK-474-feature/#232
easyhooon Jan 30, 2026
f8057df
Merge pull request #253 from YAPP-Github/BOOK-490-feature/#250
easyhooon Jan 30, 2026
8d3c960
[BOOK-497] chore: update CLAUDE.md, CODING.md
easyhooon Jan 30, 2026
18354ac
Merge pull request #260 from YAPP-Github/BOOK-497-refactor/#259
easyhooon Jan 31, 2026
8e08856
Merge remote-tracking branch 'origin/develop' into BOOK-475-feature/#233
easyhooon Jan 31, 2026
461ba51
[BOOK-475] fix: merge 이후 빌드 문제 해결
easyhooon Jan 31, 2026
d68fe5a
[BOOK-475] feat: 구글 로그인 버튼 툴팁 추가
easyhooon Jan 31, 2026
b9823b0
[BOOK-475] feat: 로그인시 로그인 방식 분기 처리, 회원탈퇴시 로그인 방식 초기화
easyhooon Jan 31, 2026
376fe20
[BOOK-501] refactor: composed {} 를 이용한 Custom Modifier 구현 Modifier.No…
easyhooon Feb 3, 2026
ec8676f
[BOOK-501] refactor: 토끼 리뷰 반영
easyhooon Feb 3, 2026
17ed78e
[BOOK-494] chore: AGP version 9.0.0 upgrade
easyhooon Feb 3, 2026
6f20576
[BOOK-494] chore: AGP 9.0.0 변경 사항 대응
easyhooon Feb 3, 2026
8648d95
[BOOK-494] chore: 토끼 리뷰 반영
easyhooon Feb 4, 2026
ba73f80
Merge pull request #263 from YAPP-Github/BOOK-501-refactor/#262
easyhooon Feb 7, 2026
7248274
Merge pull request #264 from YAPP-Github/BOOK-494-chore/#258
easyhooon Feb 7, 2026
70e0774
Merge pull request #243 from YAPP-Github/BOOK-475-feature/#233
easyhooon Feb 7, 2026
57e8d5b
[BOOK-505] fix: release build success
easyhooon Feb 9, 2026
77b9f9b
[BOOK-505] chore: @param 어노테이션 추가
easyhooon Feb 9, 2026
4739102
[BOOK-505] chore: ConventionPlugin 내에 불필요한 개행 제거
easyhooon Feb 9, 2026
d24c3dc
[BOOK-505] chore: 토끼 리뷰 반영
easyhooon Feb 12, 2026
383c4f6
[BOOK-504] fix: 대표 감정 색상 감정 별로 변경되도록 수정
easyhooon Feb 12, 2026
ef95096
[BOOK-504] fix: 감정이 0개 인 경우, 감정 카드에서 제외
easyhooon Feb 12, 2026
629daa8
Merge pull request #267 from YAPP-Github/BOOK-505-fix/#266
easyhooon Feb 14, 2026
dfdadc2
[BOOK-504] feat: "기타"가 대표 감정일 경우 "여러 감정을 느꼈어요"로 표기되게 수정
easyhooon Feb 14, 2026
9445b51
[BOOK-504] refactor: remember를 통한 최적화 적용
easyhooon Feb 14, 2026
44fabb9
Merge pull request #269 from YAPP-Github/BOOK-504-fix/#268
easyhooon Feb 14, 2026
114485a
[BOOK-514] fix: 내 서재 화면 GuestMode 로그인 버튼 medium -> small 로 style 수정
easyhooon Feb 19, 2026
c79ebbe
[BOOK-514] fix: 감상평 기록 텍스트 컬러 contentSecondary -> contentPrimary
easyhooon Feb 19, 2026
e7a5506
[BOOK-518] fix: Blue300 Foundation Color 변경
easyhooon Feb 19, 2026
00dd582
[BOOK-513] fix: 로그인 툴팁 패딩, 텍스트 사이즈 수정
easyhooon Feb 19, 2026
1ff62c4
Merge pull request #278 from YAPP-Github/BOOK-513-fix/#271
easyhooon Feb 20, 2026
83cfdc8
Merge pull request #277 from YAPP-Github/BOOK-518-fix/#274
easyhooon Feb 20, 2026
a53e627
Merge pull request #276 from YAPP-Github/BOOK-517-fix/#273
easyhooon Feb 20, 2026
a536f75
Merge pull request #275 from YAPP-Github/BOOK-514-fix/#272
easyhooon Feb 20, 2026
32acd3c
[BOOK-510] chore: 온보딩 세 번째 이미지 리소스 교체
seoyoon513 Feb 20, 2026
7a862d8
[BOOK-510] fix: 온보딩 하이라이트 문구 설정
seoyoon513 Feb 20, 2026
1fcb1ad
[BOOK-510] fix: 온보딩 이미지 잘리는 문제 수정
seoyoon513 Feb 20, 2026
0167087
[BOOK-510] fix: 온보딩 버튼 문구 수정
seoyoon513 Feb 20, 2026
2a8c795
[BOOK-515] fix: 감정 수정 다이얼로그 노출 버그 수정
seoyoon513 Feb 20, 2026
baace35
[BOOK-290] chore: CI Gradle 빌드 캐시 적용
easyhooon Feb 25, 2026
f616688
[BOOK-510] chore: code style check success
seoyoon513 Feb 26, 2026
58ae726
[BOOK-515] fix: 감정 선택 변경 시 엣지 케이스 수정
seoyoon513 Feb 26, 2026
159104e
Merge pull request #282 from YAPP-Github/BOOK-510-fix/#279
seoyoon513 Feb 26, 2026
612e184
Merge pull request #283 from YAPP-Github/BOOK-515-fix/#280
seoyoon513 Feb 26, 2026
ceeba01
[BOOK-290] chore: 토끼 리뷰 반영
easyhooon Feb 26, 2026
6226536
Merge pull request #284 from YAPP-Github/BOOK-290-chore/#163
easyhooon Feb 26, 2026
a367d46
[BOOK-520] chore: 네트워크 디버깅을 위한 Chucker 라이브러리 연동
easyhooon Mar 9, 2026
43154fc
[BOOK-520] chore: app version update
easyhooon Mar 9, 2026
74a8ce9
Merge pull request #286 from YAPP-Github/BOOK-520-chore/#285
easyhooon Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Reed 프로젝트 작업 지침

## 빌드 관련

- **빌드는 사용자가 직접 수행합니다**
- 기능 작업 완료 후 빌드를 자동으로 실행하지 마세요 (시간이 오래 걸림)
- 빌드가 필요한 경우 사용자에게 알리고 사용자가 직접 실행하도록 합니다

## 커밋 관련

- **커밋 메시지에서 Claude 관련 문구를 제거합니다**
- 다음 문구들을 커밋 메시지에 포함하지 마세요:
- `🤖 Generated with [Claude Code](https://claude.com/claude-code)`
- `Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>`
- 커밋 작업은 사용자가 직접 수행하는 경우가 많으므로, 요청받지 않은 경우 커밋하지 마세요

## MCP 설정 관련

- **Claude Code CLI의 MCP 설정 파일 위치**
- Claude Desktop이 아니라 **Claude Code CLI**를 사용 중입니다
- MCP 설정은 `~/.claude.json`의 `projects` 섹션에서 프로젝트별로 관리됩니다
- Claude Desktop 설정 파일(`~/Library/Application Support/Claude/claude_desktop_config.json`)을 수정하지 마세요
- **Figma MCP 설정 경로**
- `~/.claude.json` → `projects` → `/Users/medi/AndroidStudioProjects/YeoBee-Android` → `mcpServers` → `figma`
25 changes: 25 additions & 0 deletions .claude/CODING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# 코딩 가이드

## 코드 작성 원칙

- 한글 주석 사용
- Kotlin 코딩 컨벤션 준수
- 기존 코드 스타일 유지
- 파일 끝에 빈 줄(newline) 추가

## Compose 관련

- **Composable 함수 내 Collection 타입**
- `List`, `Set`, `Map` 등의 Collection 대신 `ImmutableList`, `ImmutableSet`, `ImmutableMap` 사용
- `kotlinx.collections.immutable` 라이브러리 사용
- 예시:
```kotlin
// ❌ 사용하지 않음
@Composable
fun TripList(trips: List<Trip>) { ... }

// ✅ 사용
@Composable
fun TripList(trips: ImmutableList<Trip>) { ... }
```
- 변환 시 `toImmutableList()`, `persistentListOf()` 등 사용
23 changes: 18 additions & 5 deletions .github/workflows/android-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ env:

on:
pull_request:
push:
branches: [ main, develop ]

concurrency:
group: build-${{ github.ref }}
Expand All @@ -15,7 +17,7 @@ jobs:
ci-build:
runs-on: ubuntu-latest

if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-ci') }}
if: ${{ github.event_name == 'push' || !contains(github.event.pull_request.labels.*.name, 'skip-ci') }}

steps:
- name: Checkout
Expand All @@ -30,10 +32,14 @@ jobs:
- name: Setup Android SDK
uses: android-actions/setup-android@v2

# 캐시 저장/정리는 job 완료 후 post action 단계에서 수행
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
uses: gradle/actions/setup-gradle@v4
with:
gradle-home-cache-cleanup: true
# 빌드 성공 시 미사용 캐시 엔트리 자동 정리 (default: on-success)
# cache-cleanup: on-success
# PR에서는 캐시 읽기만 허용, push(develop/main)에서만 캐시 갱신하여 용량 절약
cache-read-only: ${{ github.event_name == 'pull_request' }}

- name: Generate local.properties
run: echo '${{ secrets.LOCAL_PROPERTIES }}' | base64 -d > ./local.properties
Expand Down Expand Up @@ -70,10 +76,14 @@ jobs:
- name: Setup Android SDK
uses: android-actions/setup-android@v2

# 캐시 저장/정리는 job 완료 후 post action 단계에서 수행
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
uses: gradle/actions/setup-gradle@v4
with:
gradle-home-cache-cleanup: true
# 빌드 성공 시 미사용 캐시 엔트리 자동 정리 (default: on-success)
# cache-cleanup: on-success
# PR에서는 캐시 읽기만 허용, push(develop/main)에서만 캐시 갱신하여 용량 절약
cache-read-only: ${{ github.event_name == 'pull_request' }}

- name: Generate local.properties
run: echo '${{ secrets.LOCAL_PROPERTIES }}' | base64 -d > ./local.properties
Expand All @@ -84,5 +94,8 @@ jobs:
- name: Generate google-services.json
run: echo '${{ secrets.GOOGLE_SERVICES }}' | base64 -d > ./app/google-services.json

- name: Compose Stability Dump
run: ./gradlew stabilityDump

- name: Compose Stability Check
run: ./gradlew stabilityCheck
24 changes: 14 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Reed - 문장과 감정을 함께 담는 독서 기록

[![Kotlin](https://img.shields.io/badge/Kotlin-2.2.0-blue.svg)](https://kotlinlang.org)
[![Kotlin](https://img.shields.io/badge/Kotlin-2.2.21-blue.svg)](https://kotlinlang.org)
[![Gradle](https://img.shields.io/badge/gradle-8.11.1-green.svg)](https://gradle.org/)
[![Android Studio](https://img.shields.io/badge/Android%20Studio-2025.1.2%20%28Narwhal%29-green)](https://developer.android.com/studio)
[![minSdkVersion](https://img.shields.io/badge/minSdkVersion-28-red)](https://developer.android.com/distribute/best-practices/develop/target-sdk)
Expand Down Expand Up @@ -37,15 +37,19 @@
| <img width="230" alt="기록 카드 공유" src="https://github.com/user-attachments/assets/4c01a5ed-e5a2-4be4-b950-96a457c87ad7" /> |

## TroubleShooting
- [[Compose] M3 ModalBottomSheet 드래그(터치 이벤트) 막는 법](https://velog.io/@mraz3068/Compose-M3-ModalBottomSheet-Drag-Disabled)
- [Metro 적용해보기](https://velog.io/@mraz3068/Metro-Apply)
- [Compose Stability Analyzer 사용 후기](https://velog.io/@mraz3068/compose-stability-analyzer-review)
- [[Android] Toast 내부 구현 확인 해보기](https://velog.io/@mraz3068/Android-Toast-Deep-Dive)
- [Coroutine CancellationException 따로 처리해야하는 케이스](https://velog.io/@mraz3068/Coroutine-CancellationException-UseCase)
- [Coroutine 에러 처리 패턴: 여러 API 호출을 한 번에 성공/실패 판정하기](https://velog.io/@syoon513/Coroutine-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC)
- [[Circuit] ImpressionEffect](https://velog.io/@mraz3068/Circuit-ImpressionEffect)
- [[Android] 일회성 이벤트를 StateFlow, Compose의 State로 처리할 때 주의해야할 점](https://velog.io/@mraz3068/Handle-One-Time-Event-As-State)
- [Jetpack Compose에서 CameraX + MLKit으로 OCR을 구현해보자](https://velog.io/@syoon513/Jetpack-Compose%EC%97%90%EC%84%9C-CameraX-MLKit%EC%9C%BC%EB%A1%9C-OCR%EC%9D%84-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EC%9E%90)
- [Circuit 찍먹해보기(부제: Circuit 희망편)](https://speakerdeck.com/easyhooon/circuit-jjigmeoghaebogi-buje-circuit-hyimangpyeon)
- [Circuit 찍먹해보기(부제: Circuit 절망편)](https://speakerdeck.com/easyhooon/circuit-jjigmeoghaebogi-buje-circuit-jeolmangpyeon)
- [Jetpack Compose에서 CameraX + MLKit으로 OCR을 구현해보자](https://velog.io/@syoon513/Jetpack-Compose%EC%97%90%EC%84%9C-CameraX-MLKit%EC%9C%BC%EB%A1%9C-OCR%EC%9D%84-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EC%9E%90)
- [[Android] 일회성 이벤트를 StateFlow, Compose의 State로 처리할 때 주의해야할 점](https://velog.io/@mraz3068/Handle-One-Time-Event-As-State)
- [Circuit Navigation 사용 시 feature 모듈간의 참조는 어떻게 해결했을까?](https://velog.io/@syoon513/Circuit-Navigation-%EC%82%AC%EC%9A%A9-%EC%8B%9C-feature-%EB%AA%A8%EB%93%88%EA%B0%84-%EC%88%9C%ED%99%98-%EC%B0%B8%EC%A1%B0%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%B4%EA%B2%B0%ED%96%88%EC%9D%84%EA%B9%8C)
- [Coroutine 에러 처리 패턴: 여러 API 호출을 한 번에 성공/실패 판정하기](https://velog.io/@syoon513/Coroutine-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC)
- [[Circuit] ImpressionEffect](https://velog.io/@mraz3068/Circuit-ImpressionEffect)
- [Coroutine CancellationException 따로 처리해야하는 케이스](https://velog.io/@mraz3068/Coroutine-CancellationException-UseCase)
- [[Compose] M3 ModalBottomSheet 드래그(터치 이벤트) 막는 법](https://velog.io/@mraz3068/Compose-M3-ModalBottomSheet-Drag-Disabled)


## Development

Expand All @@ -55,7 +59,7 @@
- JDK : Java 17을 실행할 수 있는 JDK
- (권장) Android Studio 설치 시 Embedded 된 JDK (Open JDK)
- Java 17을 사용하는 JDK (Open JDK, AdoptOpenJDK, GraalVM)
- Kotlin Language : 2.2.0
- Kotlin Language : 2.2.21

### Language

Expand All @@ -76,8 +80,8 @@
- Material3

- [Circuit](https://github.com/slackhq/circuit)
- ~~Google ML Kit~~ Google Cloud Vision
- Dagger Hilt
- ~~Google ML Kit~~ -> [Google Cloud Vision](https://cloud.google.com/vision)
- ~~Dagger Hilt~~ -> [Metro](https://github.com/ZacSweers/metro)
- Retrofit, OkHttp3
- Lottie-Compose
- Firebase(Analytics, Crashlytics, Remote Config)
Expand Down
23 changes: 11 additions & 12 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
@file:Suppress("INLINE_FROM_HIGHER_PLATFORM")

import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import com.google.devtools.ksp.gradle.KspExtension
import com.ninecraft.booket.convention.getLocalProperty
import org.gradle.kotlin.dsl.configure
import java.util.Properties

plugins {
alias(libs.plugins.booket.android.application)
alias(libs.plugins.booket.android.application.compose)
alias(libs.plugins.booket.android.hilt)
alias(libs.plugins.booket.android.firebase)
alias(libs.plugins.metro)
alias(libs.plugins.ksp)
}

android {
Expand Down Expand Up @@ -50,8 +51,9 @@ android {
}

defaultConfig {
buildConfigField("String", "KAKAO_NATIVE_APP_KEY", getApiKey("KAKAO_NATIVE_APP_KEY"))
manifestPlaceholders["KAKAO_NATIVE_APP_KEY"] = getApiKey("KAKAO_NATIVE_APP_KEY").trim('"')
buildConfigField("String", "GOOGLE_WEB_CLIENT_ID", getLocalProperty("GOOGLE_WEB_CLIENT_ID"))
buildConfigField("String", "KAKAO_NATIVE_APP_KEY", getLocalProperty("KAKAO_NATIVE_APP_KEY"))
manifestPlaceholders["KAKAO_NATIVE_APP_KEY"] = getLocalProperty("KAKAO_NATIVE_APP_KEY").trim('"')
}

buildFeatures {
Expand All @@ -63,8 +65,8 @@ composeStabilityAnalyzer {
enabled.set(true)
}

ksp {
arg("circuit.codegen.mode", "hilt")
extensions.configure<KspExtension> {
arg("circuit.codegen.mode", "metro")
}

dependencies {
Expand All @@ -75,6 +77,7 @@ dependencies {
projects.core.datastore.api,
projects.core.datastore.impl,
projects.core.designsystem,
projects.core.di,
projects.core.model,
projects.core.network,
projects.core.ui,
Expand Down Expand Up @@ -105,7 +108,3 @@ dependencies {
api(libs.circuit.codegen.annotation)
ksp(libs.circuit.codegen.ksp)
}

fun getApiKey(propertyKey: String): String {
return gradleLocalProperties(rootDir, providers).getProperty(propertyKey)
}
7 changes: 5 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

<application
android:name=".BooketApplication"
android:appComponentFactory="com.ninecraft.booket.di.MetroAppComponentFactory"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
Expand All @@ -21,7 +22,8 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Booket"
tools:targetApi="31">
tools:targetApi="31"
tools:replace="android:appComponentFactory">

<provider
android:name="androidx.startup.InitializationProvider"
Expand Down Expand Up @@ -83,7 +85,8 @@

<service
android:name=".ReedFirebaseMessagingService"
android:exported="false">
android:exported="false"
tools:ignore="Instantiatable">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
Expand Down
7 changes: 5 additions & 2 deletions app/src/main/kotlin/com/ninecraft/booket/BooketApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@ import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.disk.DiskCache
import coil.util.DebugLogger
import dagger.hilt.android.HiltAndroidApp
import com.ninecraft.booket.di.AppGraph
import dev.zacsweers.metro.createGraphFactory

@HiltAndroidApp
class BooketApplication : Application(), ImageLoaderFactory {

val appGraph by lazy { createGraphFactory<AppGraph.Factory>().create(this) }

override fun newImageLoader(): ImageLoader {
return ImageLoader.Builder(this)
.diskCache {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.ninecraft.booket
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import androidx.core.app.NotificationCompat
Expand All @@ -11,20 +12,24 @@ import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import com.ninecraft.booket.core.data.api.repository.UserRepository
import com.ninecraft.booket.core.designsystem.R
import com.ninecraft.booket.core.di.ServiceKey
import com.ninecraft.booket.feature.main.MainActivity
import dagger.hilt.android.AndroidEntryPoint
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesIntoMap
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.binding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import javax.inject.Inject

@AndroidEntryPoint
class ReedFirebaseMessagingService : FirebaseMessagingService() {

@Inject
lateinit var userRepository: UserRepository
@ContributesIntoMap(AppScope::class, binding = binding<Service>())
@ServiceKey(ReedFirebaseMessagingService::class)
@Inject
class ReedFirebaseMessagingService(
private val userRepository: UserRepository,
) : FirebaseMessagingService() {

private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())

Expand Down
31 changes: 31 additions & 0 deletions app/src/main/kotlin/com/ninecraft/booket/di/AppGraph.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.ninecraft.booket.di

import android.app.Activity
import android.app.Service
import android.content.Context
import com.ninecraft.booket.core.di.ApplicationContext
import com.ninecraft.booket.core.di.DataScope
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.DependencyGraph
import dev.zacsweers.metro.Multibinds
import dev.zacsweers.metro.Provider
import dev.zacsweers.metro.Provides
import kotlin.reflect.KClass

@DependencyGraph(
scope = AppScope::class,
additionalScopes = [DataScope::class],
)
interface AppGraph {

@Multibinds(allowEmpty = true)
val activityProviders: Map<KClass<out Activity>, Provider<Activity>>

@Multibinds(allowEmpty = true)
val serviceProviders: Map<KClass<out Service>, Provider<Service>>

@DependencyGraph.Factory
fun interface Factory {
fun create(@ApplicationContext @Provides context: Context): AppGraph
}
}
52 changes: 52 additions & 0 deletions app/src/main/kotlin/com/ninecraft/booket/di/CircuitGraph.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.ninecraft.booket.di

import androidx.compose.foundation.background
import androidx.compose.foundation.text.BasicText
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import com.slack.circuit.foundation.Circuit
import com.slack.circuit.foundation.LocalCircuit
import com.slack.circuit.runtime.Navigator
import com.slack.circuit.runtime.presenter.Presenter
import com.slack.circuit.runtime.ui.Ui
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.Multibinds
import dev.zacsweers.metro.Provides

@ContributesTo(AppScope::class)
interface CircuitGraph {

@Multibinds(allowEmpty = true)
fun presenterFactories(): Set<Presenter.Factory>

@Multibinds(allowEmpty = true)
fun uiFactories(): Set<Ui.Factory>

@Provides
fun provideCircuit(
presenterFactories: Set<Presenter.Factory>,
uiFactories: Set<Ui.Factory>,
): Circuit {
return Circuit.Builder()
.addPresenterFactories(presenterFactories)
.addUiFactories(uiFactories)
.setAnimatedNavDecoratorFactory(CrossFadeNavDecoratorFactory())
.setOnUnavailableContent { screen, modifier ->
val circuit = LocalCircuit.current
BasicText(
text = """
Route not available: ${screen.javaClass.name}.
Presenter: ${circuit?.presenter(screen, Navigator.NoOp)?.javaClass}
UI: ${circuit?.ui(screen)?.javaClass}
All presenterFactories: ${circuit?.newBuilder()?.presenterFactories}
All uiFactories: ${circuit?.newBuilder()?.uiFactories}
"""
.trimIndent(),
modifier = modifier.background(Color.Red),
style = TextStyle(color = Color.Yellow),
)
}
.build()
}
}
Loading
Loading