Swift 리드·아키텍트 테스트 및 코드품질 기술면접

Swift 리드 · 아키텍트 (10년+) 테스트 · 코드품질 10문항 조회수 25 · 2026-08-31 (월) 07:42:45
1 테스트 전략
Hard

Q. 레거시 iOS 앱을 테스트 가능한 아키텍처로 전환하는 프로젝트를 리드하고 있습니다. 현재 코드베이스는 ViewController에 비즈니스 로직, 네트워크 호출, UI 업데이트가 모두 혼재되어 있어 테스트 커버리지가 10% 미만입니다. 조직의 개발 속도를 늦추지 않으면서 점진적으로 테스트 커버리지를 높이는 전략과 우선순위를 어떻게 설정하시겠습니까?

가장 비즈니스 임팩트가 크고 변경 빈도가 높은 영역부터 시작하며, 새로운 코드와 기존 코드에 다른 기준을 적용하는 방법을 고려해보세요.

A. 모범답안

먼저 Strangler Fig 패턴을 적용해 새로운 기능은 처음부터 테스트 가능한 아키텍처(MVVM, Clean Architecture 등)로 작성하고 최소 70% 커버리지를 의무화합니다. 기존 코드는 비즈니스 크리티컬한 영역(결제, 인증 등)과 버그 발생 빈도가 높은 부분을 우선 식별하여 Characterization Test를 작성한 후 리팩토링합니다. ViewController에서 비즈니스 로직을 추출할 때는 Protocol을 활용한 Dependency Injection을 도입해 Mock 객체로 테스트 가능하게 만듭니다. 팀에는 테스트 작성 가이드라인과 예제를 제공하고, 코드 리뷰에서 테스트 품질을 필수 체크 항목으로 추가합니다. 3개월 단위로 커버리지 목표(30% → 50% → 70%)를 설정하고 메트릭을 추적하며, CI에서 커버리지 하한선을 점진적으로 상향 조정합니다.

핵심 포인트
  • • 새 코드와 레거시 코드에 다른 전략 적용 (Strangler Fig 패턴)
  • • 비즈니스 크리티컬 영역 우선순위화 및 Characterization Test
  • • Protocol 기반 DI로 테스트 가능성 확보
  • • 점진적 목표 설정과 CI/CD 파이프라인 통합
답변에 넣으면 좋은 키워드
Strangler Fig Characterization Test Dependency Injection 테스트 커버리지 리팩토링 CI/CD
실무에서는

레거시 앱의 현대화 프로젝트에서 기술 부채를 줄이면서 비즈니스 연속성을 유지해야 할 때 사용됩니다.

Follow-up 질문

테스트 커버리지 목표를 달성하는 과정에서 개발 속도가 일시적으로 느려질 경우, 경영진과 제품 팀을 어떻게 설득하시겠습니까?

2 TDD 실천
Hard

Q. Swift에서 비동기 네트워크 호출과 Combine 스트림을 포함하는 복잡한 비즈니스 로직을 TDD로 개발할 때, 테스트의 실행 속도와 안정성을 모두 확보하기 위한 전략은 무엇입니까? 특히 실제 네트워크 의존성과 타이밍 이슈를 어떻게 처리하시겠습니까?

테스트 더블의 종류와 비동기 코드 테스트를 위한 Swift의 최신 기능들을 고려해보세요.

A. 모범답안

먼저 네트워크 레이어를 Protocol로 추상화하고 Mock 구현체를 제공해 실제 네트워크 호출을 제거합니다. Combine 스트림 테스트는 expectation이나 Swift Concurrency의 async/await 기반 테스트를 활용하되, 타임아웃을 짧게 설정해 빠른 피드백을 얻습니다. 복잡한 Publisher 체인은 작은 단위로 분리하여 각각 독립적으로 테스트하고, 통합 테스트에서는 End-to-End 시나리오를 검증합니다. 시간 의존적인 로직(debounce, delay 등)은 Scheduler를 주입 가능하게 만들어 TestScheduler를 사용해 가상 시간으로 테스트합니다. 테스트 실행 순서에 의존하지 않도록 각 테스트의 setUp/tearDown에서 상태를 완전히 초기화하며, 불안정한 테스트(flaky test)는 즉시 수정하거나 격리합니다.

핵심 포인트
  • • Protocol 기반 네트워크 레이어 추상화와 Mock 사용
  • • Combine Scheduler 주입으로 시간 의존성 제거
  • • 단위 테스트와 통합 테스트의 명확한 분리
  • • Flaky test 제로 정책과 테스트 격리
답변에 넣으면 좋은 키워드
Protocol Mock Combine TestScheduler async/await 테스트 격리
실무에서는

복잡한 리액티브 비즈니스 로직을 안정적으로 개발하고 회귀 버그를 방지해야 하는 상황에서 필수적입니다.

Follow-up 질문

TDD를 처음 도입하는 팀에서 개발자들이 테스트 작성을 부담스러워할 때, 어떤 방식으로 점진적으로 도입하시겠습니까?

3 코드 리뷰 문화
Medium

Q. 20명 규모의 iOS 팀에서 코드 리뷰가 형식적으로 진행되어 실질적인 품질 개선 효과가 없습니다. 리뷰어들은 대부분 'LGTM'만 남기고, 중요한 아키텍처 이슈나 잠재적 버그는 놓치고 있습니다. 효과적인 코드 리뷰 문화를 정착시키기 위한 구체적인 가이드라인과 프로세스를 어떻게 설계하시겠습니까?

리뷰의 목적을 명확히 하고, 체크리스트와 자동화를 적절히 조합하며, 심리적 안전성을 고려해보세요.

A. 모범답안

먼저 코드 리뷰의 목적을 명문화합니다(버그 발견, 지식 공유, 아키텍처 일관성 유지 등). 레벨별 체크리스트를 제공하여 자동화 가능한 항목(포매팅, lint)은 CI에서 처리하고, 리뷰어는 비즈니스 로직, 에러 핸들링, 테스트 품질, 성능 등 고차원 이슈에 집중하게 합니다. PR 크기를 400줄 이하로 제한하고, 큰 기능은 여러 PR로 분할하여 리뷰 품질을 높입니다. 건설적 피드백 문화를 위해 '질문형 코멘트'를 권장하고, 좋은 코드에 대한 칭찬도 포함시킵니다. 주니어 개발자의 PR은 시니어가 반드시 리뷰하고, 중요한 아키텍처 변경은 2명 이상의 승인을 필수화합니다. 월 1회 '좋은 리뷰 사례'를 공유하는 세션을 운영하여 학습 효과를 극대화합니다.

핵심 포인트
  • • 자동화와 인간 리뷰의 역할 분리
  • • PR 크기 제한과 레벨별 체크리스트 제공
  • • 건설적 피드백 문화와 심리적 안전성
  • • 중요 변경사항에 대한 다중 승인 정책
답변에 넣으면 좋은 키워드
코드 리뷰 PR 크기 체크리스트 건설적 피드백 자동화 지식 공유
실무에서는

팀 규모가 커지면서 코드 품질 편차가 발생하고 기술 부채가 누적될 때 체계적인 리뷰 프로세스가 필요합니다.

Follow-up 질문

시니어 개발자가 작성한 코드에 주니어가 리뷰 코멘트를 달기 어려워하는 문화적 장벽을 어떻게 해소하시겠습니까?

4 리팩토링 전략
Hard

Q. 프로덕션에서 안정적으로 동작하는 5000줄짜리 핵심 비즈니스 로직 클래스가 있습니다. 테스트 코드는 전무하고, 여러 책임이 혼재되어 있으며, 새로운 요구사항 추가가 점점 어려워지고 있습니다. 비즈니스 리스크를 최소화하면서 이 클래스를 안전하게 리팩토링하는 단계별 접근법을 설명해주세요.

리팩토링 전 안전망을 구축하고, 동작 변경 없이 구조만 개선하는 원칙을 지켜야 합니다.

A. 모범답안

첫 단계로 현재 동작을 보존하는 Characterization Test를 작성합니다. 주요 입력값과 엣지 케이스에 대해 현재 출력을 기록하여 Golden Master Test Suite를 구성합니다. 두 번째로 클래스의 public interface는 유지하면서 내부 메서드를 작은 private 메서드로 추출하고, 각 메서드가 단일 책임을 갖도록 분리합니다. 세 번째로 식별된 책임별로 새로운 클래스를 생성하고, 기존 클래스는 이들을 조합하는 Facade 역할로 전환합니다. 네 번째로 새로 분리된 각 클래스에 대해 단위 테스트를 작성하고, 기존 Characterization Test가 여전히 통과하는지 확인합니다. 각 단계마다 작은 커밋으로 나누어 진행하며, 문제 발생 시 즉시 롤백 가능하도록 합니다. 마지막으로 Feature Flag를 활용해 일부 사용자에게만 리팩토링된 코드를 적용하고 점진적으로 확대합니다.

핵심 포인트
  • • Characterization Test로 안전망 구축
  • • Extract Method와 단일 책임 원칙 적용
  • • Facade 패턴으로 점진적 분리
  • • Feature Flag를 통한 점진적 롤아웃
답변에 넣으면 좋은 키워드
Characterization Test Extract Method 단일 책임 원칙 Facade 패턴 Feature Flag Golden Master
실무에서는

레거시 시스템의 핵심 로직을 유지보수 가능하게 만들면서 서비스 중단 없이 개선해야 할 때 필수적입니다.

Follow-up 질문

리팩토링 도중 예상치 못한 버그가 프로덕션에서 발견되었을 때, 롤백과 전진 중 어떤 기준으로 판단하시겠습니까?

5 통합 테스트
Medium

Q. iOS 앱에서 CoreData, UserDefaults, Keychain, 원격 API를 모두 사용하는 사용자 인증 플로우의 통합 테스트를 작성하려고 합니다. 각 의존성을 어떻게 처리해야 테스트의 신뢰성과 실행 속도를 모두 확보할 수 있습니까? 실제 구현체 사용과 테스트 더블 사용의 기준을 설명해주세요.

통합 테스트의 범위와 목적을 먼저 정의하고, 각 의존성의 특성에 따라 다르게 접근해보세요.

A. 모범답안

통합 테스트의 목적이 컴포넌트 간 상호작용 검증이므로, 가능한 실제 구현체를 사용하되 외부 의존성은 제어 가능한 형태로 만듭니다. CoreData는 In-Memory Store를 사용해 실제 CoreData 스택을 테스트하되 디스크 I/O를 제거합니다. UserDefaults는 테스트용 suite name을 사용해 격리하고, 각 테스트 후 초기화합니다. Keychain은 테스트 환경에서 접근 가능하므로 실제 Keychain을 사용하되, 테스트용 prefix를 붙여 관리하고 tearDown에서 삭제합니다. 원격 API는 URLProtocol을 활용한 Mock 서버나 Stub을 사용해 네트워크 불안정성을 제거하고, 다양한 응답 시나리오(성공, 실패, 타임아웃)를 재현 가능하게 만듭니다. 전체 플로우는 Given-When-Then 패턴으로 작성하여 가독성을 높이고, 각 시나리오별로 독립적인 테스트 케이스를 구성합니다.

핵심 포인트
  • • In-Memory CoreData Store로 실제 스택 테스트
  • • 테스트용 격리된 UserDefaults와 Keychain 사용
  • • URLProtocol 기반 네트워크 Stub으로 재현성 확보
  • • Given-When-Then 패턴과 시나리오별 독립 테스트
답변에 넣으면 좋은 키워드
In-Memory Store URLProtocol 테스트 격리 Given-When-Then Mock Server 통합 테스트
실무에서는

여러 시스템 컴포넌트가 협력하는 복잡한 기능의 정확성을 보장하면서도 빠른 피드백을 받아야 할 때 사용됩니다.

Follow-up 질문

통합 테스트가 너무 느려서 개발자들이 자주 실행하지 않는다면, 어떤 최적화 전략을 적용하시겠습니까?

6 테스트 자동화
Hard

Q. 대규모 iOS 프로젝트에서 UI 테스트가 10분 이상 소요되어 CI/CD 파이프라인의 병목이 되고 있습니다. 빌드당 30개 이상의 UI 테스트가 실행되며, 일부는 간헐적으로 실패합니다. 테스트 실행 시간을 단축하고 안정성을 높이기 위한 아키텍처 레벨의 개선 방안을 제시해주세요.

UI 테스트의 범위를 재정의하고, 병렬화와 테스트 피라미드 원칙을 고려해보세요.

A. 모범답안

먼저 테스트 피라미드 원칙에 따라 UI 테스트는 핵심 사용자 시나리오(회원가입, 결제 등)로 최소화하고, 나머지는 단위 테스트와 통합 테스트로 전환합니다. UI 테스트는 여러 시뮬레이터에서 병렬 실행하도록 CI 환경을 구성하고, Xcode Cloud나 Firebase Test Lab 같은 클라우드 기반 테스트 인프라를 활용합니다. 간헐적 실패는 암묵적 대기 대신 명시적 대기(waitForExistence)를 사용하고, 애니메이션을 비활성화하며, 테스트 간 상태 공유를 제거하여 해결합니다. 테스트 데이터는 setUp에서 API Mock이나 deeplink를 통해 빠르게 구성하고, UI 조작을 최소화합니다. 스모크 테스트와 풀 테스트를 분리하여, PR 단계에서는 5분 이내의 스모크 테스트만 실행하고, 머지 후에는 전체 테스트를 실행합니다. 테스트 실패 시 스크린샷과 로그를 자동 수집하여 디버깅을 용이하게 합니다.

핵심 포인트
  • • 테스트 피라미드 원칙에 따른 UI 테스트 최소화
  • • 병렬 실행과 클라우드 인프라 활용
  • • 명시적 대기와 애니메이션 비활성화로 안정성 확보
  • • 스모크 테스트와 풀 테스트 분리 전략
답변에 넣으면 좋은 키워드
테스트 피라미드 병렬 실행 UI 테스트 CI/CD 스모크 테스트 Flaky test
실무에서는

지속적 배포를 위해 빠르고 안정적인 테스트 파이프라인이 필수적인 애자일 조직에서 중요합니다.

Follow-up 질문

UI 테스트를 완전히 제거하고 스냅샷 테스트로 대체하는 것에 대해 어떻게 생각하십니까?

7 코드 품질 메트릭
Medium

Q. 조직에서 코드 품질을 객관적으로 측정하고 개선하기 위해 메트릭을 도입하려고 합니다. Swift 프로젝트에서 추적해야 할 핵심 메트릭과 각각의 목표 수치, 그리고 메트릭이 개발자 행동에 부정적 영향을 주지 않도록 하는 방안을 설명해주세요.

정량적 메트릭과 정성적 평가를 균형있게 조합하고, 메트릭의 부작용을 고려해보세요.

A. 모범답안

테스트 커버리지(목표 70% 이상, 단 커버리지만을 위한 무의미한 테스트는 지양), Cyclomatic Complexity(메서드당 10 이하), 파일 크기(400줄 이하 권장), 의존성 깊이(레이어 간 순환 참조 제로)를 기본 메트릭으로 설정합니다. 코드 중복률(5% 이하)과 기술 부채 비율(SonarQube 등 활용)도 추적합니다. 다만 메트릭은 팀의 목표이지 개인 평가 지표로 사용하지 않으며, 메트릭 개선 자체가 목적이 되지 않도록 주의합니다. 예를 들어 커버리지 목표 달성을 위해 의미 없는 테스트를 작성하는 것을 방지하기 위해 코드 리뷰에서 테스트 품질을 함께 검토합니다. 메트릭 대시보드를 공개하여 투명성을 확보하고, 월별 트렌드를 추적하여 지속적 개선 문화를 만듭니다. 정량적 메트릭과 함께 코드 리뷰 피드백, 버그 발생률, 배포 빈도 같은 정성적 지표도 함께 고려합니다.

핵심 포인트
  • • 테스트 커버리지, Cyclomatic Complexity, 파일 크기 등 핵심 메트릭
  • • 메트릭의 부작용 방지 (개인 평가 배제, 품질 중심)
  • • 정량적·정성적 지표의 균형
  • • 투명한 대시보드와 트렌드 추적
답변에 넣으면 좋은 키워드
테스트 커버리지 Cyclomatic Complexity 기술 부채 코드 메트릭 SonarQube 지속적 개선
실무에서는

코드 품질을 조직 차원에서 관리하고 기술 부채를 정량적으로 추적해야 하는 성숙한 엔지니어링 조직에서 필수적입니다.

Follow-up 질문

개발자들이 메트릭 목표를 달성하기 위해 코드를 인위적으로 분리하거나 조작하는 경우, 어떻게 대응하시겠습니까?

8 테스트 더블
Medium

Q. Swift에서 Mock, Stub, Spy, Fake의 차이를 설명하고, 각각을 사용하기 적합한 상황을 실제 iOS 개발 시나리오로 예시를 들어 설명해주세요. 또한 과도한 Mocking이 테스트에 미치는 부정적 영향은 무엇입니까?

각 테스트 더블의 목적과 검증 방식의 차이를 중심으로 생각해보세요.

A. 모범답안

Stub은 미리 정의된 응답을 반환하는 객체로, 네트워크 API 호출 시 특정 JSON 응답을 반환하도록 설정할 때 사용합니다. Mock은 호출 여부와 인자를 검증하는 객체로, 분석 이벤트 전송 객체가 올바른 파라미터로 호출되었는지 확인할 때 적합합니다. Spy는 실제 객체를 래핑하여 호출을 기록하는 객체로, 기존 동작을 유지하면서 메서드 호출 횟수를 추적할 때 사용합니다. Fake는 실제 구현을 단순화한 동작하는 객체로, In-Memory 데이터베이스가 대표적 예시입니다. 과도한 Mocking은 구현 세부사항에 테스트가 결합되어 리팩토링 시 테스트가 깨지는 문제(Fragile Test)를 야기하고, 실제 통합 시 발생할 수 있는 문제를 놓칠 수 있습니다. 따라서 가능하면 실제 객체나 Fake를 사용하고, 제어하기 어려운 외부 의존성에만 Mock/Stub을 적용하는 것이 좋습니다.

핵심 포인트
  • • Stub(응답 반환), Mock(호출 검증), Spy(호출 기록), Fake(단순 구현) 구분
  • • 각 테스트 더블의 적절한 사용 시나리오
  • • 과도한 Mocking의 부작용 (Fragile Test, 통합 이슈 놓침)
  • • 실제 객체 우선, 필요시에만 테스트 더블 사용 원칙
답변에 넣으면 좋은 키워드
Mock Stub Spy Fake 테스트 더블 Fragile Test
실무에서는

외부 의존성이 많은 비즈니스 로직을 독립적으로 테스트하면서도 테스트의 유지보수성을 확보해야 할 때 중요합니다.

Follow-up 질문

Third-party 라이브러리의 복잡한 객체를 Mocking하기 어려운 경우, 어떤 전략을 사용하시겠습니까?

9 성능 테스트
Hard

Q. iOS 앱의 핵심 기능 중 하나인 이미지 필터 적용 로직의 성능이 저하되지 않도록 보장하는 자동화된 성능 테스트 전략을 설계해야 합니다. XCTest의 성능 측정 기능을 활용할 때 고려해야 할 사항과, 성능 회귀를 조기에 감지하기 위한 CI 통합 방안을 설명해주세요.

성능 테스트의 신뢰성을 위해 환경 변수를 통제하고, 기준선 설정과 변동성 허용 범위를 고려해보세요.

A. 모범답안

XCTest의 measure 블록을 사용해 이미지 필터 적용 시간을 측정하되, 테스트 환경의 일관성을 위해 고정된 크기와 포맷의 샘플 이미지를 사용합니다. 첫 실행은 워밍업으로 제외하고, 10회 이상 반복 측정하여 평균과 표준편차를 계산합니다. Baseline을 설정하여 이전 성능 대비 10% 이상 저하 시 테스트 실패로 처리하고, CI에서 자동으로 감지되도록 합니다. 성능 테스트는 실제 디바이스나 일관된 시뮬레이터 환경에서 실행하며, 백그라운드 프로세스의 영향을 최소화합니다. 시간 복잡도뿐 아니라 메모리 사용량(XCTMemoryMetric)과 CPU 사용률도 함께 측정하여 다차원적으로 성능을 평가합니다. 성능 테스트 결과는 시계열 데이터로 저장하고 대시보드에서 시각화하여 장기적 트렌드를 추적합니다. 다만 성능 테스트는 실행 시간이 길므로 일반 PR에서는 skip하고, nightly build나 릴리스 브랜치에서만 실행하도록 분리합니다.

핵심 포인트
  • • measure 블록과 반복 측정으로 신뢰성 확보
  • • Baseline 설정과 허용 범위 기반 회귀 감지
  • • 시간, 메모리, CPU 등 다차원 메트릭 측정
  • • 성능 테스트의 선택적 실행과 트렌드 추적
답변에 넣으면 좋은 키워드
XCTest measure Baseline 성능 회귀 XCTMemoryMetric CI 통합 시계열 데이터
실무에서는

성능에 민감한 기능(이미지/비디오 처리, 대용량 데이터 처리)의 품질을 지속적으로 보장해야 할 때 필수적입니다.

Follow-up 질문

성능 테스트 결과가 실행 환경에 따라 크게 변동하는 경우, 어떻게 신뢰성을 확보하시겠습니까?

10 테스트 조직 문화
Hard

Q. 빠른 배포를 중시하는 스타트업 문화에서 테스트 작성이 개발 속도를 늦춘다는 인식이 팽배합니다. CTO로서 테스트의 가치를 조직에 설득하고, 비즈니스 목표와 품질을 모두 달성하기 위한 균형잡힌 테스트 전략과 조직 변화 관리 방안을 제시해주세요.

단기 속도와 장기 생산성의 트레이드오프, 데이터 기반 설득, 점진적 문화 변화를 고려해보세요.

A. 모범답안

먼저 테스트 부재로 인한 비용을 정량화합니다. 프로덕션 버그 수정 시간, 핫픽스 배포 빈도, 고객 이탈률 등을 측정하여 품질 문제의 비즈니스 임팩트를 데이터로 제시합니다. 테스트를 모든 코드에 적용하는 대신, 비즈니스 크리티컬한 영역(결제, 인증, 핵심 전환율)에 집중하는 Risk-Based Testing 전략을 채택합니다. 새로운 기능 개발 시 테스트 작성 시간을 별도로 산정하여 일정에 반영하고, 테스트가 있는 코드와 없는 코드의 버그 발생률을 비교하여 효과를 입증합니다. 테스트 작성이 익숙하지 않은 팀을 위해 페어 프로그래밍과 테스트 워크샵을 운영하고, 좋은 테스트 예시를 공유합니다. 단기적으로는 스모크 테스트와 E2E 테스트로 빠른 안전망을 구축하고, 중장기적으로 단위 테스트 커버리지를 점진적으로 높입니다. 테스트 자동화로 절감된 QA 시간을 측정하여 투자 대비 효과(ROI)를 지속적으로 공유합니다.

핵심 포인트
  • • 품질 문제의 비즈니스 비용 정량화
  • • Risk-Based Testing으로 핵심 영역 우선순위화
  • • 테스트 효과의 데이터 기반 입증
  • • 점진적 도입과 교육, ROI 지속 공유
답변에 넣으면 좋은 키워드
Risk-Based Testing ROI 비즈니스 임팩트 조직 문화 점진적 도입 데이터 기반 의사결정
실무에서는

기술 부채와 빠른 성장 사이에서 균형을 찾아야 하는 스케일업 단계의 조직에서 리더십이 직면하는 핵심 과제입니다.

Follow-up 질문

테스트 문화가 정착된 후, 과도한 테스트로 인해 개발 속도가 실제로 느려진다면 어떻게 조정하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!