← 홈으로 돌아가기

📝 Daily Learning Log (2026-07-20 ~ 07-26)

주간 학습일지 · 2026-07-20 ~ 07-26 · 진행 중(이번 주)

2026-07-20 (월) — 스크롤 렌더 심화

학습 주제 — 셀 높이(테이블 vs 컬렉션)·오프스크린·블렌딩 심화

오답노트

  • ❌ "오프스크린(GPU)은 CPU draw보다 항상 나음" → 메인 안 막는 장점은 있으나 여전히 비싼 추가 패스. 목표는 single-pass(shadowPath·미리 둥근 이미지)
  • ❌ "shouldRasterize는 항상 최적화" → 자주 바뀌면 매 프레임 재래스터화로 역효과
  • ❌ "블렌딩은 CPU 문제" → GPU 픽셀 연산량. 불투명화(isOpaque)로 감소

2026-07-20 (월) — 네트워크·아키텍처·스크롤 파이프라인 통합노트 정리

학습 주제 — 네트워크 레이어·견고한 파싱·토큰 리프레시·스크롤 dedup·테스트 아키텍처

오답노트

  • ❌ "동시 401은 각자 리프레시" → 리프레시 5번 중복→rotation이면 로그아웃 대참사. in-flight dedup으로 정확히 1회
  • ❌ "in-flight dedup은 다운로드 task만 캐시하면 됨" → 디코딩을 별도 task로 빼면 미디코딩/중복. 다운로드+디코딩 한 task
  • ❌ "배열 하나 깨지면 어쩔 수 없이 전체 실패" → Failable 래퍼(lossy)로 정상 항목만 살림 + 깨진 개수 로깅
  • ❌ "prefetch만 하면 됨" → 힌트라 안 불릴 수 있음. cellForItemAt에서도 반드시 로딩
  • ❌ "DIP는 그냥 프로토콜 쓰는 것" → 프로토콜을 상위(도메인)가 소유, 하위(데이터)가 구현 → 의존 화살표 안쪽으로 역전

2026-07-20 (월) — Instruments 성능 측정 기본

학습 주제 — Instruments 기본(다운샘플 메모리·피크 측정)

오답노트

  • ❌ "Growth로 피크 측정" → Growth(Generations)는 '남는 지속 증가분'(누수/abandoned)용. 순간 피크는 Allocations 그래프 최고점/Debug 게이지로. 재는 게 다름
  • ❌ "다운샘플 효과는 growth로 증명" → 풀디코딩 순간 스파이크(peak)를 안 만드는 게 핵심 → peak로 봐야 정확

2026-07-20 (월) — 웹뷰 Tier 2 ⑦

학습 주제 — 웹뷰 보안 (App-Bound Domains·origin 검증)

오답노트

  • ❌ "브리지는 프로세스 단위로 노출" → configuration(userContentController) 단위. 같은 config 웹뷰·모든 프레임이 접근
  • ❌ "제3자 iframe = 새로 열린 웹뷰" → 페이지 안에 박힌 서브 프레임(같은 웹뷰). 새 창은 createWebViewWith(§4)
  • ❌ "App-Bound Domains는 그냥 켜면 좋음" → 지정 도메인 외엔 강력 API 막힘. 브라우저형(임의 URL) 앱엔 부적합
  • ❌ "메시지 오면 바로 처리" → isMainFrame·origin·액션 화이트리스트·입력 검증 필수

2026-07-20 (월) — 통합노트 신규분(UIKit 렌더링·런루프·생명주기 + GCD)

학습 주제 — UIKit 렌더링 파이프라인·런루프·생명주기 + GCD 보강

오답노트

  • ❌ "GPU 합성이 이미지 디코딩도 대체" → 디코딩은 CPU 몫(GPU 샘플링엔 디코딩된 비트맵 필요). 도형·색만 대체 가능
  • ❌ "Core Graphics는 Core Animation 안에 있음" → 별개 형제 프레임워크(CG=래스터화, CA=합성/애니메이션)
  • ❌ "hitTest가 first responder를 찾음" → hit-test view를 찾음. first responder는 키보드/텍스트 포커스로 별개
  • ❌ "Timer는 항상 fire" → 스크롤 시 .tracking 모드로 .default 타이머 멈춤 → .common 모드 등록 필요
  • ❌ "barrier 큐가 actor만큼 안전" → actor는 컴파일 타임 데이터레이스 검사, barrier는 우회 접근 못 막음

2026-07-20 (월) — 실전 통합 ImageLoader 코딩

학습 주제 — 배운 것 전부를 한 파이프라인으로(캐시+다운샘플+dedup+취소)

오답노트

  • ❌ "다운로드 Task만 캐시하면 dedup 됨" → 디코딩 별도 Task면 미디코딩/중복. 다운로드+디코딩 한 Task 필수
  • ❌ "실패도 캐시" → 실패는 inFlight 제거해야 재시도 가능
  • ❌ "inFlight를 await 후 박아도 됨" → await 전(동기 구간)에 박아야 그 사이 들어온 호출이 공유(dedup 성립)

2026-07-20 (월) — 웹뷰 Tier 3 ⑩

학습 주제 — SwiftUI 통합 (UIViewRepresentable·Coordinator)

오답노트

  • ❌ "updateUIView에서 매번 load" → 리렌더마다 재로딩. 값 같으면 스킵
  • ❌ "Representable(struct)를 delegate로" → 재생성돼 부적합. Coordinator(class)가 안정적 소유자
  • ❌ "makeUIView가 매번 호출" → 딱 1번(@State처럼). 갱신은 updateUIView

2026-07-20 (월) — SwiftUI 레이아웃 시스템

학습 주제 — 부모 제안→자식 결정→부모 배치

오답노트

  • ❌ "부모가 자식 크기를 정한다" → 제안만. 최종 크기는 자식이 결정
  • ❌ ".frame은 크기 설정" → frame도 뷰. 자식에 제안하고 자기 크기를 부모에 보고(자식이 더 작을 수 있음)
  • ❌ "GeometryReader는 그냥 크기 읽기" → greedy라 제안 공간 다 차지해 레이아웃 흐트러뜨림

2026-07-20 (월) — TableView/CollectionView 노트(Diffable·간격)

학습 주제 — Diffable Data Source 심화 · FlowLayout 간격 구분

오답노트

  • ❌ "Diffable은 데이터 변화를 자동 감지" → apply는 내가 수동 호출, diff·애니메이션만 프레임워크
  • ❌ "Hashable에 title(내용) 넣어도 됨" → 내용 바뀌면 다른 아이템으로 착각·전체 리로드. 정체성=고유 ID만
  • ❌ "dataSource를 cellForItemAt에서 생성" → viewDidLoad에서 1번 생성·보관, 생성자 클로저가 cellForItemAt 대체
  • ❌ "lineSpacing=가로 간격" → 스크롤 방향에 따라 다름. 세로 스크롤이면 line=행 사이 세로, interitem=행 안 가로

2026-07-20 (월) — CollectionView 심화(reconfigure·CellRegistration·orthogonal)

학습 주제 — reload vs reconfigure · CellRegistration · orthogonal · 피드 설계

오답노트

  • ❌ "내용만 바꿀 때도 reloadItems" → 깜빡임·비쌈. iOS15+ reconfigureItems가 기존 셀 유지·저렴
  • ❌ "가로 스크롤 섹션은 중첩 컬렉션뷰" → orthogonalScrollingBehavior 한 줄로 해결(dataSource 공유)

2026-07-21 (화)

학습 주제 — CollectionView Self-Sizing Cell 전체 동작 흐름

오답노트

  • ❌ "cellForItem이 prepare보다 먼저" → Layout.prepare/attributes가 먼저, 그 위치의 보이는 셀만 cellForItem
  • ❌ "items 수만큼 cellForItem 호출" → 개수 파악은 numberOfItems, 실제 셀은 보이는 것만(1만개여도 10~15)
  • ❌ "preferredLayoutAttributesFitting은 Layout이 호출" → CollectionView 시스템이 호출
  • ❌ "invalidate하면 전체 재계산" → invalidationContext로 바뀐 셀 이후만