iOS/Swift 소식을 전해드립니다 💁
레츠스위프트 뉴스레터  제19호 2020년 11월 8일

 님을 위한 iOS / Swift 관련 소식을 모은 뉴스레터가 도착했습니다. 10월 둘째주 일요일 뉴스레터와 함께해요 👨‍👧‍👦
한국에도 아이폰 12와 12 프로가 출시됐습니다. 다들 그만 자랑해주세요 ㅎㅎ 왜냐하면 저는 아직 12프로 맥스를 기다리고 있기 때문입니다. 11월 둘째주 소식들을 살펴보시죠.

매월 둘째, 넷째주 일요일에 뉴스레터를 발행하고 있습니다. 
누구나 함께하는 뉴스레터 저장소 👉
메일링 리스트 가입은 가입하기 링크 주변에 소개해주세요 🤩
⌘ 애플 소식

애플이 올해 한다고 예고했던 것을 매달 이벤트로 쏟아내고 있습니다. 2020년 마지막 애플 이벤트 - One more thing으로 애플 실리콘 맥이 나올 것을 기대하고 있습니다. Big Sur RC 버전도 올라왔으니까요. 아참 애플이 이제 정식 배포 이전에 개발자들에게 배포되는 GM(Gold Master) 대신에 RC(Release Candidates)라는 표현을 쓰기 시작했습니다. 과연 이번주 수요일에 발표되는 첫 번째 애플 실리콘 맥은 무엇일까요? 
⏳ 레츠스위프트 테크토크
레츠스위프트 2020 - 테크토크를 진행합니다. 11월 30일 월요일부터 12월 4일 금요일까지 일주일 매일 저녁에 진행할 예정입니다. 행사 진행을 도와주실 준비위원회 모집이 완료되서 다음주부터 준비를 시작합니다 :)

> 일방적인 발표가 아니고, 테크토크에서 주제별로 함께 대화해주실 패널도 지원해주세요. >>> 패널 신청폼 (11월 15일 마감)
> 일반 참가자 모집은 곧 공지하겠습니다. 
🤹 스위프트 동시성 로드맵 요약
지난 2주동안 스위프트 포럼에서 가장 뜨거운 것은 바로 스위프트 동시성 로드맵이었습니다.

자연스럽게 애플 코어팀에서 주도하고 있으며, 크리스 레트너가 거의 3년전에 작성한 선언문(manifesto)보다 작은 범위에 집중하고 있습니다. 코어 내부에서 꽤 구체적으로 구현 방향을 잡고 시작했다는 의미입니다. 당장은 방향성에 대한 문서와 테스트 코드부터 PR이 올라왔을 뿐입니다. 컨트리뷰터들이 댓글로 다양한 관점에서 꽤 깊이있는 제안을 주고 받고 있습니다.

이번 로드맵의 목표는 다음과 같습니다.
  • 비동기 프로그래밍 표현을 사용할 때 쉽고 편리하게 하며
  • 스위프트 개발자가 활용할 수 있도록 언어 수준에서 도구와 기술을 제공하고
  • 컴파일 시점에 비동기 코드의 성능 향상을 도모할 수 있고
  • 불안정한 메모리 관리 방식처럼 데이터 레이스와 데드락을 제거하기

위의 작업은 두 단계로 진행될꺼라고 합니다. 우선 1단계에서는 async 문법과 actor 타입을 지원하도록 구현해서 코드를 개선할 수 있도록 합니다. 그 이후 2단계에서 데이터 레이싱 문제를 해결하기 위해서 actor 분리(isolation) 등 효율성을 개선한다고 하네요.
로드맵 문서상에는 for 반복문에서 병렬 처리처럼 2단계에서 해야할 것은 구체적으로 설명하지 않고 열어놓았습니다. 그래서 댓글에서 논의를 계속하다가 크리스 레트너가 지난 주말에 Protocol-based Actor Isolation 에 대한 제안 글을 올렸습니다.
https://docs.google.com/document/d/1OMHZKWq2dego5mXQtWt1fm-yMca2qeOdCl8YlBG1uwg/edit#
이 부분은 추가적으로 논의가 될 것으로 보입니다.

기본 문법 아이디어
비동기로 동작하는 다음과 같은 함수를 예제 코드로 살펴보죠.

예제 코드에 refreshQueue가 포함된 것처럼, 이번 논의에서 제안한 동시성의 상당 부분은 GCD(libDispatch 오픈소스)와 관련이 있습니다. 직간접적으로 동시성 코드가 DispatchQueue를 활용한다고 가정하고 있습니다.
여기서 refreshPlayers() 함수는 self.players에 값을 넣기 위한 refreshQueue에 async로 넘긴 비동기 함수이며, 끝난 시점을 알기 위해서 completion 핸들러를 호출합니다.

이런 비동기 함수를 앞으로는 이렇게 쓰고 싶다는 겁니다. 아래처럼 작성하면 위와 같은 코드로 동작하게 된다는 겁니다.

  • refreshPlayers() 함수는 async 함수 타입이 됩니다.
  • allPlayers() 함수도 async 함수 타입이며 completion 핸들러를 호출하는 대신에 값을 리턴합니다.
  • allPlayers() 앞에 await가 명시되어 있어서 완료될 때까지 멈춘다(suspended)는 의미가 됩니다.
  • await는 try처럼 표현식 앞에 한 번만 나타나고 멈출 수 있다는 의미입니다.
  • 클래스 속성에 접근할 때 self. 을 생략할 수 있습니다.
  • allPlayers와 players가 데이터 레이스가 생기지 않습니다.

여기에 덧붙여서 class PlayerRefreshController가 private queue를 가지면서 내부 속성을 해당 큐에서만 접근하도록 하기 위해서 actor 클래스를 제안합니다.

  • 이렇게 actor를 지정하면 클래스 내부에 private queue를 선언해서 모든 내부 상태를 접근할 때 내부 큐를 사용한다고 가정합니다.
  • 메소드 호출하면 큐에서 동작하도록 컴파일러가 동기화 작업을 관리하기 때문에 상태 관리를 빼먹는 불상사(?)를 막아줍니다.
  • 컴파일러가 동기화 최적화를 관리하면 다른 actor가 비동기 함수를 호출하는 것까지 고민하지 않아도 됩니다.

DispatchQueue.main에서 UI를 처리해야 하는 경우는 actor 중에서 특별한 UIActor가 처리하도록 지정할 수도 있습니다.

이렇게 선언하면 컴파일러가 확인해서, 이 클래스를 참조해서 호출하는 경우는 글로벌 UI Actor로 메인 스레드에서 동작하게 됩니다.

이와 관련된 보다 자세한 설명은 제가 작성한 스위프트 동시성 로드맵 블로그를 읽어보세요.
🇰🇷 국내 소식들
아쉽게도 이번주에도 국내 소식이 부족했습니다.
뉴스레터 저장소에 개인 블로그, 회사 기술블로그 등 한글 자료를 언제든지 댓글로 남겨주셔도 됩니다. 
✈️ 해외 소식들
해외 소식들을 비슷한 주제들이 많아서, 다음과 같이 묶어서 정리합니다.
📲회사에서 iOS 개발자들에게 홍보하고 싶은 내용이 있으신가요? 
news@letswift.kr 로 언제든지 문의해주세요. 
레츠스위프트 뉴스레터
http://letswift.kr
수신거부 Unsubscribe