[Swift Concurrency 5편] 동시성 프로그래밍 with GCD
·
📱 iOS/Swift Concurrency
개요동시성 프로그래밍 이론동시성 프로그래밍: 여러 작업들을 동시에 처리하는 것처럼 보이게 하는 것이번 주는 동시성 프로그래밍과 이를 위한 기법 GCD를 배워보겠음(사진 날진님 블로그 제공)좌측에 있는 노동자 = Thread우측에 있는 일 = TaskURLSession.dataTask() 처럼 기본적으로 백그라운드 스레드에서 비동기로 실행되는 게 아니라면우리는 여태껏 메인 스레드에 Task를 할당 해주고 있었다.예를 들어 50MB 이미지를 Data 클래스로 변환하는 작업을 하더라도 그냥 메소드에서 변경하고 있었다면 이는 메인 스레드에서 작업하는 것.메인 스레드 역할메인 스레드는 UI를 그리는 일을 해야 한다.뷰 그리는 UIKit의 속성을 백그라운드에서 돌리기 위해 Thread-safe하게 하려면 성능저하가..
[Swift Concurrency 4편] 직렬-동시, 동기-비동기
·
📱 iOS/Swift Concurrency
동시(Concurrent) vs 직렬(Serial)동시(Concurrent): 여러 스레드로 작업을 분산시켜 보낸다.직렬(Serial): 하나의 스레드로만 작업들을 보낸다. (작업 순서가 중요할 경우)동기(Sycn) vs 비동기(Async)동기(Synchronous): 다른 스레드로 보낸 작업이 끝날때까지 기다린다.작업이 순차적으로 진행되며 작업을 대기하는 동안 CPU가 낭비된다는 특징이 있다.비동기(Asynchronous): 작업을 다른 스레드에서 시키고, 바로 내 할 일을 한다.작업 흐름이 복잡해질 수 있지만 다음 작업에 대한 대기 시간이 감소한다는 특징이 있다.병렬 vs 동시병렬(Parallel): 멀티 코어에서 멀티 스레드를 사용해 실제로(물리적으로) 여러 작업을 한 번에 실행시킨다.동시(Conc..
[Swift Concurrency 3편] 공유자원과 임계영역
·
📱 iOS/Swift Concurrency
공유자원각 프로세스, 스레드가 접근할 수 있는 자원 or 변수경쟁 조건공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황공유 데이터에 동시 접근하거나, 동시에 업데이트하려는 과정에서접근 순서에 따라 결과가 달라질 수 있는 현상을 이야기함임계영역경쟁 조건이 발생하는 코드 영역공유 자원을 접근하므로, 동시에 두 스레드가 실행해서는 안되는 코드원자적으로 수행되면 문제가 생기지 않음그러나, 쓰기 작업을 할 때 아래와 같이 3단계의 명령어로 구성되어 일관성 문제 발생 상호 배제 (Mutual Exclusion)반드시 하나의 스레드만 임계영역을 실행하도록 보장하는 기법임계영역을 해결하기 위한 방법 3가지뮤텍스 (= 락) 프로세스나 스레드가 공유자원을 Lock()으로 잠금 설정하고 락 소유권을 얻고..
[Swift Concurrency 2편] Process & Thread
·
📱 iOS/Swift Concurrency
프로세스*프로그램의 인스턴스가 메모리에 올라와있는 것 프로그램: 디스크에 실행파일 형식으로 저장되어 있음프로세스 분류포그라운드 프로세스화면에서 사용자와 상호작용 함사용자가 볼 수 있는 공간에서 실행됨백그라운드 프로세스사용자가 볼 수 없는 공간, 화면 뒤에서 실행되는 데몬이 대표적 예시프로세스 메모리 구조스택과 힙동적 할당스택과 힙은 동적 할당 됨 (런타임 단계에서 메모리를 할당받는 것)스택지역변수, 함수 파라미터.. 등등 늘어나거나 줄어드는 메모리 영역함수 호출 시마다 환경 등 특정 정보가 스택에 계속 저장됨재귀 함수가 호출될 때 새로운 스택 프레임이 매번 사용됨단점: 반복적 호출 또는 함수가 메모리 초과할 정도로 지역 변수를 많이 가질 경우 Stack Overflow 발생힙프로그래머가 필요할 때마다 사..
[Swift Concurrency 1편] OT
·
📱 iOS/Swift Concurrency
배경네이버 부스트캠프 프로젝트에서 Swift 6.0 버전으로 개발을 진행했다.그러나 무수히 발생하는 동시성과 관련한 빨간 에러들,모두 Swift 5.5 버전에 출시된 Swift Concurrency와 관련한 내용이었다. 우리는 이걸 해결하기 위해 Sendable과 MainActor를 남발하면 어떻게든 되겠지 하고 넘겼다. 그렇게 지저분해진 우리가 막 싸지른 코드를 정리하고자네부캠 수료 후 Swift Concurrency 스터디를 운영하기로 했고,학습 후 프로젝트 리팩토링까지 진행하기로 했다. 해결해야 할 숙제들actor로 동작하는 것과 class가 Sendable인 것의 차이를 설명하기DIContainer처럼 클래스의 프로퍼티에 @MainActor를 붙인 것과 클래스 자체가 @MainActor인 것은 어..
[Xcode] 나는 Global App을 만들 테야 - Localization 2편
·
📱 iOS/Xcode
개요지난 1편에서 Localization에 대해 알아봤었다.여기서 배운 개념을 네부캠 프로젝트 '기록소'에 적용해보았고,그 과정에서 어떻게 작업했는지 특이사항은 뭐가 있었는 지를 기록해보겠다. 작업 진행먼저 En 영어를 등록해주었다.우리 프로젝트는 클린 아키텍처에 따라 레이어를 모듈로 분리했는데, 이에 따라서 localizable.xcstrings 파일을 어디에 둘 지 결정해야 했다. 직접 만지며 익힌 결과 Executable 실행 파일인 MHApplication 모듈에서 생성을 해야만 적용이 되는 것을 확인했고, 하나만 만들어서 관리하면 다른 모듈에 있는 Text도 모두 적용되는 것을 알 수 있었다.그래서 위와 같이 MHApplication - Localizable을 만들었다.참고로 우리 프로젝트는 i..
[Xcode] 나는 Global App을 만들 테야 - Localization 1편
·
📱 iOS/Xcode
개요기록소 프로젝트에 Localization을 진행하기로 했다. (이하 현지화 라고 부름)한국 소비자에 국한하지 않고, 글로벌한 앱을 만들기 위해서는 다국어가 필수라 생각했기 때문이다.우리 프로젝트는 iOS 16 버전 이상을 지원한다.그리고 Xcode는 팀원 모두 16.1을 사용하고 있다. 본 편에서는 현지화에 대한 이론과 iOS에서 현지화 하는 방법 2가지(레거시와 최신 버전)에 대해 설명하겠다.xcode 15 버전을 기준으로 Localization 최신 기술(= String Catalog)가 나왔기 때문이다. xcode 15 이전 버전xcode 15 이전에는 Strings File과 Dict를 이용해서 사용해야 했다. (stringsdict 확장자와 strings 확장자임)위 사진에서 Legacy라고..
[iOS] 메인 스레드에서 UI를 업데이트 해야하는 이유
·
📱 iOS
개요맨날 UI는 메인 스레드에서 그리라고 한다.백그라운드 스레드에서 그려지면 안될까 ?이유가 뭘까 ? 유저 입장에서 UI가 먼저 그려져야 하니까 ?그럼 무수히 많은 이미지들을 내려받아 화면에 보여주는 경우, 그 화면의 핵심은 이미지일텐데 이미지는 보통 비동기로 백그라운드에서 받는다.이러면 무슨 의미가 있나 싶었다. 여러 레퍼런스를 찾아봤다.앨런님의 작성 내용도 보고 첨부해주신 PDF도 보았다. 그럼 이해한 내용 정리 레쯔고1. 뷰를 그리는 UIKit을 Thread-safe하게 만들면 느려진다.UIKit의 구성요소는 Non Atomic하다. 즉 Thread-safe하지 않아 DataRace 가능성이 충분하다.Thread-Safe하게 만들려면 NSLock 추가, 혹은 atomic하게 변경만 하면 끝인줄 알았..
[Xcode] 우리의 최종 모듈화 - Multiple Project로 모듈화 공부하기 3편
·
📱 iOS/Xcode
지난 편에서 Library와 Framework의 차이와 Dynamic Library vs Static Library에 대해 알아보았고,본 편에서는 어떻게 저희 팀이 모듈화를 진행했는지 작성해보겠습니다 !! 총 3편의 시리즈로 구성되어 있습니다..! [모듈화 1편] Library와 Framework: https://kyxxn.tistory.com/148[모듈화 2편] Dynamic Library vs Static Library: https://kyxxn.tistory.com/149 그럼 레쯔고 〰️ 문제 상황우리 프로젝트에 클린 아키텍처를 도입했음4명의 팀원이 협업하는 과정에서 모듈화를 도입하여 클린 아키텍처의 각 계층을 잘 관리할 수 있게끔 하고자 함문제 해결모듈화를 결정한 이유Clean Architec..
[Xcode] Dynamic Library vs Static Library - Multiple Project로 모듈화 공부하기 2편
·
📱 iOS/Xcode
지난 편에서 Library와 Framework의 차이를 보았고,본 편에서는 Dynamic Library vs Static Library에 대해 알아보겠습니다 !! 총 3편의 시리즈로 구성되어 있습니다..![모듈화 1편] Library와 Framework: https://kyxxn.tistory.com/148 그럼 레쯔고 〰️ 문제 상황모듈화를 하면서 Library & Framework, Static & Dynamic에 대해 혼동이 왔음용어에 대한 개념 차이이전 포스팅 보러가기: Library vs FrameworkDynamic Library(Framework) vs Static Library(Framework)Target - General - Frameworks, Libraries, and Embedde..