테스트 코드가 필수인 이유: 앱스토어도 통과한 치명적 버그를 잡다!

꾸Jun·2일 전
0

🍎 iOS

목록 보기
16/16

이래서 테스트코드구나,,!

최근에는 테스트 코드의 중요성을 깊이 깨닫는 값진 경험을 했다. 처음에는 "시뮬레이터로 확인하면 되지 않을까?"라는 생각이었지만, 단위 테스트를 도입하면서 개발 효율이 크게 향상되었다. 시뮬레이터 실행-오류 발견-수정-재실행의 긴 과정 대신, XCTest를 활용한 단위 테스트로 빠르게 문제를 발견하고 수정할 수 있었다.

특히 인상 깊었던 것은 토큰 만료 처리 기능을 테스트하면서 발견한 치명적인 버그였다.

수정 전 코드를 보면

// 수정 전
public func isTokenValid() -> Bool {
    guard let expirationDate = tokenExpiration else {
        return false
    }
    return expirationDate > Date()
}

이 코드의 문제점은 토큰이 만료되었을 때 단순히 false만 반환할 뿐, 실제로 필요한 처리(로그아웃, 사용자 정보 초기화 등)를 수행하지 않는다는 것이었다. 내 생각에는 다른 기능 구현을 하다가 까먹은 것 같았다,, 앱스토어 심사도 통과했고 일반적인 상황에서는 정상적으로 동작하는 것처럼 보였지만, 실제로는 만료된 토큰을 그대로 메모리에 유지하고 있었던 것이다.

테스트 코드를 작성하면서 이 문제를 발견하고 다음과 같이 수정했다.

// 수정 후
public func isTokenValid() -> Bool {
    guard let expirationDate = tokenExpiration,
          let accessToken = accessToken,
          !accessToken.isEmpty else {
        handleTokenExpiration()
        return false
    }
    
    let isValid = expirationDate > Date()
    if !isValid {
        handleTokenExpiration()
    }
    return isValid
}

수정된 코드에서는:
1. 토큰의 존재 여부와 유효성을 더 철저하게 검사하고
2. 토큰이 만료되었을 경우 handleTokenExpiration()을 호출하여 필요한 처리를 수행하며
3. 토큰이 비어있거나 만료된 경우 모두 적절한 처리를 보장한다

이는 사용자가 만료된 토큰으로 서비스를 이용하려 할 때 자동으로 로그아웃되고 재로그인을 유도하는 중요한 보안 기능이었다. 이런 버그는 실제 사용 시에는 잘 발견되지 않을 수 있었다. 토큰이 만료되었다는 것을 확인만 하고 실제 처리는 하지 않았기 때문에, 사용자는 로그인된 상태로 남아있지만 API 호출은 실패하는 모순적인 상황이 발생할 수 있었다.

이러한 경험을 통해 테스트 코드가 단순한 품질 향상 도구가 아닌, 제품의 안정성을 보장하는 필수적인 요소라는 것을 깨달았다. 특히 보안과 관련된 기능에서는 더욱 철저한 테스트가 필요하다는 것을 배웠고, 이를 적극적으로 실천하는 개발자가 되고자 한다.

profile
꾸준🐢

0개의 댓글

관련 채용 정보