본문 바로가기

iOS

Feature, ViewModel, UseCase

728x90
반응형
SMALL

Feature

iOS에서 Feature는 애플리케이션의 기능 또는 모듈을 나타내는 용어입니다. 예를 들어, "로그인", "회원 가입", "결제", "쇼핑 카트" 등이 모두 애플리케이션의 각각의 Feature가 될 수 있습니다. 각 Feature는 대개 특정 UI를 가지고 있고, 관련된 비즈니스 로직과 데이터 처리 로직을 포함합니다. iOS 애플리케이션을 개발할 때, 각 Feature는 보통 별도의 모듈 또는 폴더로 구성되어 있으며, 해당 Feature를 개발하는 데 필요한 코드 및 리소스가 모두 포함됩니다. 이렇게 Feature 단위로 모듈화하여 개발하면 코드의 재사용성이 높아지며, 애플리케이션을 보다 쉽게 유지보수할 수 있습니다.

 

*기획에 따라 Featrue 단위로 스프린트에 맞춰 개발하곤 합니다. :)

 

*** 스프린트란? ***

스프린트는 애자일 방법론에서 사용되는 개발 주기를 일컫는 용어입니다. 보통 1주일에서 4주까지의 짧은 개발 주기를 의미하며, 각 스프린트마다 목표를 설정하고 해당 목표를 달성하기 위해 개발 작업을 진행합니다. 이러한 짧은 주기로 개발을 진행하면서, 새로운 요구사항이나 문제점을 빠르게 발견하고 수정할 수 있어 전체적인 개발 프로세스의 효율성과 품질을 높일 수 있습니다.

ViewModel

iOS에서 ViewModel은 MVC, MVVM 및 Clean Architecture와 같은 다양한 아키텍처 패턴에서 사용되는 구성 요소 중 하나입니다. ViewModel은 사용자 인터페이스 (UI)와 통신하여 사용자 인터페이스의 표시를 처리하는 데 사용됩니다. ViewModel은 UI에서 발생하는 모든 이벤트를 처리하고 필요한 데이터를 가져와 UI에 제공합니다. 또한 ViewModel은 UI의 상태를 나타내는 속성을 가지며, 이 속성을 사용하여 UI를 업데이트할 수 있습니다. ViewModel은 UI에 관련된 로직을 처리하므로 UI와 분리된 코드를 유지할 수 있습니다. 이렇게 함으로써 코드 유지 관리 및 테스트에 대한 용이성을 제공할 수 있습니다.

UseCase

iOS 애플리케이션에서 유스케이스는 애플리케이션의 기능 및 비즈니스 로직을 설명하는 추상화된 개념입니다. 유스케이스는 사용자의 요구사항을 충족시키기 위해 시스템이 어떻게 동작해야 하는지에 대한 명세를 제공합니다.

iOS 애플리케이션에서 유스케이스는 일반적으로 비즈니스 로직을 처리하고, 데이터를 조작하고, 데이터를 저장하는 등의 작업을 수행합니다. 예를 들어, 사용자가 앱 내에서 새로운 계정을 만들기를 원한다면, 해당 유스케이스는 사용자 인증을 위한 로직을 수행하고, 계정 정보를 저장하는 등의 작업을 수행할 수 있습니다.

유스케이스는 또한 애플리케이션 내에서 서로 다른 기능들 간의 관계를 정의하고, 각각의 기능들이 어떻게 상호작용해야 하는지에 대한 명세를 제공합니다. 이러한 기능들은 주로 ViewModel과 함께 작동하여 UI와 연결되는 작업을 수행합니다.

 

 

 

뷰, 뷰모델, 유즈케이스의 코드 예시

// ViewModel

class UserViewModel: ObservableObject {
    
    @Published var username: String = ""
    @Published var password: String = ""
    @Published var isLoggedIn: Bool = false
    @Published var errorMessage: String = ""
    
    private let userUseCase: UserUseCase
    
    init(userUseCase: UserUseCase) {
        self.userUseCase = userUseCase
    }
    
    func login() {
        if username.isEmpty || password.isEmpty {
            errorMessage = "Please enter username and password"
        } else {
            userUseCase.login(username: username, password: password) { [weak self] result in
                switch result {
                case .success:
                    self?.isLoggedIn = true
                    self?.errorMessage = ""
                case .failure(let error):
                    self?.isLoggedIn = false
                    self?.errorMessage = error.localizedDescription
                }
            }
        }
    }
    
    func logout() {
        isLoggedIn = false
        username = ""
        password = ""
    }
    
}

// UseCase

class UserUseCase {
    
    private let userRepository: UserRepository
    
    init(userRepository: UserRepository) {
        self.userRepository = userRepository
    }
    
    func login(username: String, password: String, completion: @escaping (Result<Void, Error>) -> Void) {
        userRepository.login(username: username, password: password) { result in
            completion(result)
        }
    }
    
}

// View

struct LoginView: View {
    
    @ObservedObject var viewModel: UserViewModel
    
    var body: some View {
        VStack {
            TextField("Username", text: $viewModel.username)
                .padding()
            SecureField("Password", text: $viewModel.password)
                .padding()
            Button(action: {
                viewModel.login()
            }, label: {
                Text("Login")
            })
            .padding()
            .alert(isPresented: .init(get: { !viewModel.errorMessage.isEmpty }, set: { _ in })) {
                Alert(title: Text("Error"), message: Text(viewModel.errorMessage), dismissButton: .default(Text("OK")))
            }
        }
    }
    
}
728x90
반응형
LIST

'iOS' 카테고리의 다른 글

iOS 프레임워크 VS 라이브러리  (0) 2023.04.25
API 키 숨기기, xcconfig파일로  (0) 2023.04.20
iOS 터치-4  (0) 2023.04.16
iOS 터치-3  (0) 2023.04.16
iOS 터치-2  (0) 2023.04.16