TIL. Aug 18, 2026

오늘 한 내용 Stack Day LocalDay 날짜 모델 도입 Clock과 FixedClock 추가 완료 기록·취소·보관·삭제 UseCase를 날짜 모델에 맞게 수정 InMemoryHabitRepository, InMemoryCompletionRepository 구현 및 테스트 추가 StackDay. Date로 하루를 표현하면 생기는 문제 배운 내용 LocalDay 도입하기 Stack Day에서는 Date 하나로 특정 시점과 특정 날짜를 모두 표현하고 있었다. 그래서 달력상의 날짜만 필요한 값을 LocalDay로 분리했다. LocalDay: startedOn, archivedOn, completedOn Date: createdAt, updatedAt, recordedAt 현재 시각은 Clock이 제공하고, 그 시각을 어느 날짜로 해석할지는 TimeZone이 결정하도록 분리했다. 전체 설계와 구현 코드는 개발일지에 정리했다. ...

August 18, 2026

TIL. Aug 17, 2026

오늘 한 내용 PS LeetCode 1563. Stone Game V WWDC Swift Concurrency. Explore Structured Concurrency in Swift (2) - WWDC21 마이그레이션 Algorithm. Kadane’s Algorithm 마이그레이션 미방문록. 대표 색상 추출 Picker 만들기 마이그레이션 배운 내용 Unstructured Task WWDC21 Explore Structured Concurrency in Swift 세션을 정리를 마무리했다. 1편과 다르게 구조화된 task tree에 속하지 않는 unstructured task와 detached task를 정리했다. Task { ... }로 만든 unstructured task는 생성한 scope가 끝나도 계속 실행될 수 있다. 생성 지점의 actor, priority, task-local value를 상속한다. ...

August 17, 2026

TIL. Aug 16, 2026

오늘 한 내용 PS Codeforces 1360D. Buying Shovels Stack Day CancelCompletionUseCase, ArchiveHabitUseCase, DeleteHabitUseCase 구현 완료 기록 삭제 테스트와 공통 테스트 Repository 정리 StackDay. 완료 기록을 취소할 때 무엇을 삭제해야 할까 배운 내용 in-memory Repository와 테스트 용도 Repository 프로덕션의 In-Memory Repository는 실제 저장 상태를 다루고, 테스트용 Repository는 호출과 오류를 관찰하는 Test Double이다. 같은 형태로 보이더라도 목적이 달라 분리했다. ID와 Business Key Completion.ID는 기록 자체를 식별하고, (habitID, completedOn)은 현재 정책에서 해당 날짜의 기록을 찾는 조건으로 분리했다. 없는 기록 취소를 성공으로 넘기지 않은 이유까지 개발일지에 정리했다.

August 16, 2026

TIL. Aug 15, 2026

오늘 한 내용 PS Codeforces 276C. Little Girl and Maximum Sum LeetCode 3702. Longest Subsequence With Non-Zero Bitwise XOR Swift Concurrency. Explore Structured Concurrency in Swift (1) - WWDC21 배운 내용 Structured Concurrency Explore Structured Concurrency in Swift WWDC 세션을 봤다. Meet async/await in Swift 세션도 마찬가지고, 이번 세션을 보면서 느낀 것은 Swift Concurrency의 중요한 컨셉은 비동기 코드를 일반적인 동기 코드와 비슷한 흐름으로 작성할 수 있게 하는 것이라고 생각했다. async/await가 에러 핸들링과 같은 부분을 비동기 코드도 동기 코드와 비슷하게 사용할 수 있게 해줬다면, Structured Concurrency는 조건문이나 루프같은 제어 흐름도 동기 코드와 비슷하게 사용하게 해준다. ...

August 15, 2026

TIL. Aug 14, 2026

오늘 한 내용 PS Codeforces 550A. Two Substrings LeetCode 3090. Maximum Length Substring With Two Occurrences Stack Day HabitRepository, CompletionRepository 인터페이스 추가 CreateHabitUseCase와 RecordCompletionUseCase 구현 StackDay. UseCase와 Entity는 각각 어디까지 책임져야 할까 StackDay. Repository의 save를 insert와 update로 나눈 이유 배운 내용 UseCase와 Entity의 책임 CreateHabitUseCase와 RecordCompletionUseCase를 구현하면서, Entity가 스스로 유효한 상태를 보장하고 UseCase는 객체를 조합해 작업 흐름을 만드는 쪽으로 책임을 나눴다. 이름 정규화와 유효성 검증은 Habit에, 저장 순서와 중복 확인은 UseCase에 뒀다. 자세한 고민은 개발일지에 정리했다. ...

August 14, 2026

TIL. Aug 13, 2026

오늘 한 내용 Data Structure. Segment Tree LeetCode 2213. Longest Substring of One Repeating Character StackDay. 책임 분리와 타입 분리 배운 내용 StackDay 통계 계산 HabitStatistics를 구현하면서 계산 결과를 표현하는 타입과 계산 로직을 분리했다. 다만 HabitStatisticsCalculator가 HabitStreakCalculator에 의존하게 되면서, 여러 Calculator가 같은 날짜 정규화와 완료 기록 필터링을 반복하는 문제가 보였다. 타입을 나누는 것만으로 항상 구조가 좋아지는 것은 아니고, 공유하는 계산 맥락까지 함께 살펴봐야 한다는 점을 배웠다. 자세한 고민은 StackDay 개발일지에 정리했다. ...

August 13, 2026

TIL. Aug 12, 2026

오늘 한 내용 LeetCode 2958. Length of Longest Subarray With at Most K Frequency LeetCode 2996. Smallest Missing Integer Greater Than Sequential Prefix Sum StackDay. 엔티티와 계산 책임 분리하기 배운 내용 파생 값을 구현할 때의 책임 분리 StackDay의 HabitEntry와 HabitStreak을 구현했다. 모델링 단계에서 정의한 파생 값을 실제 코드로 옮기면서, 값을 표현하는 타입과 값을 계산하는 로직을 분리했다. AI 에이전트가 작성한 내용중에 별로인 것들을 몇개 직접 수정했는데 리스트로 정리하면 다음과 같다. HabitEntry의 이니셜라이저 전체 Completion 목록을 직접 탐색하고, 생성 실패/성공을 판정했다. HabitStreak의 이니셜라이저 내부에 Streak 계산 로직이 들어있었다. 둘 다 경계가 제대로 구분되지 않았다. HabitEntry 내부에서 전체 Completion을 탐색하면서 조건에 맞는 Completion을 찾아내는건 비효율적이기도 하고, 이건 유즈케이스에서 해야 될 일이다. ...

August 12, 2026

TIL. Aug 10, 2026

오늘 한 내용 devbox-light-server Docker 이미지 작성 및 컨테이너 실행 .data 볼륨 연결과 healthcheck 추가 GitHub Actions에서 테스트 이후 이미지를 빌드하도록 구성 main 브랜치에 push하면 GHCR에 Docker 이미지를 자동으로 배포하도록 연결 PS LeetCode 1510 LeetCode 1140 배운 내용 Stone Game의 승패 DP LeetCode 1510 Stone Game 시리즈는 현재 플레이어가 이길 수 있는지를 상태로 두고 풀면 된다. Alice가 먼저 시작하는 것은 고정되어 있으므로, Alice와 Bob을 따로 나누기보다 현재 차례의 플레이어 기준으로 생각하는 편이 자연스럽다. ...

August 10, 2026

TIL. Aug 9, 2026

오늘 한 내용 dev-data-server-light DB, Auth Token, Storage에 JSON 기반 영속성 추가 JSON 파일 읽기·쓰기 로직 공통화 실행 환경에 따라 JSON과 in-memory 저장소를 선택하도록 구성 Stack Day Habit, Habit Entry, Completion의 역할을 나눠 데이터 모델링 배운 내용 저장 방식은 애플리케이션의 관심사가 아니다 dev-data-server-light를 처음 만들 때는 in-memory 저장소만 사용했다. 개발 중에는 빠르고 편하지만 서버를 재시작하면 유저, 토큰, 파일 데이터가 모두 사라진다. MVP를 마무리하려면 실제로 재시작해도 데이터가 남는 저장 방식이 필요했다. ...

August 9, 2026

TIL. Aug 8, 2026

오늘 한 내용 PS LeetCode 3302 Codeforces 1294C Stack Day의 컨셉과 MVP 범위 다시 정리 기존에 작성하던 Stack Day 코드를 정리하고, 다음 구현을 위한 기준 작성 배운 내용 LeetCode 3302와 CPU 스케줄링 문제를 보면서 예전에 풀었던 CPU 스케줄링 문제가 연상됐다. CPU 스케줄링은 현재 들어온 작업만 보고 결정하면 최적의 결과를 만들기 어렵고, 앞으로 어떤 작업이 들어올지까지 알아야 한다. LeetCode 3302도 현재 인덱스에서 문자를 고를 때 뒤에 어떤 문자들이 남아 있는지를 알아야 했다. 실제 배열은 한 번에 주어지므로 미래를 기다릴 필요는 없지만, 인덱스 포인터의 시점에서는 뒤쪽 정보를 미리 알고 있어야 한다. ...

August 8, 2026