Q9-1
6시간 안에 무엇을 우선했고 무엇을 일부러 미뤘나요? README to-do에 적힌 두 항목("필수 데이터 없을 시 redirect 가드", "테스트 코드")의 미구현 근거가 궁금합니다.
핵심 포인트
- 우선한 것: **골격(편도/왕복 분기, 다시 선택 영속화, 인원·날짜 검증)**과 타입·컴포넌트 분해.
- 미룬 것: redirect 가드, 테스트 코드, isHttpError 활용, mutation onError 토스트.
- 우선 결정의 잣대: "합리적 가설"을 세워 골격이 흔들리지 않게 만든다(토스 가이드).
- 미룸의 형태: 회피가 아니라 README to-do로 명시 — 토스 가이드 "사용자 경험 개선 지점은 README 등에 문서화"와 직접 정렬.
모범 답안먼저 답해보고 펼치기
6시간이라는 제약이 평가의 일부라고 받아들였어요. 그래서 시간 분배 기준을 의식적으로 정하고 일했습니다.
우선순위 결정 기준은 토스 PDF의 "스스로 합리적인 가설을 세우고 계속 진행"이었어요. "이 과제에서 평가의 핵심이 무엇일까"를 세 가지로 가설을 세웠습니다 — (1) 시작점에 비워둔 인라인 코드를 어떻게 분해하느냐, (2) 라이브러리 선택과 그 의사결정 트레이스, (3) PDF에 명시된 미세 룰("기차표 제외 입력값 유지", "0인 인원 표시 제외" 등)을 빠뜨리지 않느냐. 이 셋을 우선순위 상위에 두고 시간을 썼습니다.
그래서 우선한 것들 — 컴포넌트 분해(SearchPage 인라인 185줄 → 43줄), 상태관리 의사결정(jotai + react-query 분리, atom 파일 두 개로 분리), 편도/왕복 분기(한 라우트 + 모드 전환, discriminated union), 검증 정책(BottomSheet 단·atom 단·derived atom 단의 책임 분리), 타입스크립트 도메인 모델링(types/ 5개 entity 분리). 골격이 흔들리지 않게 만드는 데 시간을 집중했어요.
미룬 것 — 새로고침 시 필수 데이터 없을 시 SearchPage redirect 가드, 테스트 코드, isHttpError + mutation onError 토스트. 이 셋은 골격이 안정된 뒤 위에 얹는 layer라고 봤어요. 골격을 어설프게 만든 채로 위 layer를 쌓으면 골격이 바뀔 때 위 layer를 다시 짜야 하니까요.
미룬 것을 README to-do로 명시한 게 의식적인 결정이었습니다. 토스 PDF의 "사용자 경험 개선 지점은 README 등에 문서화" 가이드라인과 정확히 정렬되는 부분이에요. 회피가 아니라 우선순위 결정의 결과로 미룬 것이고, 인터뷰에서도 그렇게 답할 준비가 됐습니다.
이 답변, 어땠나요?
꼬리 질문
-
Q9-1-a. 시간이 1~2시간 더 있었다면 무엇부터 했을까요? → 첫 번째 우선순위는 redirect 가드예요. CompletePage에서 이미 비슷한 패턴(
useEffect에서 reservation null이면 navigate)을 쓰고 있어서, 이걸 라우트 가드 컴포넌트로 일반화하는 데 30분~1시간이면 충분합니다. 두 번째는 mutation onError + isHttpError 분기. 사용자에게 에러를 알려주는 토스트가 들어가면 신뢰감이 크게 올라가요. 세 번째는 테스트 코드 — 검증 정책(isSearchValidAtom의 7분기,setDepartureDateAtom의 cross-atom side effect)부터 단위 테스트로 잡으면 atom 모델링의 회귀를 막을 수 있습니다. -
Q9-1-b. 테스트 코드가 빠진 게 가장 큰 약점 같은데, 이 자리에서 어떻게 보완하겠다고 답하실 건가요? → 솔직히 인정합니다. 6시간 안에 검증 정책·atom side effect·discriminated union 분기 같은 핵심 로직의 테스트를 짜지 못한 건 약점이에요. 다만 어디에 어떤 테스트를 넣을지는 분명한 방향이 있어요 — (1)
isSearchValidAtom7분기는 jotai의 store API로 테스트 가능, (2)setDepartureDateAtom의 cross-atom side effect도 같은 방식, (3)formatPassengerCount/formatDate/formatDuration같은 utils 순수 함수는 단위 테스트가 가장 가벼움, (4) UI 테스트는 react-testing-library로 SearchPage의 입력 → 검색 버튼 활성화 흐름 정도. 우선순위는 atom → utils → UI 순으로 갈 거예요. -
Q9-1-c. "익숙한 방법"이라는 PDF 가이드라인이 어떻게 의사결정에 영향을 줬나요? → 이걸 잣대로 자주 썼어요. 예를 들어 — query key factory 패턴 도입을 검토할 때, 4개 API에는 over-engineering이라 단순 상수 객체로 갔고; 변환 layer(DTO ↔ Domain) 도입도 4개 API 규모에서는 디버깅 비용만 키울 거라 안 뒀고;
EmptyResult외 공용 컴포넌트 추출도 미래 재사용 가설에 의존하지 않고 두 곳 이상 등장할 때만 미뤘어요. "고급 패턴은 정말 필요할 때 쓰는 도구지 미리 까는 인프라가 아니다"라는 입장을 토스 가이드라인이 정당화해줬다고 생각해요.
CS · 이론
- Time-boxed Development & 우선순위 결정: 6시간 같은 명시적 제약 안에서는 "무엇을 안 하느냐"의 결정이 "무엇을 하느냐"만큼 중요. 미루는 결정도 명시적으로 보여줘야 회피가 아닌 의식적 결정으로 인식됨.
- YAGNI (You Aren't Gonna Need It): extreme programming의 원칙. 미래에 필요할 수도 있는 것을 미리 만들지 말라. 6시간 제약에서 특히 강하게 적용.
- Documentation-Driven Reasoning: 못 한 일을 README에 명시함으로써 (1) 다음 작업자에게 컨텍스트 전달, (2) 의사결정 근거 보존, (3) 회피와 의도적 미룸의 구분. 토스 가이드라인이 이 원칙을 강조.