Unit Test 할 때 @testable의 역할이 뭘까?
·
Swift
반갑습니다 집주인들 기술팀장 박효준입니다~이번에 테스트 코드를 작성하면서 testable이 무엇인가!에 대해 궁금해져서 정리해보았습니다!레츠 기릿~~문제 상황MHDomain이라는 모듈 안에 MHDomain 동적 라이브러리와 MHDomainTests 정적 라이브러리가 있고,MHPresentation 모듈 안에 MHPresentation 동적 라이브러리와 MHPresentationTests 정적 라이브러리가 있다.테스트를 진행할 때 import MHDomain 을 해주어야 하는데,이 때 import 앞에 @testable 키워드를 사용할 수 있다.무슨 역할을 하는 지 알아보자문제 해결@testable 키워드테스트 대상 모듈의 접근 수준에 영향을 주는지 여부이다.테스트 접근성 증가:Swift의 기본 접근 수준..
Test가 Serial하지 않군요!
·
Swift
안녕하세요... 임정현입니다...SwiftTesting 테스트 하다가 병렬 수행이 원인이 되었습니다...그래서 Serial하게 동작하는 방식을 찾고 공유드리고자 합니다.문제 상황파일 시스템을 테스트를 해야하는데… 아니 왜자꾸 뭐 됐다~~ 안됐다~~~ 하는 것이느냐…내 로직은 완벽하다고!!문제 해결그렇습니다파일을 읽고 쓰다 하다보면 이런 일이 발생할 수 있죠…특히 Async환경에서는 더더욱 쉽습니다.그러면 어떻게 해야할까요? 사실 FileManager를 제가 만들때 의도한 것은 여러 스레드에서 병렬적으로 실행되기를 바랬습니다.그래야 UI를 막지 않고, 빠르게 일을 처리할 수 있으니까요.그런데 이는 하나의 파일에 대해 하나의 일을 시켰을 때의 경우입니다.Test처럼 하나의 파일에 대해 여러번 주작하게 되면 ..
Swift의 전역 변수 초기화 시점
·
Swift
반갑습니다 집주인들 팀원 박효준입니다!본편에서는 동시성에 대해 알아보다가 "Swift의 전역 변수 초기화 시점"의 신기한 점을 알게되어 공유드리고자 합니다!그럼 바로 시작하겠습니다~~문제 상황Swift Concurrency를 공부하며 스레드 안전성을 알아보던 중 흥미로운 얘기를 듣게 되었다.let logger = Logger( subsystem: "com.example.apple-samplecode", category: "Root View")위 전역변수 logger 코드는 언제 실행될까 ??전역변수니까 시작 시점에 초기화가 될까 ?답은 아니다. 왜 그런지 알아보자문제 해결C언어와 Objective-C의 전역변수C언어와 Objective-C에서의 전역변수는 시작 시점에 초기화가 되는 게 맞다.그..
XCTest vs Swift Testing
·
Swift
문제 상황Swift 6 도입에 따른, 테스트 프레임워크 결정XCTest vs Swift Testing문제 해결XCTest 장단점4명 모두 경험이 있음비동기 처리하려면 timer 작업 해줘야 함XCTAssert 메소드 너무 많음XCTAssertFalse()XCTAssertNil()XCTAssertLessThan()XCTAssertLessThanOrEqual()...XCTAssertGreaterThanOrEqual()XCTAssertGreaterThan()XCTAssertNotNil()XCTAssertEqual()XCTAssertTrue()Swift Testing 장단점Swift 6.0 도입해야 쓸 수 있음 → 어차피 우린 도입함비동기 처리가 쉽다..?Swift Native 테스트 작업struct와 @를 통..
디버깅할 때, print가 아닌 OSLog 사용을 위한 Logger 구현
·
Swift
반갑습니다 집주인들 팀원 박효준입니다!본편에서는 "디버깅할 때, print가 아닌 OSLog 사용을 위한 Logger 구현"이라는 주제로 print()와 os_log()를 비교해보겠습니다 그럼 레쯔고 〰️  문제 상황우리가 평소 디버깅을 위해 흔히 사용하는 print는 간단한 출력에는 유용하지만, 다음과 같은 단점이 있다성능: print는 출력 결과를 처리하는 동안 메인 스레드에서 실행되어 앱 성능에 영향을 줄 수 있다.레벨 구분 없음: print는 메시지를 구분할 방법이 없어, 로그의 중요도(예: 디버그, 정보, 에러 등)를 명확히 알기 어렵다.릴리스 빌드에서의 노출: print는 릴리스 빌드에서도 동작하며, 개발 중 남긴 로그가 사용자에게 노출될 위험이 있다.검색 및 필터링 불편: Xcode의 콘솔에..
카메라 및 사진 권한 에러
·
Swift
안녕하세요 ~ 전 기록소의 디자이너 겸 개발자 영현입니다 ~ 저 혼자의 글은 처음인 것 같군여 !! ㅎㅎ 재밌네영소개는 존댓말로 해야할 것 같아서 존대를 썼는데 아래부터는 평서문으로.. 가겠습니다.. ^0^ 문제 상황인터넷 세상에서 나 빼고 모두가 카메라 권한을 AVCaptureDevice.requestAccess(for: .video, completionHandler: (Bool) -> Void) 을 사용하여 확인하고 있었다. (진짜 세상이 나한테 구라치는줄;; like 트루먼쇼..)하지만 내가 쓰기만 하면 아래와 같은 에러가 나왔다.설상가상 위 에러는 디버깅도 힘들고 정확히 어떤 이유에서 나는 에러인지 알기 힘든 메세지라 정말.. 힘들었다..문제 해결결론부터 말하자면 저 에러는 프로젝트를 Swift6..
우리팀의 Page Entity 타입 결정
·
Swift
문제 상황책 페이지 안에는 사진, 영상, 음성 등 용량이 큰 정보들이 담기는데, 이를 배열에 저장했을 때 페이지의 삽입(INSERT), 삭제(DELETE)가 불리하다고 생각했습니다. 예를들어, 책 페이지를 배열에서 관리하면 1,000장 10,000장 넘어갔을 때 앞 페이지의 삽입으로 인한 뒷 페이지들의 값 변화에 많은 비용이 발생하게 됩니다.따라서 책 페이지 하나를 노드로 생각하고,이를 Linked List로 관리하여 생성 및 수정을 할 때 삽입/삭제가 유용하도록 하고자 했다.연결리스트의 경우 레퍼런스가 필요한 모델이 될텐데,이를 class + Sendable vs Actor 타입 결정에 대한 논의이다. 문제 해결위 레퍼런스 타입을 정할 때 아래와 같은 사항을 고려하였다.Class + Sendable로 ..