트러블 슈팅 및 리펙토링

Ios_Roy·2025년 8월 29일

트러블슈팅

목록 보기
1/3
post-thumbnail

1) readLine() 동기 처리 문제

  • 문제
    게임 루프에서 readLine()이 입력을 기다리는 동안 프로그램 전체가
    멈춰 있어,
    안내 문구 출력이나 다른 동작을 병렬로 처리할 수 없었습니다.

  • 원인
    Swift의 기본 readLine()은 동기 함수라 입력이 끝날 때까지
    스레드를 점유합니다.

  • 해결
    Task와 withCheckedContinuation을 활용해 readLine()을 비동기로
    감쌌습니다.
    이를 통해 입력 대기 중에도 비동기 로직을 활용할 수 있게
    개선했습니다.

    func readLineAsync() async -> String? {
        await withCheckedContinuation { continuation in
            DispatchQueue.global().async {
                continuation.resume(returning: readLine())
            }
        }
    }
  • 배운 점
    기존의 동기 API도 비동기 컨텍스트에 맞게 변환할 수 있으며,\
    이 과정에서 Swift Concurrency의 흐름(Task, await)을 더 잘 이해할
    수 있었습니다.


2) 파일 분리 리팩토링

  • 문제
    초기 코드에서는 정답 생성, 입력 처리, 판정 로직, 게임 루프가 모두
    BaseBallGame.swift에 섞여 있어서
    코드가 길어지고 수정 시 가독성이 떨어졌습니다.

  • 원인
    빠르게 동작하는 코드를 만들다 보니 관심사 분리를 고려하지
    못했습니다.

  • 해결
    역할별로 파일을 분리했습니다.

    • AnswerGenerator.swift → 정답 생성
    • GuessParser.swift → 입력 파싱
    • JudgeEngine.swift → 스트라이크/볼 판정\
    • RoundRunner.swift → 게임 루프
    • GameRecord.swift → 기록 저장
    • GameManager.swift → 게임 시작 매니저

    이렇게 나누니 각 부분의 책임이 명확해지고, 필요한 기능을 찾거나
    수정하기도 쉬워졌습니다.

  • 배운 점
    작은 콘솔 프로젝트라도 파일 분리와 구조화를 하면 가독성,
    유지보수성
    이 크게 좋아진다는 걸 느꼈습니다.

profile
iOS 개발자 공부하는 Roy

0개의 댓글