묻고 답해요
145만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
ViewModel과 Model 구분 (30강)
안녕하세요. 강의 정말 잘 듣고 있습니다! 30강에서 회원정보 class 를 SignUpViewModel로 만드셨는데MVVM 아키텍처에서ViewModel은 비즈니스 로직을 처리하는 부분이고 데이터를 다루는 class나 struct의 경우에는 Model 파트가 맡는다고 이해를 하고 있었습니다. struct가 아닌 class의 경우에는 비즈니스 로직으로 봐야 하는건가요?
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
바인딩하는 이유
ProfileEditingView에서 뷰모델을 ProfileView에서 바인딩 받아서 사용하는데, 왜 바인딩을 받는 것일까요? ProfileEditingView에서 @State var viewModel = ProfileViewModel()로 새로 선언하지 않는 이유가 있을까요?
-
해결됨Flutter 중급 3편 - 의존성 주입 가이드
Bad state 에러
안녕하세요.아래와 같은 오류가 나서 해결을 하려고 했습니다.제공해주신 완성 본 코드와 비교하니 정확하게 일치했구요.E/flutter (22734): [ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: GetIt: Object/factory with type StoreRepository is not registered inside GetIt. E/flutter (22734): (Did you accidentally do GetIt sl=GetIt.instance(); instead of GetIt sl=GetIt.instance;이해가 안되어서 di_setup_config.dart파일을 보는데const String dev = 'dev'; const String prod = 'prod'; extension GetItInjectableX on i174.GetIt { // initializes the registration of main-scope dependencies inside of GetIt i174.GetIt init({ String? environment, i526.EnvironmentFilter? environmentFilter, }) { final gh = i526.GetItHelper( this, environment, environmentFilter, ); gh.singleton<_i149.LocationPermissionHandler>( () => i399.MockLocationPermissionHandler(), registerFor: {dev}, ); gh.singleton<_i872.StoreRepository>( () => i399.MockStoreRepositoryImpl(), registerFor: {dev}, ); gh.singleton<_i920.LocationRepository>( () => i399.MockLocationRepositoryImpl(), registerFor: {dev}, ); gh.singleton<_i716.GetNearByStoresUseCase>( () => i716.GetNearByStoresUseCase( storeRepository: gh<i872.StoreRepository>(), locationRepository: gh<_i920.LocationRepository>(), locationPermissionHandler: gh<_i149.LocationPermissionHandler>(), )); gh.singleton<_i920.LocationRepository>( () => i359.LocationRepositoryImpl(), registerFor: {prod}, ); gh.singleton<_i872.StoreRepository>( () => i303.StoreRepositoryImpl(), registerFor: {prod}, ); gh.singleton<_i149.LocationPermissionHandler>( () => i148.LocationPermissionHandlerImpl(), registerFor: {prod}, ); gh.factory<_i912.MainViewModel>( () => i912.MainViewModel(gh<i716.GetNearByStoresUseCase>())); return this; } }GetNearByStoresUseCase 코드가 prod버전의 코드들 보다 상위에 배치되어서 발생했습니다.di_setup_config.dart파일을 자동으로 생성되는 파일인데 매번 dart run build_runner build 할 때 마다 일일이 수동으로 수정을 해줘야 할까요?flutter pub run build_runner build --delete-conflicting-outputs를 해도 동일합니다.
-
미해결Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
75강 까지 마무리후 소스 오류 사항 문의
75강 마무리 후다른 사용자의 프로필 들어가서 팔로우 하면위에 팔로잉수가 실시간으로 변경되야 하는데안되네요.확인 부탁드립니다.강의 자료용 소스도 동일하게 작동 안합니다.Xcode16 / iOS18.2
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
SwiftUI main actor 관한 경고 계속 뜹니다.
참고로 제공해주신 소스도 동일하게 뜹니다. Objects stored in @StateObject properties must be isolated to the main actor. This warning will become a runtime crash in a future version of SwiftUI.
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
45강의 에서 Kingfisher 사용후 발생하는 swift6 이슈
ProfileEditingView 에서PhotosPicker 안에서KFImage 사용하니 에러가 발생 합니다. Kingfisher v8.1.3 PhotosPicker 밖에서 사용시 에는 문제 없습니다.
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
19강에서 Encoder()를 사용할 수 없습니다.
커뮤니티 보면서 FirebaseFirestoreSwift가 FirebaseFirestore와 통합되었다는 댓글을 보고 Add Package할 때 FirebaseFirestore만 했었습니다.문제는 Firestore.Encoder().encode(post)할 때 Type 'Firestore' has no member 'Encoder' 오류가 발생합니다.제 추측에는 FirebaseFirestore로 통합되면서 FirebaseFirestoreSwift를 import 할 수 없게 됐는데, 여기서 발생하는 문제 같습니다.올려주신 강의 코드 보니까 import FirebaseFirestoreSwift를 주석 처리하면 같은 에러가 나타나더라고요.이것은 어떻게 해결해야 할까요?
-
미해결Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
40. 강에서 정상작동 안합니다.
40 번 강의에 따라iOS 18.2Xcode 16.2아래 처럼 작성하고 실행 했는데class ProfileViewModel { var user: User? var name: String var username: String var bio: String init() { let tempUser = AuthManger.shared.currentUser self.user = tempUser self.name = tempUser?.name ?? "" self.username = tempUser?.username ?? "" self.bio = tempUser?.bio ?? "" } 프로필 name,bio,username 이 노출이 안됩니다.ProfileViewModel 의 init() 함수에 로그를 찍어 봤는데2번 호출이 되고 있습니다.nil 로 한번 후에 auth 값 들어온후에 한번 실행되는데이미 ProfileView 가 로드가 되어 있어서 업데이트가안되는듯 합니다. -- 확인 부탁드립니다. -- 강의소스로 테스트시에도 동일 증상 이었습니다(9-4ViewModel로 데이터 관리 - 소스로 테스트)init 에 로그 찍어 봤는데 2번 호출됩니다.이게 원인인거 같은데요. 첫 초기화에선 Auth값이 nil 이었습니다.
-
미해결Flutter 고급 - 현업 수준의 아키텍처
31강 stream 활용시 어떤장점이 있나요?
북마크를 future 대비 stream으로 할 때 장점이 (자세하게) 궁금합니다.감사합니다.
-
미해결Flutter 고급 - 현업 수준의 아키텍처
view model 은 팩토리로 생성하는 이유
23강의 5:10에서 usecase,repository 는 싱글톤으로 만들고, viewmodel은 팩토리로 만드는 것이 일반적이라고 하셨습니다.싱글톤으로 만드는 것은 이해했는데, 팩토리를 사용하는 이유는 무엇일까요? viewModel 안의 state 의 내용이 UI 의 데이터로 채워지고, viewModel 안의 state 는 가변적이니 싱글턴으로 하는게 맞지 않을까라는 생각이 갑자기 들어서요. viewModel을 다시 만드는 것이 어떤 경우가 있는지 궁금합니다. 강의항상 재밌게 듣고 있습니다. 감사합니다.
-
미해결Flutter 고급 - 현업 수준의 아키텍처
domain 에 data_source 를 만드는 이유.
강의 항상 잘 듣고 있습니다.질문이 하나 생겨서 여쭤봅니다.20강 30~33분 정도에서 domain 폴더에 data_source 폴더를 만드시는 이유를 다시 설명해주실 수 있을까요? 아래는 제가 생각하는 부분입니다. data/ 의 data/data_source/ 는 data/repository/ 에서 사용하는 부분임.domain/ 은 사실상 data/data_source/ 를 직접 접근하지 않고 domain/repository 를 활용하는 domain/use_case 를 통해 접근함.이렇게 생각이 들다보니, "domain 에서 data_source 의 인터페이스를 정의하는 것이 맞는건가?" 생각이 듭니다. 감사합니다.
-
미해결Flutter 응용 - 공공 API를 활용한 앱 만들기 (MVVM 패턴)
기존 코드 mvvm으로 역할 분리하는 기준이 궁금합니다
강의를 통해 학습에 정말 많은 도움을 받고 있습니다. 감사합니다. 처음부터 구조를 잘 잡아서 설계하면 좋겠지만, 역할이 제대로 명시되지 않은 함수들을 각각 repository, service, viewmodel로 역할을 명시해주는 것도 난이도가 있으면서 함수들의 역할을 더 명확히 파악하는 데 도움이 될 것 같아서 파일 하나에 함수를 몰아 놓고 분리해보고 있습니다.혹시 repository, service, viewmodel로 함수를 분리해서 작성할 때, 명확한 기준이 존재할까요??제가 학습한 바로는 repository는 데이터베이스/서버 통신 또는 데이터 불러오기 관련, service는 repository를 활용한 비즈니스 로직, Viewmodel은 service를 활용한 View와의 상호작용이라고 알고 있습니다.제가 아직 비즈니스 로직을 명확하게 구분하기기 어렵습니다..에를 들면 파일 탐색기 실행 > 파일 경로 받기 > 파일 디코딩 > JSON(map)형식 변환 > 데이터 필터링 의 과정이 있다고 가정하면, 여기서 어디까지의 함수를 어디로 분리할 지 감이 오지 않습니다.명확하게 구분할 수 있는 기준이나 팁이 존재한다면 알고 싶습니다!
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
프로필 수정 후 변경된 내용을 피드에 바로 반영되도록 하고 싶습니다.
안녕하세요. 강의 유익하게 들었습니다!지금 마지막까지 강의를 다 듣고 코드 작성도 완료한 상태인데, 현재는 ProfileEditingView에서 정보 수정 후, 피드에 수정된 유저의 정보가 바로 반영되지 않는 상태입니다.저는 프로필 수정 후 피드에 수정된 유저 정보가 바로 반영 되도록 추가적으로 작업을 하려고 하는데, 가장 최선의 방법이 무엇일지 궁금합니다. 현재로선 FeedCellView에 .onAppear를 걸어서 내부에 유저 정보를 한 번 더 가져오는 식으로 작성하거나, 아니면 새로고침을 했을 때만 가져오는 방법을 생각했는데, 이렇게 하면 모든 게시물에서 유저 정보를 업데이트 해야해서 그만큼 딜레이가 많이 발생하는 문제점이 있어 또 다른 나은 방법이 있을지, 이게 최선인지 알고싶습니다! 감사합니다.
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
15강에서 발생한 문제에 대해서 질문이 있습니다!
SDK 설치시 FirebaseFirestoreSwift 체크가 표시되지 않습니다 ios18 버전부터 없어진걸까요?Firebase Storage 빌드를 하려면 프로젝트 업그레이드가 필요하다고 합니다 결제요금제로 업그레이드 하라고 나오는데 결제를 진행해야 하나요?
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
13강 코드 작성 후 피드의 유저 데이터가 보이지 않는 문제
안녕하세요, 강의 잘 듣고 있습니다! 12강까지는 다른 유저의 게시물이 잘 보이고, 피드 상단 선택 시 프로필까지 잘 넘어갔었는데,13강을 끝까지 듣고 코드 작성 후 빌드를 했더니아래 화면처럼 유저의 데이터가 불러와지지 않고, 프로필로 이동도 안되며 어떤 동작도 하지 않습니다 ㅜㅜ FeedCellView에서 계속 ProfileViewModel(user: user) 을 생성하는 부분에서 문제가 되는 것 같은데,,어떻게 해결해야 할 지 모르겠습니다.아래 오류 이미지도 첨부하겠습니다. 감사합니다
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
즐겨찾기 탭에서 페이지네이션 422 서버 에러
안녕하세요, 페이지네이션 부분 오류가 있는 것 같아 질문 드립니다! UserListViewController에서 'bindView()' 메서드에서 페이지네이션을 구현하고 있습니다.강의 내용과 같이 구현하면, 즐겨찾기 유저를 여러 명 추가 후 다시 앱을 실행했을 때, Core Data에 저장된 즐겨찾기 유저 목록은 그대로 표시됩니다. 즐겨찾기 목록 테이블뷰를 맨 밑으로 스크롤 하면 422 서버에러가 발생합니다.테이블뷰의 맨 밑으로 스크롤 하면 바인딩 되어 있던 tableView의 prefetchRows(또는, willDisplayCell)의 코드가 실행되게 되고 fetchMore의 값이 변경되어 fetchUser()가 실행되어 output의 값이 변경되는데, 이때 텍스트필드 값은 비어있기 때문에 데이터를 받아오는 과정에서 422 에러가 발생하는 것이라 예상됩니다. 아래 코드와 같이 row를 받아 올 때, self?.tabButtonView.selectedType.value == .api를 추가하여 selectedType이 api 타입일 때만 fetchMore의 값이 변경되도록 수정하면 422 에러가 발생하지 않습니다.제가 생각한 오류의 원인과 해결 과정이 올바른지 질문드립니다! tableView.rx.willDisplayCell.bind {[weak self] (cell, indexPath) in guard let row = self?.tableView.numberOfRows(inSection: 0), self?.tabButtonView.selectedType.value == .api else {return} if indexPath.item >= row - 1 { self?.fetchMore.accept(()) } }.disposed(by: disposeBag) }
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
NetworkManager의 tokenHeader 관련 질문 드립니다!
안녕하세요, 덤벨로퍼님! 좋은 강의 감사드립니다!덕분에 좋은 코드 많이 보고 배울 수 있었습니다. 복습 중에 API 헤더 관련해서 궁금한 점이 있어 질문드려요. 강의에서는 API에서 필요로 하는 헤더를 NetworkManager 클래스에서 정의하고 사용하고 있습니다. 규모가 있는 앱에서는 API가 많고 서로 다른 헤더를 필요로 할 거라고 예상이 되는데 NetworkManagerProtocol의 'fetchData()' 메서드에서 파라미터로 헤더를 같이 받아오는 것이 효율적인지 궁금합니다. userNetwork의 'fetchUser()' 메서드 내에서 url과 header를 같이 생성하고 networkManager의 메서드 파라미터로 넘겨주는 방법이 괜찮은 방법일까요?
-
미해결iOS Clean Architecture & MVVM: RxSwift 완전 정복
[클린 아키텍쳐] 로컬 Json 파싱
안녕하세요! 클린 아키텍쳐 관련 질문있습니다.API 통신이 아니라 로컬에 저장된 json 파일에서 앱 실행시 한번 FileManager로 파싱하고자 하는데, 클린 아키텍쳐 구조로 진행하려면 어떤 구조로 될까요? Domain > Entity 영역에 City 모델을 만든 상태입니다.기능은 크게 2가지로 load하고 search하는 기능이 있습니다. load 한 이후에는 변수를 통해 search하면 되서 search는 뷰 모델에 정의하는게 맞는지, load의 경우 UseCaseProtocol 로 해야하는지 어떤 방식이 적합한지 여쭤봅니다. 추가로 API 통신하는 경우에도 로딩한 후 모델로 가공해서 보여주는 기능만 있는데, 그럴 경우에는 어떻게 진행하는걸 추천하시나요? API 로 선택한 항목에 대한 정보를 로딩하고 데이터 가공해서 UI에 보여주는 경우입니다.. 감사합니다.
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
의존성 주입에 관하여 질문있습니다.
let coredata = UserCoreData(viewContext: appDelegate.persistentContainer.viewContext) let network = UserNetwork(manager: NetworkManager(session: UserSession())) let userRP = UserRepository(coreData: coredata, network: network) // Domain Layer let userUC = UserListUsecase(respository: userRP) let userVM = UserListViewModel(usecase: userUC) // Presentation Layer let userVC = UserListViewController(viewModel: userVM)하나의 뷰 컨트롤러를 생성 시 ViewModel, UseCase, Repository, Network, CoreData 등 주입할 요소가 많아지는 것을 느꼈습니다.그렇다면 화면전환을 수행할 때마다 뷰 컨트롤러를 생성하게 되는데 매번 해당 컨트롤러에 의존성을 주입해주어야 하나요?또한 Network, CoreData 등 동일한 객체를 유지하기 위해서 이전화면의 ViewModel 객체를 다음화면의 ViewModel로 넘겨주면 될까요?궁극적으로 실무에서 사용하는 방식을 알고 싶습니다.
-
미해결iOS Clean Architecture & MVVM: RxSwift 완전 정복
강의 자료는 어디서 받을수 있나요?
강의에 사용되는 자료와 코드들은 어디서 받을 수 있나요?