[swift] 코드 리팩토링

코드 리팩토링은 소프트웨어 개발 과정에서 중요한 단계입니다. 이는 기존의 코드를 개선하고 가독성을 높이며 유지보수를 용이하게 만드는 작업입니다. Swift 언어를 사용하여 코드 리팩토링을 하는 방법에 대해 알아보겠습니다.

1. 기능 분리

코드 리팩토링의 첫 번째 단계는 코드를 기능 단위로 분리하는 것입니다. 기능 별로 코드를 모듈화하면 가독성과 유지보수성이 향상됩니다. 예를 들어, 로그인 기능과 회원가입 기능은 서로 다른 역할을 가지므로 각각의 코드로 분리하는 것이 좋습니다.

// 로그인 기능
func login() {
    // 로그인 로직
}

// 회원가입 기능
func register() {
    // 회원가입 로직
}

2. 변수와 함수 명명 규칙

명확하고 일관된 변수와 함수명을 사용하는 것은 가독성을 높이는 중요한 요소입니다. 변수와 함수의 역할을 명확하게 나타내는 이름을 사용하고, Swift의 네이밍 규칙에 따라 작성하는 것이 좋습니다.

예를 들어, getUserInfo()와 같은 함수명은 사용자 정보를 가져오는 역할을 나타내므로 적절한 네이밍입니다. 변수명도 마찬가지로 loggedInUser와 같이 사용자 로그인 상태에 대한 변수명을 잘 표현하는 것이 좋습니다.

3. 중복 코드 제거

중복된 코드는 유지보수를 어렵게 만들 수 있으므로 코드 리팩토링을 할 때 제거해야 할 부분입니다. 유사한 코드가 반복적으로 사용되는 경우, 이를 함수나 클래스로 추상화하여 중복을 제거할 수 있습니다.

예를 들어, 여러 곳에서 사용되는 로그인 검증 코드가 중복되는 경우, 해당 코드를 함수로 추출하여 중복을 제거할 수 있습니다.

// 중복 코드
if username.isEmpty || password.isEmpty {
    showError("Please enter both username and password.")
}

// 중복 제거
func validateLogin(username: String, password: String) -> Bool {
    if username.isEmpty || password.isEmpty {
        return false
    }
    return true
}

// 사용
if validateLogin(username: username, password: password) {
    // 로그인 수행
} else {
    showError("Please enter both username and password.")
}

4. 에러 핸들링 및 오류 메시지 통일

같은 종류의 에러에 대해 일관된 에러 핸들링 및 오류 메시지를 사용하는 것은 개발과 유지보수를 용이하게 만듭니다. Swift의 enum을 사용하여 에러 유형을 정의하고, 각 에러마다 적절한 오류 메시지를 제공하는 것이 좋습니다.

enum APIError: Error {
    case invalidURL
    case requestFailed
    case authenticationError
    case invalidData
}

func handleAPIError(error: APIError) {
    switch error {
        case .invalidURL:
            showError("Invalid URL")
        case .requestFailed:
            showError("Request failed")
        case .authenticationError:
            showError("Authentication failed")
        case .invalidData:
            showError("Invalid data")
    }
}

5. 주석 추가

리팩토링한 코드에 주석을 추가하는 것은 다른 개발자들이 코드를 이해하고 유지보수할 때 도움이 됩니다. 주석을 통해 코드의 목적과 동작을 설명하고, 필요한 경우 예시나 사용 방법 등을 제공할 수 있습니다.

// 사용자 로그인 함수
func login(username: String, password: String) {
    // 유효성 검사
    if username.isEmpty || password.isEmpty {
        showError("Please enter both username and password.")
        return
    }
    
    // 서버로 로그인 요청 전송
    APIService.shared.login(username: username, password: password) { result in
        switch result {
            case .success(let token):
                // 로그인 성공
                UserDefaults.standard.set(token, forKey: "accessToken")
                showSuccess("Login successful")
            case .failure(let error):
                // 로그인 실패
                handleError(error)
        }
    }
}

이와 같은 방법들을 적절히 사용하여 Swift 코드를 리팩토링하면 가독성과 유지보수성이 향상됩니다. 코드 리팩토링을 통해 개발 프로젝트를 효율적으로 관리할 수 있으며, 향후 변경이나 추가 작업이 필요할 때도 손쉽게 대응할 수 있습니다.


참고 자료: