스레드…?

에타 컴퓨터 노예 비유 짤

Untitled

스레드 → 동시에 일을 할 수 있는 것의 단위. 정도로만 기억해주시면 됩니다. 네트워크 통신을 하기 전에는 대빵 노예(?)인 Main Thread가 모든 일을 다 하고 있었습니다.

요 사진은 SwiftUI이지만 가져왔습니다

요 사진은 SwiftUI이지만 가져왔습니다

네트워크 통신을 하시면서 한번이라도 이런 오류를 보신적이 있다면 잘하고(?) 계신겁니다. UI에 관련한 클래스들은 모두 메인스레드에서 동작해야 한다! 라는 뜻입니다.

그렇다면 메인 스레드 이외의 스레드가 필요한 이유는 뭘까요?

앞서 언급했듯이 이전까지 메인 스레드는 모든 일을 다 담당하고 있었습니다. 이 모든 일에는 UI를 그리는 일도 포함됩니다. 특히나 UI는 메인 스레드에서만 업데이트가 가능합니다. 그래서 시간이 좀 걸리는 네트워크 통신과 같은 동작도 메인스레드에게 시킨다면 네트워크 통신을 하는 동안에 다른 일을 못해서 앱의 화면이 멈출 수 있습니다.

비유를 해보자면 메인 스레드는 맥도날드 매장을 혼자 운영하는(🥲) ‘점장’이라고 해보겠습니다. 이 점장님은 일이 엄청 많습니다. 버거도 만들어야하고 콜라도 뽑고, 주문도 받고 등등등등…. 물론 너무 일을 잘하셔서 0.01초만에 일을 해치울 수 있습니다. 그런데 갑자기 이런 점장님께 왕복 10초가 걸리는 배달일을 시킨다면 어떻게 될까요? 그 10초동안 주문도 못받고 버거도 못만드는 불상사가 생기겠죠?

이와 마찬가지로 메인 스레드가 시간이 오래 걸리는 일을 맡게 된다면 다른 일이 모두 멈추게 되어서 효율이 좋지 않을겁니다. 모바일에서로 생각한다면 앞서 언급한대로 네트워크 요청을 보내고 앱이 아예 멈춰버리게 됩니다 🥲 만약 10초동안 통신을 한다면 사용자의 입장에서 10초동안 앱이 멈춰서 엄청 불편하겠죠?? 때문에 다른 직원에게 ‘배달’ 업무를 맡긴다 라고 생각해주시면 될 것 같습니다.

GCD - Grand Central Dispatch

GCD란 iOS에서 스레드를 관리하는 API입니다. 다만 직접적으로 쓰레드에게 일을 시키는 것은 아니고, 디스패치큐를 통해 작업을 분산해주고 이 쓰레드의 숫자를 관리해주는 녀석입니다.

Untitled

‘어떤 일을 누가 어떻게 할지 관리하는 것’ 정도로 기억해주시면 좋습니다

실생활에서 예를 들어보자면 맥도날드에서 직원들에게 일을 어떻게 시킬지 관리하는 매니저 라고 하면 이해가 더 쉬울것 같습니다.