Skip to content

Conversation

@clxxrlove
Copy link
Member

@clxxrlove clxxrlove commented Nov 4, 2025

🔗 관련 이슈

📘 작업 유형

  • ✨ Feature (기능 추가)
  • 🐞 Bugfix (버그 수정)
  • 🔧 Refactor (코드 리팩토링)
  • ⚙️ Chore (환경 설정)
  • 📝 Docs (문서 작성 및 수정)
  • ✅ Test (기능 테스트)
  • 🎨 style (코드 스타일 수정)

📙 작업 내역

  • 감상평 기록 화면, 독서 기록 수정 화면, 체크박스 컴포넌트 수정
  • BKTextField 계열, BKTextView 계열에서 행간 등 폰트의 attribute가 제대로 지정되지 않던 부분 수정
  • UINavigationBar의 back button inset 통일 (BKNavigationBarStyle.standard)

🧪 테스트 내역

  • 브라우저/기기에서 동작 확인
  • 엣지 케이스 테스트 완료
  • 기존 기능 영향 없음

🎨 스크린샷 또는 시연 영상 (선택)

기능 미리보기 기능 미리보기
알림 설정 화면 독서 기록 수정 화면

Summary by CodeRabbit

  • 새로운 기능

    • 메모 페이지 네비게이션에서 마지막 페이지 도달 시 버튼 텍스트가 동적으로 변경됩니다.
    • 텍스트 필드 컴포넌트에 커스텀 폰트 스타일 지원이 추가되었습니다.
  • UI/UX 개선

    • 문장 감상 섹션의 안내 문구가 업데이트되었습니다.
    • 뒤로가기 버튼 정렬이 개선되었습니다.
    • 알림 설정 화면의 레이아웃 간격이 조정되었습니다.
  • 버전

    • 앱 버전이 1.2.0으로 업데이트되었습니다.
  • 잡무(Chores)

    • CI/빌드 설정에 키체인 및 보안 관련 구성이 추가되었습니다.
    • 자동화 워크플로우의 이슈 제목 포맷이 소폭 개선되었습니다.

@coderabbitai
Copy link

coderabbitai bot commented Nov 4, 2025

Walkthrough

여러 텍스트 입력 컴포넌트에 fontStyle 파라미터를 추가하고 초기화/스타일 적용 흐름을 조정했으며, 일부 UI 텍스트·레이아웃·네비게이션 이미지와 빌드/CI 설정 및 앱 버전을 업데이트했습니다. (50단어 이내)

Changes

Cohort / File(s) 변경 요약
텍스트 필드 컴포넌트 폰트 스타일 추가
src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift, src/Projects/BKDesign/Sources/Components/TextField/BKSearchTextField.swift, src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift, src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift
각 컴포넌트 초기화에 fontStyle: BKTextStyle 파라미터 추가(기본값 지정). 내부에 fontStyle 저장, textFont/placeholderFont를 옵셔널로 변경하고 해당 폰트로 typingAttributes·기본 텍스트·플레이스홀더 스타일을 적용하도록 로직 변경.
노트 뷰 UI 동적 버튼 타이틀
src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift
페이지 변화 시 마지막 페이지면 주요 버튼 타이틀을 "기록 완료"로, 그 외는 "다음"으로 동적으로 변경하는 로직 추가(기존 enablement 로직 유지).
감상 뷰 레이블 텍스트 업데이트
src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift
타이틀 텍스트를 "문장에 대한 감상을 남겨주세요"에서 "떠오르는 생각이 있다면 자유롭게 작성해 주세요."로 변경.
노트 편집 뷰 폰트 스타일 지정
src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift
pageField, sentenceTextView, appreciationTextView 초기화에 중간 바디 폰트 스타일 지정(스타일 전달).
알림 설정 뷰 간격 조정
src/Projects/BKPresentation/Sources/MainFlow/Setting/Notification/View/NotificationSettingsView.swift
권한 토글 컨테이너와 권한 요청 컨테이너 사이 수직 간격을 BKSpacing.spacing2BKSpacing.spacing4로 변경.
네비게이션 컨트롤러 백 버튼 이미지 조정
src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift
백 인디케이터 이미지에서 오프셋 변환 제거(imageWithOffset 삭제) 및 alignment rect의 왼쪽 inset을 -16-8로 조정.
워크플로우 Jira 제목 포맷 수정
.github/workflows/create-jira-issue.yml
Update issue title 포맷 변경: Jira 키를 대괄호로 감싸고 제목과 사이에 공백 추가(문자열 형식 수정).
CI 키체인 설정 추가
.github/workflows/ios_ci.yml
임시 키체인 생성 단계에 security list-keychainssecurity set-key-partition-list 명령 추가.
Fastlane: match 키체인 옵션 추가
src/fastlane/Fastfile
setup_signing lane의 match(...) 호출에 keychain_namekeychain_password 옵션(환경변수 사용) 추가.
버전 업데이트
src/SupportingFiles/Booket/Info.plist
CFBundleShortVersionString"1.1.3""1.2.0"으로 상향.

Sequence Diagram(s)

sequenceDiagram
    participant Caller as View / Initializer
    participant BKTFV as BKTextFieldView
    participant BKBase as BKBaseTextField

    Note over Caller,BKTFV: 새 초기화에서 fontStyle 전달
    Caller->>BKTFV: init(..., fontStyle)
    BKTFV->>BKTFV: store fontStyle\ncreate BKBaseTextField(fontStyle)
    BKTFV->>BKBase: init(..., fontStyle)
    BKBase->>BKBase: textFont = fontStyle.uiFont\nplaceholderFont = defaultStyle.uiFont\napplyTypingAttributes()
    BKBase-->>BKTFV: configured text field
    BKTFV-->>Caller: view ready
Loading

(다른 제어 흐름 변경은 경미하여 별도 다이어그램 생략)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

검토 포인트:

  • BKBaseTextField의 textFont/placeholderFont 옵셔널 처리와 언래핑 안전성 확인 (applyPlaceholderStyle, configure, 에러 로직).
  • applyTypingAttributes()가 입력 동작(특히 정렬/단락 스타일 및 타이핑 속성)에 미치는 영향 검증.
  • BKTextFieldView/BKSearchTextField 등에서 fontStyle 전달이 누락된 초기화 경로 여부 확인(스토리보드/다른 생성자 포함).
  • UINavigationController+ 변경으로 인한 백버튼 가시성/정렬 차이 확인.
  • CI/fastlane 키체인 옵션 추가와 워크플로우 변경이 빌드/배포 파이프라인에서 의도대로 동작하는지 확인.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Fastfile의 keychain 설정과 iOS CI 워크플로우 보안 명령 추가는 QA 수정사항과 직접 관련이 없으며 범위 밖입니다. Fastfile 및 iOS CI 워크플로우의 keychain 관련 변경사항을 별도 PR로 분리하거나, 이러한 변경사항이 BOOK-409 QA 수정과의 관계를 명확히 설명하세요.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 주요 변경사항인 여러 화면의 UI 오류 수정을 명확하게 요약하고 있습니다.
Linked Issues check ✅ Passed PR의 모든 코드 변경사항이 이슈 #246에서 명시된 목표를 충족합니다: 텍스트 필드/뷰의 폰트 스타일 수정, UINavigationBar 백 버튼 인셋 통일, UI 화면 개선이 완료되었습니다.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch BOOK-409-fix/#246

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a9d810f and 955175e.

📒 Files selected for processing (2)
  • .github/workflows/ios_ci.yml (1 hunks)
  • src/fastlane/Fastfile (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 157
File: src/Projects/BKPresentation/Sources/AuthFlow/View/LoginView.swift:43-45
Timestamp: 2025-08-08T01:39:15.620Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 접근성 개선 작업을 별도의 전용 PR이나 이슈에서 일괄 처리하는 것을 선호한다. 개별 기능 구현 PR에서는 접근성 관련 제안을 하지 않고, 접근성 전담 작업에서 한번에 처리하는 방식을 원한다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 157
File: src/Projects/BKPresentation/Sources/MainFlow/Home/View/HomeViewController.swift:19-24
Timestamp: 2025-08-08T01:38:59.656Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 접근성(accessibility) 관련 개선사항은 현재 작업 중인 PR에서 즉시 처리하지 않고, 접근성 전용 PR이나 이슈를 별도로 만들어 한번에 처리하는 것을 선호한다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 163
File: src/Projects/BKData/Sources/DTO/Request/UserBookRegisterRequestDTO.swift:7-9
Timestamp: 2025-08-08T16:13:31.712Z
Learning: Reed-iOS에서 서버 스펙 변경으로 DTO 필드명이 바뀔 때, doyeonk429는 코드 전반의 파라미터/시그니처 리네이밍까지 확장하지 않고, 실제 요청 직렬화 키가 맞는지(예: isbn13)만 보장하면 충분하다는 범위 최소화 방식을 선호한다. (PR: YAPP-Github/Reed-iOS#163, 파일: BKData/Sources/DTO/Request/UserBookRegisterRequestDTO.swift)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (3)
src/fastlane/Fastfile (1)

68-70: LGTM! CI 환경에서 임시 keychain 사용을 위한 올바른 설정입니다.

match() 함수에 keychain_namekeychain_password 파라미터를 추가하여 CI 환경에서 생성된 임시 keychain을 사용할 수 있도록 했습니다. 이는 .github/workflows/ios_ci.yml에서 생성하는 임시 keychain과 연동됩니다.

.github/workflows/ios_ci.yml (2)

78-79: LGTM! Keychain 접근 설정이 올바르게 구성되었습니다.

두 명령어가 CI 환경에서 코드 서명을 위한 표준 keychain 설정을 수행합니다:

  • Line 78: 임시 keychain을 keychain 검색 목록에 추가하고 기존 login keychain 접근도 유지
  • Line 79: Apple 개발 도구들이 비밀번호 프롬프트 없이 keychain에 접근할 수 있도록 partition list 설정

이 설정은 Fastfile의 setup_signing lane과 연동되어 작동합니다.


1-109: PR 범위 확인이 필요합니다.

이 PR의 목표는 "여러 화면에서의 UI 오류 수정"인데, 현재 리뷰를 위해 제공된 파일들은 CI/CD 인프라 설정 변경사항입니다.

  • 제공된 파일: Fastfile, ios_ci.yml (keychain 설정)
  • PR 목표: BKTextField/BKTextView 폰트 속성 수정, NavigationBar back button inset 통일, 체크박스 컴포넌트 수정

UI 관련 Swift 파일들이 리뷰에서 누락된 것인지, 아니면 CI/CD 변경사항을 별도 PR로 분리해야 하는지 확인이 필요합니다.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift (1)

353-362: imageWithOffset 메서드는 사용되지 않음 - 제거 권장

검증 결과, imageWithOffset 메서드(353-362행)는 코드베이스 어디에서도 호출되지 않습니다. 이 메서드만 호출하는 imageWithCustomRect도 더 이상 필요하지 않으므로 함께 제거하는 것을 권장합니다.

  • 라인 353-362: imageWithOffset 제거
  • 라인 342-350: imageWithCustomRect 제거 (사용되지 않음)
🧹 Nitpick comments (3)
src/SupportingFiles/Booket/Info.plist (1)

24-24: CFBundleVersion도 증가시키는 것을 권장합니다.

마케팅 버전(CFBundleShortVersionString)을 1.2.0으로 올린 것은 적절해 보입니다. 하지만 App Store에 제출할 때마다 CFBundleVersion(빌드 번호)도 함께 증가시켜야 합니다. 현재 "1"로 되어 있는데, 이전 빌드보다 큰 값으로 업데이트해주세요.

다음과 같이 수정하는 것을 권장합니다:

 <key>CFBundleVersion</key>
-<string>1</string>
+<string>2</string>

또는 빌드 자동화 시스템을 사용하는 경우 해당 시스템에서 자동으로 증가시키도록 설정되어 있는지 확인해주세요.

Also applies to: 38-39

.github/workflows/create-jira-issue.yml (2)

146-190: "Determine Issue Type" 단계의 반복적인 if-elif 체인은 유지보수성을 저하시킴.

라벨별로 이슈 타입과 템플릿을 매핑하는 로직이 11개의 라벨에 대해 반복되고 있습니다. 이는 코드 중복으로 보이며, 새로운 라벨 추가 시 체인에 계속 추가해야 합니다.

라벨-타입 매핑을 JSON 맵으로 정의하여 단순화할 것을 권장합니다:

      - name: Determine Issue Type
        id: type
        run: |
          LABELS_JSON=$(cat <<'JSON'
          ${{ toJson(github.event.issue.labels) }}
          JSON
          )

          label_names=$(echo "$LABELS_JSON" | jq -r '.[].name')
          
          # 라벨-템플릿 매핑 정의
          declare -A LABEL_MAP=(
            ["✨ feat"]="feature-task.yml"
            ["🐞 fix"]="fix-task.yml"
            ["🔨 refactor"]="refactor-task.yml"
            ["📃 docs"]="docs-task.yml"
            ["⚙️ chore"]="setting-task.yml"
            ["✅ test"]="test-task.yml"
            ["🎨 style"]="style-task.yml"
          )
          
          # 라벨 순회하며 첫 매칭 찾기
          for label in $label_names; do
            if [[ -n "${LABEL_MAP[$label]}" ]]; then
              echo "type=${label%% *}" >> $GITHUB_OUTPUT
              echo "template=${LABEL_MAP[$label]}" >> $GITHUB_OUTPUT
              break
            fi
          done
          
          # 기본값
          if ! grep -q "template=" $GITHUB_OUTPUT; then
            echo "type=other" >> $GITHUB_OUTPUT
            echo "template=default.yml" >> $GITHUB_OUTPUT
          fi

이 방식은 라벨 추가 시 매핑만 수정하면 되어 유지보수가 훨씬 용이합니다.


73-88: 브랜치 생성 로직이 두 작업에서 중복됨.

Job 1 (라인 73-88)과 Job 2 (라인 272-287)에서 동일한 브랜치 생성 로직이 반복되고 있습니다. git 설정, 원격 확인, 브랜치 생성/푸시 단계가 모두 동일합니다.

향후 워크플로우 유지보수성 개선을 위해, 이 공통 로직을 다음과 같이 조직화할 것을 권장합니다:

  1. 재사용 가능한 워크플로우로 추출 (.github/workflows/shared-create-branch.yml):

    name: Shared Create Branch
    on:
      workflow_call:
        inputs:
          branch_name:
            required: true
            type: string
  2. 양쪽 작업에서 호출 (uses: ./.github/workflows/shared-create-branch.yml):

    - name: Create branch using shared workflow
      uses: ./.github/workflows/shared-create-branch.yml@main
      with:
        branch_name: ${{ steps.branch.outputs.branch }}

이는 버그 수정 시 한 곳만 수정하면 되므로 안정성이 높아집니다.

Also applies to: 272-287

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1eef13b and a4d4173.

⛔ Files ignored due to path filters (18)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/checkbox-filled.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/checkbox-filled@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/checkbox-filled@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/checkbox-icononly_active-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/checkbox-icononly_active-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/checkbox-icononly_active-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/checkbox-icononly_active-round.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/checkbox-icononly_active-round@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/checkbox-icononly_active-round@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/checkbox-stroke-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/checkbox-stroke-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/checkbox-stroke-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round@3x.png is excluded by !**/*.png
📒 Files selected for processing (15)
  • .github/ISSUE_TEMPLATE/qa-task.yml (1 hunks)
  • .github/workflows/PR_Label_Assign.yml (1 hunks)
  • .github/workflows/close-jira-issue.yml (2 hunks)
  • .github/workflows/create-jira-issue.yml (4 hunks)
  • .github/workflows/create_release_branch.yaml (0 hunks)
  • src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift (3 hunks)
  • src/Projects/BKDesign/Sources/Components/TextField/BKSearchTextField.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift (2 hunks)
  • src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift (5 hunks)
  • src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/Setting/Notification/View/NotificationSettingsView.swift (1 hunks)
  • src/SupportingFiles/Booket/Info.plist (1 hunks)
💤 Files with no reviewable changes (1)
  • .github/workflows/create_release_branch.yaml
🧰 Additional context used
🧠 Learnings (5)
📓 Common learnings
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 157
File: src/Projects/BKPresentation/Sources/AuthFlow/View/LoginView.swift:43-45
Timestamp: 2025-08-08T01:39:15.620Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 접근성 개선 작업을 별도의 전용 PR이나 이슈에서 일괄 처리하는 것을 선호한다. 개별 기능 구현 PR에서는 접근성 관련 제안을 하지 않고, 접근성 전담 작업에서 한번에 처리하는 방식을 원한다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 157
File: src/Projects/BKPresentation/Sources/MainFlow/Home/View/HomeViewController.swift:19-24
Timestamp: 2025-08-08T01:38:59.656Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 접근성(accessibility) 관련 개선사항은 현재 작업 중인 PR에서 즉시 처리하지 않고, 접근성 전용 PR이나 이슈를 별도로 만들어 한번에 처리하는 것을 선호한다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 163
File: src/Projects/BKData/Sources/DTO/Request/UserBookRegisterRequestDTO.swift:7-9
Timestamp: 2025-08-08T16:13:31.712Z
Learning: Reed-iOS에서 서버 스펙 변경으로 DTO 필드명이 바뀔 때, doyeonk429는 코드 전반의 파라미터/시그니처 리네이밍까지 확장하지 않고, 실제 요청 직렬화 키가 맞는지(예: isbn13)만 보장하면 충분하다는 범위 최소화 방식을 선호한다. (PR: YAPP-Github/Reed-iOS#163, 파일: BKData/Sources/DTO/Request/UserBookRegisterRequestDTO.swift)
📚 Learning: 2025-08-20T04:50:43.364Z
Learnt from: clxxrlove
Repo: YAPP-Github/Reed-iOS PR: 181
File: src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift:183-186
Timestamp: 2025-08-20T04:50:43.364Z
Learning: In BKTextView (src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift), the border width is intentionally kept at LayoutConstants.borderWidth even when there's no error message, with only the color changed to clear. This maintains layout consistency by preserving the border space.

Applied to files:

  • src/Projects/BKPresentation/Sources/MainFlow/Setting/Notification/View/NotificationSettingsView.swift
  • src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift
  • src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift
  • src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift
  • src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift
  • src/Projects/BKDesign/Sources/Components/TextField/BKSearchTextField.swift
  • src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift
📚 Learning: 2025-07-28T10:45:09.696Z
Learnt from: clxxrlove
Repo: YAPP-Github/Reed-iOS PR: 112
File: src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift:128-140
Timestamp: 2025-07-28T10:45:09.696Z
Learning: clxxrlove는 NoteView의 nextButtonTapped 메서드에서 폼 검증 실패 시 첫 번째 페이지로 되돌아가는 로직을 임시로 구현했으며, 추후 적절한 에러 처리 로직을 추가할 예정이라고 명시했다. 임시 화면 구현 단계에서는 기본 동작에 집중하고 에러 처리는 후속 작업으로 계획하는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift
📚 Learning: 2025-08-12T01:44:56.649Z
Learnt from: clxxrlove
Repo: YAPP-Github/Reed-iOS PR: 169
File: src/Projects/BKPresentation/Sources/MainFlow/BookDetail/ViewModel/BookDetailViewModel.swift:153-164
Timestamp: 2025-08-12T01:44:56.649Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 복잡한 액션 구조 변경보다는 throttling과 같은 간단한 해결책을 선호한다. nextPage 중복 증가 버그 해결에 대해 Action에 page 정보를 추가하는 방법보다 ViewController 레벨의 throttling을 선호했다.

Applied to files:

  • src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift
📚 Learning: 2025-08-26T07:08:40.739Z
Learnt from: clxxrlove
Repo: YAPP-Github/Reed-iOS PR: 203
File: src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift:102-110
Timestamp: 2025-08-26T07:08:40.739Z
Learning: In the Reed-iOS codebase, BKTextView's startEditing functionality is automatically triggered through ViewModel reactive bindings (likely via Combine), so manual focus calls after appendText are not needed as the focus is handled by the viewmodel layer.

Applied to files:

  • src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift
  • src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift
  • src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift
  • src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift
  • src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift
🧬 Code graph analysis (2)
src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift (2)
src/Projects/BKDesign/Sources/Extensions/UIColor+.swift (1)
  • bkContentColor (52-63)
src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift (1)
  • applyTypingAttributes (157-168)
src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift (2)
src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift (1)
  • applyTypingAttributes (155-172)
src/Projects/BKDesign/Sources/Components/Label/BKLabel.swift (1)
  • setFontStyle (100-103)
🪛 actionlint (1.7.8)
.github/workflows/create-jira-issue.yml

16-16: "github.event.issue.title" is potentially untrusted. avoid using it directly in inline scripts. instead, pass it through an environment variable. see https://docs.github.com/en/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks for more details

(expression)


92-92: "github.event.issue.title" is potentially untrusted. avoid using it directly in inline scripts. instead, pass it through an environment variable. see https://docs.github.com/en/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks for more details

(expression)

🔇 Additional comments (24)
.github/ISSUE_TEMPLATE/qa-task.yml (1)

6-40: QA 템플릿 구조가 잘 설계되었습니다.

템플릿의 필드 구성과 유효성 검사 설정이 적절합니다. parentKey, description, tasks를 필수로 하고 links를 선택사항으로 둔 구조가 QA 작업 추적에 효과적입니다. 또한 명확한 한글 라벨과 적절한 placeholder를 제공하여 사용자 친화적입니다.

.github/workflows/PR_Label_Assign.yml (4)

15-15: GitHub Script 액션 버전 업그레이드가 적절합니다.

actions/github-script를 v6에서 v7로 업그레이드한 것은 최신 기능과 보안 패치를 반영하는 좋은 개선입니다.


42-54: 에러 핸들링 추가가 훌륭합니다.

라벨 추가 작업을 try/catch로 감싸고 실패 시 명확한 에러 메시지와 함께 워크플로우를 실패 처리하도록 한 것은 디버깅과 모니터링 측면에서 매우 좋은 개선입니다.


31-31: QA 라벨 매핑이 새로운 템플릿과 일관되게 추가되었습니다.

새로 추가된 qa: 패턴과 '🛠️ qa' 라벨이 .github/ISSUE_TEMPLATE/qa-task.yml에서 정의한 라벨과 일치하여 일관성 있는 라벨링 자동화가 가능합니다.


21-21: 로깅 추가로 관찰성이 향상되었습니다.

PR 제목 출력, 라벨 추가 성공/실패 메시지, 그리고 매칭되는 라벨이 없을 때의 팁 제공까지 추가한 로그들이 워크플로우 실행 추적과 디버깅에 유용합니다.

Also applies to: 40-40, 56-57

.github/workflows/close-jira-issue.yml (3)

19-45: 2단계 Jira 키 추출 로직이 명확하고 견고함.

대괄호 내 키를 우선 추출 후 일반 패턴으로 폴백하는 설계는 명확하고, heredoc을 통한 신뢰할 수 없는 입력 처리도 보안적으로 적절합니다. 초기 종료 조건도 잘 설정되어 있습니다.


89-107: 성공/실패 피드백이 명확하게 분리되어 있음.

라인 89-100에서 성공 시 GitHub 이슈에 댓글을 추가하고, 라인 102-107에서 실패 시 명시적인 로그를 남기는 방식은 워크플로우 상태를 명확하게 추적할 수 있게 합니다.


53-78: jq 필터의 견고성 검증 완료 — 엣지 케이스 처리가 올바르게 동작함

라인 68의 select 필터와 라인 77의 전환 목록 필터는 모두 견고하게 설계되어 있습니다. 검증 결과:

  • 빈 transitions 배열: 두 필터 모두 빈 출력을 반환하며 exit code 0 (정상)
  • "개발 완료" 매칭 없음: HAS_TRANSITION은 빈 문자열 반환 → [ -n "$HAS_TRANSITION" ] 조건이 false로 올바르게 평가
  • 유효한 매칭: transition ID를 정확히 추출

따라서 라인 77의 jq 필터는 항상 성공하며, continue-on-error: true는 API 응답 오류에 대한 적절한 방어 장치입니다.

.github/workflows/create-jira-issue.yml (3)

9-11: 2개 작업으로의 분리가 명확하고 선택적 흐름을 잘 구현함.

qa 라벨 존재 여부에 따라 기존 Jira 이슈 연결과 새 이슈 생성을 분리한 설계는 로직이 명확하고 각 경로의 책임이 분명합니다. 라벨 기반 조건부 게이팅 (if: contains(...), if: "!contains(...)")도 정확합니다.

Also applies to: 141-143


90-103: 제목 업데이트 로직에서 신뢰할 수 없는 입력값 처리 개선 필요.

라인 93의 "${{ github.event.issue.title }}"이 bash 문자열 비교에 직접 사용되고 있습니다. 비록 라인 17-24의 heredoc에서 이미 변수에 할당되었지만, 라인 93에서 직접 참조하면 주입 공격 가능성이 있습니다. 보안 모범 사례에 따라 환경변수를 통해 전달하세요.

환경변수로 보안을 강화하는 예시:

  - name: Check if title needs update
    id: check_title
    run: |
+     ISSUE_TITLE="${{ github.event.issue.title }}"
      JIRA_KEY="${{ steps.extract.outputs.jira_key }}"
      
-     if [[ "${{ github.event.issue.title }}" == *"$JIRA_KEY"* ]]; then
+     if [[ "$ISSUE_TITLE" == *"$JIRA_KEY"* ]]; then
        echo "skip=true" >> $GITHUB_OUTPUT
        echo "⚠️ Jira key already in title. Skipping update."
      else
        echo "skip=false" >> $GITHUB_OUTPUT
-       echo "new_title=[$JIRA_KEY] ${{ github.event.issue.title }}" >> $GITHUB_OUTPUT
+       echo "new_title=[$JIRA_KEY] $ISSUE_TITLE" >> $GITHUB_OUTPUT
        echo "✅ Will update title."
      fi

199-251: create-new-jira 작업의 Jira 이슈 생성 흐름이 정확함.

이슈 파서에서 추출한 정보를 markdown-to-jira 변환하여 Jira에 생성하는 흐름 (라인 204-246)이 명확하고, 부모-자식 관계 설정도 올바릅니다. 로깅 단계 (라인 210-213, 248-251)도 디버깅에 유용합니다.

src/Projects/BKPresentation/Sources/MainFlow/Setting/Notification/View/NotificationSettingsView.swift (1)

249-249: LGTM!

알림 권한 요청 영역과 토글 컨테이너 사이의 spacing을 확대하여 UI 일관성을 개선했습니다. toggleEmptySpacing과 동일한 값을 사용하는 것이 적절합니다.

src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift (1)

203-207: LGTM!

페이지 위치에 따라 버튼 타이틀을 동적으로 변경하여 사용자 경험을 개선했습니다. 마지막 페이지에서는 "기록 완료", 그 외에는 "다음"을 표시하는 것이 직관적입니다.

src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift (1)

33-49: LGTM!

세 개의 입력 컴포넌트에 fontStyle: .body2(weight: .medium)을 추가하여 폰트 속성(행간 등)이 일관되게 적용되도록 개선했습니다. PR 목표인 BKTextField/BKTextView 계열의 폰트 attribute 수정 사항이 잘 반영되었습니다.

src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift (1)

16-16: LGTM!

안내 텍스트를 더 친근하고 자유로운 표현으로 개선하여 사용자가 부담 없이 감상을 작성할 수 있도록 했습니다.

src/Projects/BKDesign/Sources/Components/TextField/BKSearchTextField.swift (1)

33-48: LGTM!

BKSearchTextField의 초기화에 fontStyle 파라미터를 추가하여 typography 일관성을 확보했습니다. 기본값을 제공하여 기존 코드와의 호환성을 유지하면서도 필요한 경우 커스터마이징이 가능합니다.

src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift (3)

66-76: LGTM!

BKTextViewfontStyle 지원을 추가하여 typography 일관성을 확보했습니다. fontStyletextView.fontplaceholderLabel에 모두 적용하여 시각적 일관성을 유지합니다.

Also applies to: 138-143


157-168: 핵심 수정사항: 행간 문제 해결

applyTypingAttributes() 메서드 추가가 이번 PR의 핵심 수정사항입니다. fontStyle.paragraphStyletypingAttributes에 적용함으로써 행간 등 폰트 attribute가 제대로 지정되지 않던 문제를 해결했습니다.


71-71: 컴포넌트 목적 차이 고려하여 재검토 필요

BKTextView는 새로 추가된 멀티라인 입력용 텍스트 뷰 컴포넌트이고, BKBaseTextField, BKSearchTextField, BKTextFieldView단일 라인 입력용 텍스트 필드 컴포넌트로 서로 다른 용도입니다.

다만 .body2(weight: .regular) vs .body2(weight: .medium) 차이가 의도된 디자인인지 아직 확인되지 않았으므로:

  • 디자인 시스템 가이드나 PM/디자인팀의 명시적 지시사항 확인
  • 필요시 일관성 있는 weight로 통일
src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift (4)

45-58: LGTM!

fontStyle 파라미터를 추가하고 이를 기반으로 textFontplaceholderFont를 초기화합니다. placeholder는 항상 .body2(weight: .regular)를 사용하여 본문 텍스트보다 가벼운 느낌을 주는 것이 좋은 디자인 결정입니다.


32-33: LGTM!

textFontplaceholderFont를 optional로 변경하여 타입 안전성을 개선했습니다. 이후 코드에서 guard 문으로 안전하게 처리하고 있습니다.


155-172: 핵심 수정사항: 행간 문제 해결

applyTypingAttributes() 메서드가 이번 PR의 핵심입니다. fontStyle.paragraphStyletypingAttributesdefaultTextAttributes에 적용하여 행간 등 폰트 attribute가 제대로 지정되지 않던 문제를 해결했습니다. BKTextView와 동일한 패턴을 사용하여 일관성을 유지합니다.


190-212: LGTM!

placeholder 스타일 적용 시 optional 폰트를 안전하게 처리하고, paragraphStyle을 적용하여 행간을 맞추며, baselineOffset을 계산하여 placeholder와 입력 텍스트의 수직 정렬을 개선했습니다.

src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift (1)

8-8: LGTM!

textField를 stored property로 변경하고 fontStyle 파라미터를 추가하여 초기화 시점에 내부 BKBaseTextFieldfontStyle을 전달합니다. 이를 통해 컴포넌트 계층 전체에서 typography 일관성이 유지됩니다.

Also applies to: 14-14, 47-64

.imageWithOffset(x: -4, y: 2) ?? BKImage.Icon.chevronLeft
.withAlignmentRectInsets(
UIEdgeInsets(top: 0, left: -16, bottom: 0, right: 0)
UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0)
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

백버튼 인셋 조정 확인

인셋 값이 -16에서 -8로 조정되고 imageWithOffset 변환이 제거되어 백버튼 위치가 더 표준에 가까워졌습니다. 이는 PR 목표인 백버튼 인셋 통일과 일치합니다.

다음 스크립트로 이 스타일을 사용하는 모든 화면에서 백버튼이 올바르게 렌더링되는지 확인하세요:


🏁 Script executed:

#!/bin/bash
# Description: BKNavigationBarStyle.standard를 사용하는 모든 ViewController 찾기

# standard 스타일을 사용하는 모든 파일 검색
rg -n -A5 -B2 'BKNavigationBarStyle\.standard' --type=swift

Length of output: 0


검색 결과가 없어 추가 검증이 필요합니다. 파일 내용과 변경 영향을 확인하겠습니다.


---

🏁 Script executed:

```shell
#!/bin/bash
# Description: 파일 존재 확인 및 271줄 주변 내용 확인

# 파일 존재 확인
if [ -f "src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift" ]; then
  echo "=== File found ==="
  echo "=== Lines 260-280 context ==="
  sed -n '260,280p' "src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift" | nl -v 260
else
  echo "File not found"
fi

Length of output: 89


🏁 Script executed:

#!/bin/bash
# Description: imageWithOffset 메서드 사용 여부 확인

echo "=== Searching for imageWithOffset usage ==="
rg -n 'imageWithOffset' --type=swift -C3

echo -e "\n=== Searching for back button related code ==="
rg -n 'backButton\|back_button\|UIBarButtonItem' --type=swift -C2 | head -50

Length of output: 941


🏁 Script executed:

#!/bin/bash
# Description: UINavigationController 확장에서 정의된 모든 메서드 확인

echo "=== Methods in UINavigationController extension ==="
ast-grep --pattern $'extension UINavigationController {
  $$$
}'

Length of output: 51


더 정확한 파일 내용 확인이 필요합니다.


---

🏁 Script executed:

```shell
#!/bin/bash
# Description: 271줄을 포함한 주변 코드 확인 및 imageWithOffset 호출 확인

echo "=== Lines 260-280 ==="
sed -n '260,280p' "src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift"

echo -e "\n=== Lines 350-365 (imageWithOffset method) ==="
sed -n '350,365p' "src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift"

echo -e "\n=== Searching for imageWithOffset() call (not just definition) ==="
rg 'imageWithOffset\(' --type=swift -n

Length of output: 1479


🏁 Script executed:

#!/bin/bash
# Description: 전체 파일에서 Back 버튼 관련 메서드 검색

echo "=== Searching for Back button setup methods ==="
rg -n 'setupBack|configureBack|backButtonImage|back.*Image' --type=swift -C2

echo -e "\n=== Checking file size and structure ==="
wc -l "src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift"

Length of output: 4455


Dead code 제거 필요: imageWithOffset 메서드는 사용되지 않습니다

Line 271의 인셋 조정은 configureBackButton 메서드에 올바르게 통합되어 있으며 line 129에서 호출되어 활성화됩니다. 변경된 -8 좌측 인셋 값이 모든 표준 네비게이션 바에 일관되게 적용되어 PR 목표(백버튼 인셋 통일)가 달성됩니다.

그러나 lines 353-361의 imageWithOffset 메서드는 파일 내 어디에서도 호출되지 않는 dead code입니다. 이 메서드를 제거하여 코드를 정리하세요.

// 제거 대상 (lines 353-361)
func imageWithOffset(x: CGFloat = 0, y: CGFloat = 0) -> UIImage? {
    let newRect = CGRect(
        x: x,
        y: y,
        width: size.width,
        height: size.height
    )
    
    return imageWithCustomRect(newRect, canvasSize: size)
}
🤖 Prompt for AI Agents
In
src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift
around lines 353 to 361, remove the unused dead method `imageWithOffset(x:y:)`
(the entire function block shown in the comment) and any stray helper calls or
unused imports tied only to it; keep existing `configureBackButton` and the
inset at line 271 as-is, and run a quick project-wide search to confirm no
remaining references to `imageWithOffset` before committing.

Copy link
Member

@doyeonk429 doyeonk429 left a comment

Choose a reason for hiding this comment

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

수고하셨습니다. CI 통과 되면 바로 Merge하셔도 될 것 같아요.

@clxxrlove clxxrlove merged commit de0cff9 into develop Nov 5, 2025
3 of 4 checks passed
@clxxrlove clxxrlove deleted the BOOK-409-fix/#246 branch November 5, 2025 02:14
@clxxrlove
Copy link
Member Author

@doyeonk429 다시 돌려보니까 되네요... 외부 영향인듯...

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.

[BOOK-409/qa] 여러 UI 오류 수정

3 participants