본문 바로가기

728x90

분류 전체보기

(104)
조금은 이른 23년 회고 어느덧 12월이 되었다. 결혼한 지 벌써 2년이 다 되어간다는게 실감이 나질 않는다. 새로운 직장에 들어온 지도 일 년 하고도 5개월이 지났다. 시간이 참 빠르구나 싶다. 어떻게 일 년을 보냈는지 정말 정신없었던 것 같다. 상반기는 회사에 모든 열정을 쏟았고, 하반기는 내년 초 태어날 우리 아기를 기다리며 바쁜 나날을 보냈다. 23년에 들어서며 다짐했던 일들이 잘 지켜지진 않았다. 아직도 냉장고에 붙어있는 “올해의 다짐” 목록 중에는 해 낸 것보다, 게을러서 하지 못 한 일이 더 많다. 하지도 않을 일을 적어서 뭐하냐 싶지만, 꾸준히 뭔가를 이루려 하는 마음을, 초심을 잃지 않기 위해 내년에도 새로운 다짐을 적어서 냉장고에 붙여둘 계획이다. 이제 올해 내가 한 일들 중 잘 해낸 것이 뭐가 있는지 살펴보려..
[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``를 사용할 때 유용할 수 있습니다. 어떻게 다른 값을 나타내는지 확인할 때 유용합니다...
맥 주피터 노트북 설치 터미널 키고 파이썬 설치 확인 python -v 없다면 다운로드 https://www.python.org/ 다운로드 위로 커서를 올리면 버튼이 보인다. 눌러서 다운로드 설치 완료 후 주피터 설치 명령어 입력 pip3 install jupyter 실행! jupyter notebook
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메서드..
Combine 변환연산자 Combine에서 우리는 퍼블리셔로부터 오는 값에 대한 연산을 수행하는 메소드를 " `operator` "라고 부릅니다. 각 결합 연산자는 게시자를 반환합니다. 일반적으로 게시자는 업스트림 이벤트를 수신하여 조작한 다음 조작된 이벤트 다운스트림을 소비자에게 보냅니다. collect() collect연산자의 publisher는 개별 값 스트림을 단일 배열로 변환하는 편리한 방법을 제공한다. 마블 다이어그램은 작업자가 작동하는 방식을 시각화하는 데 도움이 된다. 맨 윗줄은 업스트림 게시자, 상자는 연산자를 나타낸다. 그리고 마지막은 구독, 구체적으로는 업스트림 게시자로부터 오는 값을 조작한 후 구독자가 받게된다. example(of: "collect") { ["A", "B", "C", "D", "E"].pu..
[SwiftUI] View와 ViewModel (ObservableObject, @Published, @ObservedObject) @State에 이은 두번째. ObservableObject와 @ObservedObject는 SwiftUI에서 ViewModel구조를 사용할때 유용하다. ObservableObject를 채택하면 클래스의 내부속성의 변경사항을 구독자에게 전달할수 있는 객체가 된다. 오로지 클래스에만 사용이 가능하다. class SomeViewModel: ObservableObject { @Published var myName: String = "" } 그리고 뷰 모델에서 변경 가능한 속성을 선언하기 위해 @Published 속성 래퍼를 사용해야 한다. @Published는 ObservableObject 프로토콜을 준수하는 클래스에 속성을 감시할수 있도록 하는 프로퍼티 래퍼다. SwiftUI를 사용한 MVVM구조에서 View..

728x90