
[Swift 심화 #4] 구조적 동시성, Task를 함부로 열면 안 되는 이유
구조적 동시성은 비동기 작업의 끝을 누가 책임지는가에 답합니다. 자식 작업이 부모 스코프를 벗어나지 못하는 원리와 취소 신호가 전파되는 방식, Task.detached를 쓸 때 수동으로 되사야 하는 보장을 정리했습니다.
읽어보기BUILD · 105 ARTICLES
Swift 언어와 iOS 생태계를 원리부터 실전까지 파고듭니다.

구조적 동시성은 비동기 작업의 끝을 누가 책임지는가에 답합니다. 자식 작업이 부모 스코프를 벗어나지 못하는 원리와 취소 신호가 전파되는 방식, Task.detached를 쓸 때 수동으로 되사야 하는 보장을 정리했습니다.
읽어보기
카테고리는 ivar를 추가할 수 없지만 Associated Objects로 값을 매달 수 있습니다. 객체 옆 사이드 테이블에 저장되는 원리와 카테고리 프로퍼티 완성형, assign만 조심하면 되는 메모리 정책을 정리했습니다.
읽어보기
Swift 6 모드를 켜면 쏟아지는 동시성 에러의 주인공은 Sendable입니다. 값이 격리 경계를 넘어도 되는지 묻는 이 프로토콜의 의미와, struct화·불변화·actor 승격 순으로 밟는 마이그레이션 처방을 정리했습니다.
읽어보기
actor는 자기 상태를 스스로 지키는 네 번째 타입 종류입니다. 동시 접근을 줄 세워 데이터 레이스를 컴파일러가 잡는 문제로 바꾸는 원리와, 가장 유명한 함정인 재진입(reentrancy)까지 정리했습니다.
읽어보기
델리게이트와 클로저는 같은 콜백 요구를 처리하지만 결이 다릅니다. 같은 예제를 나란히 구현해 드러나는 다섯 가지 실질 차이와, 이벤트 개수·관계 수명·반환값 필요 여부로 고르는 기준을 정리했습니다.
읽어보기
반복 NSTimer는 target을 강하게 참조해 invalidate() 전까지 뷰컨트롤러가 해제되지 않습니다. 순환 참조가 만들어지는 구조와 블록 기반 API, 생명주기 invalidate, weak proxy 세 해법을 정리했습니다.
읽어보기
await에서 멈추는 것은 스레드가 아니라 함수입니다. 함수가 상태를 힙에 저장하고 스레드를 협력형 풀에 반납하는 suspension의 정확한 의미와, 순차 await가 병렬 실행이 아닌 이유를 정리했습니다.
읽어보기
Factory는 의존성 등록 누락을 컴파일 타임에 잡아내는 Swift DI 라이브러리입니다. 2026년 7월 기준 3.3.1로 기본 사용법과 스코프 선언, 테스트·프리뷰 주입, Swinject와의 차이를 정리했습니다.
읽어보기
\.name은 map의 축약 문법이 아니라 KeyPath라는 독립 타입의 값입니다. 프로퍼티 접근을 값으로 만든다는 말의 뜻과 읽기 전용·값 타입 쓰기·참조 타입 쓰기 세 계층, 실무 활용처를 정리했습니다.
읽어보기
프로토콜 지향 프로그래밍(POP)은 무엇을 상속받았는지가 아니라 무엇을 할 수 있는지로 타입을 설계합니다. 상속이 막히는 지점과 프로토콜 조합으로 푸는 방법, 피해야 할 경우까지 Swift 예제로 정리했습니다.
읽어보기
프로퍼티 래퍼는 SwiftUI 문법이 아니라 Swift 5.1에 SE-0258로 들어온 언어 기능입니다. 컴파일러가 @Clamped를 어떻게 번역하는지, wrappedValue와 projectedValue($)의 정체, 남용 경계를 정리했습니다.
읽어보기
RIBs는 앱을 화면이 아니라 비즈니스 로직 단위로 쪼갭니다. 화면 없는 조각이 존재한다는 전제와 초대형 조직에서만 쓰이는 이유, VIPER와 무엇이 다른지를 정리했습니다.
읽어보기
Codable 자동 합성이 실제로 무엇을 만들어주는지부터, 실무에서 반드시 만나는 키 이름 불일치·날짜 포맷·중첩 구조·부분 실패 네 상황의 표준 처방과 DecodingError 디버깅까지 정리했습니다.
읽어보기
메서드 스위즐링은 셀렉터와 IMP를 잇는 연결표를 런타임에 맞바꾸는 기법입니다. 관례적인 구현 전체와 _cmd가 거짓말을 하는 부작용, 어디까지 써도 되는지의 경계를 정리했습니다.
읽어보기
Swift 5.5 이상에서는 테스트 함수를 async로 선언하고 await로 결과를 기다린 뒤 검증하면 됩니다. 에러 검증, 오래된 콜백 API 테스트, expectation을 아직 써야 하는 경우까지 정리했습니다.
읽어보기
연관 타입(associatedtype)은 프로토콜에 뚫린 타입 빈칸입니다. 그 유명한 generic constraint 에러가 났던 이유와 SE-0309·SE-0346으로 제약이 풀린 과정, primary associated types 활용법을 정리했습니다.
읽어보기
map·filter·compactMap·flatMap·reduce 다섯 함수의 구분은 클로저가 무엇을 반환하느냐로 갈립니다. for 루프와의 선택 기준, 체이닝이 만드는 중간 배열, lazy 시퀀스가 푸는 문제를 정리했습니다.
읽어보기
ReactorKit은 UIKit과 RxSwift 조합에서 단방향 데이터 흐름을 표준처럼 만든 프레임워크입니다. View와 Reactor 두 역할, Mutation이라는 중간 단계가 필요한 이유, TCA와의 차이를 정리했습니다.
읽어보기
Swift 5.6 이후 코드를 보면 프로토콜 이름 앞에 some 아니면 any가 붙어 있습니다. some View, any Error, some Collection. 예전엔 프로토콜 이름을 그냥 타입 자리에 썼는데, 이제 컴파일러가 any를 붙이라고 경고하거나 에러를 냅니다.…
읽어보기
자료구조 공부를 시작하면 가장 먼저 만나는 두 형제가 스택(Stack)과 큐(Queue)입니다.
읽어보기
iOS 아키텍처 시리즈를 여기까지 따라오셨다면, 이제 선택지는 다 펼쳐졌습니다. MVC, MVVM, MVP, VIPER, 클린 아키텍처, MV, TCA까지요.
읽어보기
코드 리뷰에서 "이 클래스에 final 좀 붙여주세요" 같은 말, 한 번쯤 들어보셨을 거예요.
읽어보기
iOS 개발하면서 테스트 코드 짜다 보면 XCTest에 슬슬 답답함을 느끼는 순간이 옵니다.
읽어보기
SwiftUI 시대의 아키텍처 논의에서 빠지지 않는 이름이 하나 있습니다. Point-Free가 만든 TCA(The Composable Architecture)입니다.
읽어보기
Swift 코드에서 꺾쇠괄호 <T>를 처음 만나면 눈이 한 번 멈춥니다. 함수 이름 옆에 웬 대문자 알파벳이 붙어 있고, 문서를 열면 func map<T>( transform: (Element) -> T) -> [T] 같은 시그니처가 기다리고 있죠. 제네릭은 Swift 중급의…
읽어보기
채용 공고나 기술 블로그에서 "클린 아키텍처 기반"이라는 문구를 자주 보게 됩니다. 그런데 막상 코드를 열어보면 팀마다 모습이 제각각이에요. UseCase가 있는 곳도 있고 없는 곳도 있고, Repository의 역할도 다 다릅니다.
읽어보기
메서드 스위즐링 코드는 왜 하나같이 +load 안에 들어 있을까요? 비슷해 보이는 +initialize에 넣으면 안 되는 걸까요?
읽어보기
클로저 편에서 [weak self]로 순환 참조를 끊는 법을 다뤘을 때, 한 가지 질문을 미뤄뒀습니다. weak 말고 unowned도 있던데, 뭐가 다르고 언제 쓰는 걸까요. 이 질문에 답하려면 그 아래 층, ARC가 실제로 어떻게 돌아가는지부터 봐야 합니다.
읽어보기
iOS 앱 규모가 커지면서 의존성 관리 때문에 골치 아파진 적, 한 번쯤 있으실 거예요.
읽어보기
Swift 관련 글이나 릴리스 노트를 읽다 보면 SE-0296, SE-0345 같은 코드가 자꾸 등장합니다. async/await를 소개하는 글엔 SE-0296이, if let name 축약 문법 얘기엔 SE-0345가 붙어 있죠. 이 번호의 정체가 뭘까요.
읽어보기
iOS 크래시 로그에서 가장 자주 만나는 문장 중 하나가 unrecognized selector sent to instance입니다.
읽어보기
OOP 공부하다 보면 캡슐화라는 말은 백번쯤 듣는데, 막상 "그래서 코드로 어떻게 하는 건데?" 물으면 말문이 막히는 순간이 있어요. 개념은 알겠는데 손이 안 나가는 거죠.
읽어보기
Objective-C나 Java를 먼저 배우고 Swift로 넘어오면 꼭 한 번 걸리는 지점이 있어요.
읽어보기
iOS 앱 만들다 보면 꼭 마주치는 순간이 있어요. 화면 하나에 로딩 중, 성공, 실패, 빈 데이터 상태가 뒤섞이는 순간이요.
읽어보기
게임 이펙트를 잔뜩 뿌리는 화면을 만들다 보면 프레임이 뚝뚝 끊기는 순간이 옵니다.
읽어보기
Swift에는 이상한 공존이 있습니다. 프로그래밍을 처음 배우는 사람이 Playgrounds에서 print("Hello") 한 줄로 시작하는 언어인데, 같은 언어로 제네릭과 매크로가 뒤엉킨 표준 라이브러리가 짜여 있어요. 초등학생용 코딩 교육 앱(Swift…
읽어보기
Swift 표준 라이브러리를 열어보면 눈에 띄는 사실이 하나 있습니다. Int, Double, Bool 같은 기본 타입은 물론이고 String, Array, Dictionary, Set까지 전부 struct입니다. 다른 언어에서 당연히 클래스였던 것들이 Swift에서는 죄다 값…
읽어보기

Swift로 코드를 쓰다 보면 한 번쯤 궁금해지는 순간이 옵니다. 옵셔널은 왜 이렇게 깐깐할까, 배열은 왜 복사될까, guard는 왜 있을까. 이런 질문들을 하나씩 파고들다 보면 결국 한 지점에서 만나게 됩니다. Swift가 처음부터 내걸었던 세 가지 목표, Safe(안전하게),…
읽어보기


iOS 개발 공부를 하다 보면 어느 시점에 반드시 RxSwift나 Combine이라는 벽을 만나게 됩니다. 채용 공고에는 빠지지 않고 등장하는데, 막상 코드를 열어보면 map, flatMap, sink가 줄줄이 이어지는 낯선 문법에 당황하기 쉽습니다. "그냥 클로저랑…
읽어보기


iOS 개발을 하다 보면 남의 코드에서 init(...) 대신 static func make(...) 같은 걸 만나고 갸웃했던 적 있으실 거예요.
읽어보기
모듈화 시리즈를 따라 모듈을 수십 개까지 늘려 본 팀이라면, 새로운 종류의 피로를 만나게 됩니다.
읽어보기
iOS 아키텍처 이야기에서 VIPER만큼 평가가 극단적으로 갈리는 패턴도 드뭅니다.
읽어보기
디자인 패턴 책을 펼치면 늘 마지막쯤에 등장하는 게 인터프리터 패턴이에요. "이게 대체 언제 쓰이나" 싶어서 대충 넘기기 쉬운 패턴이죠.
읽어보기
SwiftUI로 앱을 키우다 보면 의존성 주입이라는 말만 들어도 괜히 어깨가 움츠러들기 쉬워요.
읽어보기
iOS 개발을 하다 보면 "테스트 코드 좀 짜야 하는데…" 하면서 자꾸 미루게 되죠. 막상 XCTest를 열어보면 뭐부터 손대야 할지 감이 안 오거든요.
읽어보기
코드 한 줄 고치고 빌드 버튼을 눌렀는데 몇 분씩 기다려 본 경험, iOS 개발자라면 누구나 있을 겁니다.
읽어보기
Objective-C에서 이 코드를 실행하면 결과가 꽤 의외입니다.
읽어보기
iOS 아키텍처 면접에서 단골로 나오는 질문이 있습니다.
읽어보기
Objective-C 코드에서 대괄호로 감싼 [receiver message] 구문, 겉보기엔 그냥 메서드 호출처럼 보입니다.
읽어보기

다른 언어를 쓰다 Swift로 넘어온 개발자가 가장 어리둥절해하는 지점 중 하나가 문자열입니다. text[0]이 안 되고, text[2..<5]도 안 되고, 인덱스라는 별도 타입을 만들어서 text.index(text.startIndex, offsetBy: 2)라고 써야 해요.…
읽어보기


iOS 개발하다 보면 도형이든 노드든, 종류가 여러 개인 객체에 연산을 계속 얹어야 하는 순간이 옵니다.
읽어보기
비슷한 로직을 클래스마다 복붙하다가 "이거 뭔가 잘못됐는데" 싶었던 적 있으신가요? iOS 앱에서 화면별 데이터 로딩 코드를 세 번째 복사할 때쯤이면 손이 멈추게 되죠.
읽어보기
Swift로 앱을 만들다 보면 for item in array 같은 반복문을 하루에도 수십 번 씁니다. 워낙 자연스럽게 쓰다 보니, 커스텀 타입을 for-in으로 돌리려다 컴파일 에러를 만나고 나서야 궁금해지곤 하죠. "이 반복문, 대체 안에서 무슨 일이 벌어지는 거지?"
읽어보기
Swift로 iOS 앱을 만들다 보면 버튼을 눌렀는데 왜 이 뷰컨트롤러가 이벤트를 받는 걸까 궁금했던 순간이 다들 있으실 거예요.
읽어보기

앞선 모듈화 시리즈에서 경계·의존 방향·레이어 구조까지 원론을 정리했습니다. 이제 iOS 프로젝트에 실제로 적용할 차례입니다.
읽어보기
코드 리뷰에서 자주 오가는 지적 중 하나가 "이거 guard로 바꾸죠"입니다. if로도 똑같이 동작하는 코드인데 왜 굳이 바꾸자는 걸까요. 취향 문제 같지만, 사실 guard는 Swift가 언어 차원에서 특정 코드 스타일을 밀어주기 위해 만든 문법입니다. 조기 탈출(early…
읽어보기
Swift 에러 처리를 배우다 보면 도구가 너무 많다는 인상을 받게 됩니다. throws와 do-catch, try에 붙는 물음표와 느낌표, 거기에 Result 타입까지. 어떤 API는 에러를 던지고, 어떤 API는 Result를 돌려주고, 어떤 코드는 그냥 try?로 뭉개고…
읽어보기

앱을 만들다 보면 "실행 취소 버튼 하나만 넣어달라"는 요청이 생각보다 자주 들어옵니다.
읽어보기
앱을 만들다 보면 비슷비슷한 객체를 수천, 수만 개씩 찍어내야 할 때가 있어요. 지도 위에 마커를 수만 개 뿌리는 기능이 대표적인데, 이런 상황에서는 메모리 그래프가 계속 치솟기 쉽습니다.
읽어보기
배열을 복사해서 새 변수에 담았습니다. 복사본만 고쳤는데 원본까지 바뀌어 있네요. 프로그래밍하다 한 번은 꼭 만나는 미스터리입니다.
읽어보기
프로토타이핑 도구로 만든 화면은 그럴듯하게 "보이기만" 합니다. 버튼을 눌러도 미리 연결해 둔 화면으로 넘어갈 뿐, 데이터가 실제로 저장되지도, 서버와 통신하지도 않죠. 그래서 아이디어를 검증하려면 결국 누군가 코드를 짜야 했습니다.
읽어보기
이 글은 Swift 기초 시리즈 3편입니다. 프로퍼티 다섯 종류를 문법 나열이 아니라 선택 기준 중심으로 정리합니다. 핵심 질문은 하나예요. 이 값은 저장되는가, 계산되는가, 그리고 언제 만들어지는가.
읽어보기

iOS 개발하다 보면 이런 순간이 옵니다. 기본 기능은 그대로 두고 로깅 하나만, 캐싱 하나만 얹고 싶은데, 그걸 하려고 클래스를 상속받기 시작하면 어느새 상속 트리가 엉망이 되어 있죠.
읽어보기
폴더 안에 폴더, 그 안에 또 파일. 이런 트리 구조를 코드로 다뤄본 분이라면 한 번쯤 막막했을 거예요.
읽어보기

"메서드 시그니처가 뭔가요?"라는 질문을 받으면 대부분 "메서드의 이름이랑 파라미터... 그런 거요"라고 얼버무리게 됩니다.
읽어보기
SwiftUI 소개 문서 첫 줄에는 어김없이 "선언형(declarative) 프레임워크"라는 말이 나옵니다. React도, Jetpack Compose도 자신을 선언형이라 부르죠.
읽어보기

Swift로 객체를 복사하다가 "이게 진짜 복사된 게 맞나?" 하고 멈칫한 적 있으신가요.
읽어보기
오버로딩과 오버라이딩. 이름이 이렇게까지 비슷할 일인가 싶은 두 개념입니다.
읽어보기

Swift를 배울 때 처음 만나는 관문이 옵셔널입니다. String?의 물음표, if let, guard let, !, ??. 문법 종류가 많아서 각각을 따로 외우다 보면 규칙이 뒤죽박죽되기 쉽습니다.
읽어보기

Swift로 앱을 만들다 보면 객체 생성하는 코드를 하루에도 수십 번은 쓰게 됩니다.
읽어보기

레거시 API 코드, 지우지도 못하고 그대로 쓰지도 못해서 답답했던 적 있으시죠?
읽어보기
Swift 코드에서 클로저는 공기 같은 존재입니다. 정렬 조건, 네트워크 완료 핸들러, 버튼 액션, SwiftUI의 body까지, 중괄호 블록을 넘기는 코드가 하루에도 수십 번 등장하죠. 그런데 정작 "클로저가 값을 캡처한다는 게 정확히 무슨 뜻인가", "[weak self]는…
읽어보기

지난 편에서 Massive View Controller가 생기는 이유를 다뤘습니다. 뷰컨트롤러가 View와 Controller를 겸하는 바람에, 갈 곳 없는 코드가 전부 그리로 몰린다는 이야기였죠.
읽어보기
iOS 개발을 하다 보면 델리게이트 패턴은 정말 지겹도록 만나게 됩니다.
읽어보기


iOS 앱 만들다 보면 이런 순간이 꼭 옵니다. A 화면에서 뭔가 바뀌었는데, 저 멀리 떨어진 B 화면도 같이 갱신돼야 하는 상황이요.
읽어보기




Swift 개발을 하다 보면 static let shared 한 줄로 만드는 싱글톤을 정말 자주 만나게 됩니다.
읽어보기
iOS 개발을 시작하면 누구나 한 번쯤 궁금해합니다. "애플은 잘 쓰던 Objective-C 놔두고 왜 굳이 Swift를 새로 만들었을까?" 하고요.
읽어보기



iOS 개발 공부를 시작하면 꼭 한 번 마주치는 언어가 있어요. 대괄호가 잔뜩 들어간 낯선 문법, NSString 같은 알 수 없는 접두어.
읽어보기
Swift로 앱을 만들다 보면 do-catch로 에러를 잡았는데, 정작 화면에 띄울 메시지가 영 시원찮았던 경험 있으실 거예요.
읽어보기