17. 연습 문제 🟢
이 장은 앞서 배운 디자인 패턴과 실무 기법들을 직접 코드로 구현해보는 종합 연습장입니다.
연습 1: 타입 안전한 상태 머신 ★★ (~30분)
목표: 타입 상태 패턴(Type-state pattern)을 사용해 신호등 상태 머신을 만드세요.
- 상태 순서는 반드시
빨강 → 초록 → 노랑 → 빨강이어야 합니다. - 정해진 순서 외의 전환은 컴파일 타임에 차단되어야 합니다.
연습 2: PhantomData를 이용한 단위 시스템 ★★ (~30분)
목표: PhantomData를 활용해 물리량 단위를 구분하는 시스템을 구축하세요.
Meters,Seconds,Kilograms타입을 정의하세요.- 같은 단위끼리의 덧셈을 지원하세요.
- 곱셈(
Meters * Meters = SquareMeters)과 나눗셈(Meters / Seconds = MetersPerSecond)을 구현하세요.
연습 3: 채널 기반 워크 풀(Worker Pool) ★★★ (~45 min)
목표: 채널을 이용해 작업을 분배하고 처리 결과를 취합하는 워커 풀을 만듭니다.
- 디스패처가
Job구조체를 채널A로 보냅니다. - N개의 워커가 채널A에서 작업을 가져와 처리한 뒤, 결과를 채널B로 보냅니다.
- 메인 함수에서 모든 결과가 올바르게 취합되었는지 확인합니다.
연습 4: 고계 함수 콤비네이터 파이프라인 ★★ (~25분)
목표: 데이터 전처리 과정을 체인으로 엮을 수 있는 Pipeline 구조체를 만듭니다.
.pipe(f)를 호출해 변환 과정을 추가합니다..execute(input)를 호출해 누적된 모든 변환을 순차적으로 실행합니다.
연습 5: thiserror를 활용한 에러 관리 ★★ (~30분)
목표: 라이브러리 개발 시 사용되는 에러 계층 구조를 설계합니다.
- I/O, JSON 파싱, 비즈니스 검증 실패를 모두 포함하는
AppError를 만드세요. #[from]을 이용해?연산자로 에러가 자동 변환되는지 확인하세요.
연습 6: 연관 타입을 활용한 리포지토리 패턴 ★★★ (~40분)
목표: 데이터 저장소 작업을 위한 Repository 트레이트를 설계합니다.
Item,Id,Error를 연관 타입으로 정의하세요.- 메모리 기반 저장소(
InMemoryRepo)를 구현하여 타입 안전성을 확인하세요.
연습 7: Unsafe를 이용한 고성능 고정 크기 벡터 ★★★ (~45분)
목표: 힙 할당 없이 스택에 데이터를 쌓는 FixedVec<T, N>을 만듭니다.
MaybeUninit을 사용하여 초기화되지 않은 메모리를 관리하세요.push,pop,as_slice를 구현하고, 모든unsafe블록에 상세한 안전성 주석을 다세요.
연습 8: 선언적 매크로 map! 제작 ★ (~15분)
목표: 표준 vec![] 매크로처럼 HashMap을 생성하는 map!{} 매크로를 만듭니다.
key => value쌍을 쉼표로 구분하여 입력받습니다.- 마지막 쉼표 허용 및 빈 매크로 호출을 지원해야 합니다.
연습 9: 커스텀 Serde 역직렬화기 구현 ★★★ (~45분)
목표: "30s", "1h" 같은 문자열을 std::time::Duration으로 바꾸는 필드를 포함한 설정을 파싱합니다.
HumanDuration타입을 만들고 커스텀 직렬화/역직렬화 로직을 작성하세요.
연습 10: 비동기 타임아웃 페처 ★★ (~25분)
목표: 여러 네트워크 요청을 비동기로 동시에 처리하고, 전체 작업에 타임아웃을 겁니다.
tokio::spawn으로 태스크를 던지고tokio::try_join!으로 취합하세요.tokio::time::timeout을 넘기면 에러를 반환해야 합니다.
연습 11: 비동기 채널 파이프라인 ★★★ (~40분)
목표: 생산자 → 변환기 → 소비자 구조의 비동기 파이프라인을 구축합니다.
tokio::sync::mpsc채널을 사용하세요.- 유한한 버퍼 크기(Bounded channel)를 설정하여 백프레셔(Back-pressure)가 어떻게 작동하는지 관찰하세요.