본문 바로가기

728x90

난 iOS개발자

(53)
클린아키텍처 적용하기-03 몇가지 팁과 고민들 클린아키텍처 적용하기-02 테스트  이전 글에 이어서 마무리하는 글. Repository은 그저 중간자 역할뿐인가? 꼭 필요한가? 데이터 엑세스를 하는 Datasource와 UseCase를 연결하기 위한 adaptor 역할이라고 볼 수 있습니다. Datasource와 직접 연결해도 되는것을 불편하게 하나의 과정을 더 밟는게 아닌가 싶지만, 이는 데이터소스의 구체적인 구현 세부사항을 비즈니스 로직으로부터 숨길수 있게 해줍니다. 일관된 인터페이스를 제공해서 비즈니스 로직이 Datasource의 구체적인 구현에 의존하지 않도록 하는것입니다. 때문에 Datasource를 변경하거나 업그레이드 되어도 비즈니스 로직에 영향을 주지 않습니다. 또 데이터 소스로부터 받은 데이터를 애플리케이션이 사용하기 적합한 형태로..
클린아키텍처 적용하기-02 테스트 클린아키텍처 적용하기-01 개념과 흐름이해 이전 글에 이어서 클린아키텍처를 적용하고 테스트 코드를 어떻게 작성할 수 있는지, 코드를 보고 따라가면서 그 장점을 알아보겠습니다. 클린아키텍처를 적용하고 나니 테스트할때 용이하다는 말이 무엇인지 와닿게 되었습니다. 아래 조금 지루한 내용일테지만 차근 차근 봐주시길 바랍니다. 앱의 버전을 최신 버전과 비교하고 업데이트 필요여부를 확인하는 요구사항이 생겼습니다. 설치버전의 숫자가 현재 앱 버전보다 최신버전이 높은경우 팝업을 띄우고 강제 업데이트(앱스토어 이동)를 진행하고자 합니다. 최신 버전은 LatestVersionDatasource을 채택한 구현체가 서버로부터 값을 받아와서 반환하고 있습니다. protocol LatestVersionDatasource { fu..
지극히 주관적인 리팩토링 (이벤트로그는 어디에 넣어야하는가?) 회사 프로젝트를 진행하다보면 다양한 코드를 만나게 된다. 작성자의 의도가 분명한 코드도 있는 반면 어느정도 편리함과 타협하여 쉽게 작성한 코드도 보인다. 물론 지극히 내 주관적인 기준으로 판단했을때의 코드이다. 작성자의 분명한 의도를 내가 파악하지 못했을 수도 있다. 요즘 맞닥들인 문제는 내 스타일과 조직내 코딩컨벤션의 갭이 꽤 크다는 것이다. 내가 정답이라는건 아니지만 내가 보고 고쳐야겠다고 생각이 든 코드도 그리 좋아보이지는 않았다. 구성원이 여러명인 조직에 들어온 것은 또 처음이라 내가 적응을 못하고 있는것은 아닐런지, 스스로 생각해보기도 했다. 처음엔 꽤 혼란스러웠지만 이제는 적응이 되었고 어느정도 분위기도 파악되었다. 아래 부터는 내가 생각한 재구성이 필요한 코드가 어떤것이었는지 설명하면서 어떤..
클린아키텍처 적용하기-01 개념과 흐름이해 배경 최근 진행한 iOS프로젝트에 클린아키텍처를 적용했습니다. 이 글은 클린아키텍처에 대해 학습했던 내용을 복습하고, 실전에 써먹으면서 애매모호 했던 부분들을 나름대로 정리한 글입니다. 배우면서 적용한 첫 프로젝트이기 때문에 중간중간 잘못된 정보가 전달될 수 있으니 이상하다~ 싶은점은 댓글로 남겨주길 바랍니다. 진행했던 프로젝트는 iOS, Android 두 플랫폼에서 동시에 개발이 진행되었습니다. 모바일 아키텍처는 서로 비슷한 부분이 굉장히 많으므로 각 플랫폼 담당자가 아키텍처를 함께 논하고 비즈니스 로직을 맞춘다면 시너지가 있을거라 생각됐습니다. 화면단위로 쪼개어 각 화면에서 필요한 유스케이스를 함께 정의하고 플로우를 맞춘다면 플랫폼이 달라도 담당자끼리 건설적인 대화를 할수 있을거라... 그래서 저와 ..
[iOS] Sandbox App SandBox란 App SandBox란 커널 수준에서 강제 적용되는 맥 OS의 접근 제어 기술입니다. App이 손상될 경우, 시스템과 사용자 데이터의 손상을 억제하도록 설계되어있습니다. App Store에서 유통되는 App들은 모두 App SandBox를 적용시켜야만 합니다. App Sandbox는 각 앱마다 취약한 리소스에 대한 액세스를 제한함으로써 공격자로 인한 사용자 데이터의 도난, 손상 또는 삭제 또는 시스템 하드웨어 해킹에 대한 마지막 방어선을 제공합니다. 파일 시스템 격리: 각 앱은 고유한 디렉토리 내에 파일을 저장하고 액세스할 수 있습니다. 다른 앱의 파일에 직접 액세스할 수 없으며, 사용자의 개인 데이터를 보호합니다. 키 체인: 앱은 감성적이고 중요한 정보를 안전하게 저장해야 합니다..
[iOS] UserDefaults 알아보기 앱이 실행되는 동안 키-값 쌍을 지속적으로 저장하는 사용자 기본 데이터베이스에 대한 인터페이스입니다. 샌드박스 저장을 통해 앱이 제거될 때 까지 지속적으로 저장할 수도 있습니다. 개요 런타임중 UserDefaults 객체를 사용하여 앱이 사용자의 기본값 데이터베이스에서 사용하는 기본값을 읽습니다. UserDefaults는 정보를 캐시하여 기본값이 필요할 때마다 사용자의 기본값 데이터베이스를 열지 않아도 됩니다. 기본값을 설정하면 프로세스 내에서 동기적으로 변경되고 영구 저장소 및 기타 프로세스에 비동기적으로 변경됩니다. 샌드박스? UserDefaults에 저장된 데이터는 앱의 샌드박스 내에 저장됩니다. 샌드박스는 각 iOS 앱에 할당된 고유한 파일 및 데이터 저장 공간입니다. 샌드박스라는 개념때문에 iO..
Alert struct ContentView: View { @State private var showing = false var body: some View { VStack { Button("Alert 띄우기") { showing = true } .alert("메시지", isPresented: $showing) { Button("OK", role: .cancel) { } } } } }
Stub, Mock, Dummy 최근 회사 프로젝트에 테스트코드를 넣기 시작했다. 연습으로 테스트 코드를 작성했던것과 달리 조금 더 신경써야 할 부분들이 생겨났고, 나중에 다른 개발자가 보더라도 이해하기 쉬워야할텐데, 아무튼 테스트 코드를 작성하다보니 조금 헷갈리는 부분이 있어서 정리하려한다. 테스트 코드를 작성하면서 의존성이 생기는 경우가 허다하다. A를 검증하기 위해서 B,C,D를 주입시켜줘야 하는 경우인데 B,C,D 가 실제로 동작하지 않아도 되거나 가짜 데이터를 즉시 반환하는 역할을 하기도 한다. 이렇게 검증에 필요한 거짓된 객체를 사용함에 있어서 어떤 경우에 Stub, Dummy, Mock같은 네이밍을 해줘야할지 정리한다. Stub Stub은 호출에 대해 정해진 응답을 하게 만든 객체이다. 아래는 팀원목록을 반환하는 레파지토리..
@Binding 변수 포함된 View의 PreviewProvider 사용 @Binding var name: String 과 같은 변수가 있는 뷰의 경우 struct ContentView: View { @Binding var name: String var body: some View { ZStack { Text(name) } } } struct ContentView_PreviewProvider: { static var previews: some View { ContentView(name: .constant("철수")) } } 위 처럼 쓰면 프리뷰를 볼 수 있다. .constnat는 Binding을 생성하는데 " 뷰가 다른 값을 어떻게 나타내는지 확인하기 위해 ``PreviewProvider``를 사용할 때 유용할 수 있습니다. 어떻게 다른 값을 나타내는지 확인할 때 유용합니다...
eraseToAnyPublisher eraseToAnyPublisher는 Publisher프로토콜을 구현하는 타입에서 호출, 해당 Publisher의 타입을 숨기고 AnyPublisher 타입으로 변환합니다. 이 변환을 통해 Publisher의 구체적인 타입정보를 숨기고 API설계 단순화에 도움이됩니다. 예 func fetchData(url: URL) -> AnyPublisher { URLSession.shared.dataTaskPublisher(for: url) .map { $0.data } .eraseToAnyPublisher() } fetchData함수는 URL을 인수로 받아 데이터를 요청하고 결과를 반환하는 역할입니다. API요청을 수행하고 map연산자를 사용하여 데이터만 추출합니다. 그리고 eraseToAnyPublisher메서드..

728x90