조하~
여러분 잘 지내셨나요!!! 네.. 저는 잘 못지내고 있습니다 하하... SeSAC iOS 앱개발자 데뷔과정이 끝났기 때문... ㅠㅠ 정말 힘들었지만 즐거웠고 많은 걸 얻을 수 있었던 그런 시간이었어요. 2022년 최고의 선택!!! 아니 제 인생 통틀어서 최고의 선택이었습니다.
여튼!!! 저는 현재 이력서를 작성하고 그동안 밀렸던 블로그도 정리하고... 리팩토링도 하고... 그러고 있습니다... 네... 이제 시작인거죠 ㅠㅠ 여러분들은 2022년 꼭 마무리 잘하시길 바라겠습니다 :)
다름이 아니라 제가 Weekly Conference 때 GCD에 대해 발표했는데 블로그에는 정리를 안했더라구요??? 네... 그래서 정리해보려고 합니다. GCD에 대하여!!! 아마 한 편으로는 안 끝날듯 하고 이번 기회에 추가적인 개념들도 정리해보고 싶어서 여러편으로 나누어 포스팅할 예정입니다.(할... 수 있겠지?)
그럼 이제 시작할게요!!!
GCD 누구냐 넌...
GCD에 대해서 여러분들은 잘 아시나요? 동기/비동기 동시/직렬? 등 매 번 볼 때마다 새롭고... 헷갈리고... 그런 개념 중 하나인 것 같습니다. 하지만!!! 아시다시피 iOS개발을 하신다면 꼭 알고 넘어가야하는 정말 중요한 개념 중 하나라고 저는 생각합니다.
정말 중요한 개념... 그렇다면 GCD는 왜 나타났을까요? 왜!!! 도대체 왜!!! 나타나서 우리를 헷갈리게하고 힘들게 하는건지...(사실 GCD는 천사...) 네 그렇습니다. 오늘은 GCD의 등장배경에 대해서 알아보고자 합니다. 레쓰기릿🔥
GCD의 등장배경
GCD의 등장배경에 대해 알려면 우리는 동시성 프로그래밍 이라는 것에 대해 먼저 알아야합니다. 그렇다면 동시성 프로그래밍이란 무엇일까요? 가볍게 한 번 알아봅시다.
🔎 동시성 프로그래밍이란?
동시성 프로그래밍이란 말 그대로 우리가 컴퓨터로 한 작업을 하면서 다른작업도 동시에 할 수 있도록 해주는 것입니다.
예를들어 우리가 리그오브레전드라는 게임을 다운받는다고 합시다. 다운받는 도중에 우리는 유튜브나 블로그나 다른 작업들을 동시에 컴퓨터로 할 수 있습니다. 이게 바로 동시성 프로그래밍입니다. 별 거 없죠?ㅎㅎ 근데 과거엔 다운받는 도중엔 컴퓨터로 아무 작업을 할 수 없었다고해요... 그럼 정말 불편하겠죠???
이러한 불편함을 해결하기위해 동시성프로그래밍을 가능하게 해주는 것이 바로 쓰레드라는 녀석입니다. 네 그럼 이제 쓰레드에 대해서 한 번 살펴볼건데 그 전에 프로그램과 프로세스에 대해 잠깐 알아보고 가겠습니다.
✅ 프로그램? 프로세스?
혹시 메인쓰레드, 멀티쓰레드(백그라운드 쓰레드)에 대해서 한 번쯤 들어보셨을 겁니다. 그럼 도대체 쓰레드는 무엇일까요?
쓰레드란 프로세스 내에서 실행되는 여러 흐름의 단위라고 합니다.
그렇다면 여기서 프로세스는 무엇일까요??
프로세스는 우리가 코딩할 때 사용하는 Xcode, 노션, 크롬 등의 프로그램을 실행시켜 메모리에 올라간 것을 프로세스라고 합니다.
그렇다면 프로그램은 무엇일까요? 네 예상하셨듯 프로그램은 메모리에 올라가지 않은 그 자체를 의미합니다. 말로만 하면 이해가 어렵죠???... 예시를 한 번 들어봅시다. 제가 최근에 즐겨먹은 🍔슈비버거를 가지고 이야기를 해볼게요.
🍔슈비버거가 만들어지려면 빵, 새우패티, 쇠고기패티, 양상추, 소스 등이 필요하겠죠? 이런 재료들을 조합해 만드는 법 슈비버거의 레시피를 우리는 프로그램이라고 할 수 있습니다. 프로젝트를 진행하며 짠 단순코드를 이 레시피에 비유할 수 있겠습니다.
하지만 아시다시피 단순코드들만 가지고 우리가 아무것도 할 수 없는 것처럼 슈비버거 레시피만으로 우리는 맛있는 슈비버거를 먹을 수 없습니다. 레시피를 가지고 슈비버거를 만들어야 비로소 슈비버거를 먹을 수 있게되죠.
네 그겁니다. 레시피를 가지고 슈비버거를 만든 것 그걸 우리는 프로세스라고 할 수 있습니다. 우리가 작성한 코드들을 실행(빌드)시켜 메모리에 올라가 앱을 사용할 수 있는 상태를 이에 비유할 수 있겠습니다.
이 정도면 프로그램과 프로세스에 대해 이해가 되셨을까요???... 되셨을거라 믿구 쓰레드에 대해서 한 번 알아볼게요!!!
✅ 쓰레드란?
프로세스에 잠시 더 이야기해보면 프로세스는 코드, 데이터, 힙, 스택의 메모리구조를 가집니다. 그리고 각각은 역할을 가지는데 그림으로 살펴봅시다.
- 코드 : 실행 명령을 포함하는 곳
- 데이터 : static, 글로벌 변수를 담는 곳
- 힙 : 동적 메모리를 위한 영역(배열, String 등등)
- 스택 : 지역변수, 매개변수, 반환값 등의 데이터를 담은 영역
그리고 드디어 기다리던.. 쓰레드가 나올 차례인데요. 이 프로세스 안에 쓰레드가 존재할 수 있습니다. 그림으로 살펴봅시다.
이렇게 프로세스 안에 여러개의 쓰레드가 존재할 수 있고 쓰레드는 각각 개인적인 스택영역을 가지고 프로세스의 Code, Data, Heap 영역은 서로 공유하는 특징을 가지고 있습니다.
만약 이 쓰레드가 하나만 있으면 어떻게 될까요? 우리가 Xcode로 작업하고나서 빌드를 누르는 순간 Xcode에서 빌드 끝날 때 까지 어떤 작업도 할 수 없게 됩니다. 빌드 중인 화면만 계속 쳐다봐야 하는거죠.... 그리고 과거엔 이 멀티쓰레드를 지원하지 않아 한 작업을 하는 동안 다른 작업을 하지 못했다고 합니다.
하지만 요즘은 멀티쓰레드를 대부분 지원하죠. 한 작업을 하는동안 다른 작업을 못한다면 너무 불편하니까요!!! 현대엔 멀티쓰레드로 작업할 수 있게 프로그래밍하는 것은 필수적!!!이라고 해요.
그렇다면 멀티쓰레드로 작업되는 것은 그냥 알아서 자동으로 되는걸까요? 물론 아닙니다!!! 우리 개발자들이 스레드를 만들고 직접 관리해주어야합니다...(코드로 ㅎㅎ) 정확히 표현하자면 커널단에서 만들어 놓은 쓰레드를 가져와 처리해줘야합니다.
✅ 멀티쓰레드 작업은 어렵다!!!
멀티쓰레드 작업이 가능하게 하려면 개발자는 여러개의 쓰레드를 만들고 1번 쓰레드에는 이 작업, 2번 쓰레드에는 저 작업을 지정해줘야합니다.
서로 공유된 자원일 경우에는 문제가 없을 수 있도록 1번 쓰레드가 가서 일하고 그 동안 2번 쓰레드는 자원에 접근할 수 없도록 막아주고 끝나고 나서 2번 쓰레드가 자원에 접근할 수 있도록 하는 등의 처리를 해주어야합니다.
만약 동시에 공유된 자원에 접근하면 데이터가 이상하게 변형되거나 손실 및 유실 될 수도 있습니다.
아니.. 하나만 제대로 동작하게 하는 것도 어려운데 어떻게 여러개가 동시에 잘 작업되게 만들죠???... 네... 실제로 멀티쓰레드로 작업되게 프로그래밍하는 것은 굉장히 복잡하고 어렵다고 합니다.
멀티쓰레드 프로그래밍을 하는데 실수를하면 어떻게 되는지 한 번 예시를 들어볼게요. 이번에도 🍔슈비버거인데 슈비버거를 주문했을 때 어떻게 작업이 되는지에 대해 이야기해보겠습니다.(카운터 직원, 배달 직원, 그릴 직원을 쓰레드에 비유했습니다.)
😁 정상적으로 멀티쓰레드 작업이 된 경우
먼저 카운터쓰레드가 배달 온 것을 확인하고 주문을 수락합니다.
다음 카운터쓰레드는 배달쓰레드에게 배달대기 명령을 내립니다.
그리고 그릴쓰레드에게 주문이 들어온 슈비버거를 만들어달라고 명령하죠.
그러면 그릴쓰레드는 각각 버거를 만들고 전달하고 포장까지의 작업을 하게되죠.
그리고 포장이 끝나면 배달쓰레드에게 전달하면 배달쓰레드는 슈비버거를 배달하러 갈겁니다. 이 같은 경우는 각각의 쓰레드가 각자의 역할을 잘 수행해 햄버거를 배달까지 갔으므로 멀티쓰레드 프로그래밍이 잘 되어있는 상태라고 말 할 수 있습니다. 그렇다면 아닌 경우는 어떻게 될까요?
😇 멀티쓰레드 작업하는데 실수한 경우
카운터쓰레드가 배달을 수락하고 배달쓰레드는 배달대기를하고 카운터 쓰레드가 다시 그릴쓰레드에게 슈비버거를 만들어달라고 명령합니다.
하지만 이번엔 개발자가 실수를해서 그릴쓰레드1이 패티를 다 넣기도 전에 그릴쓰레드2가 와서 포장을 해버립니다.
그리고 그릴쓰레드2는 패티를 빠트렸지만 햄버거가 완성되었다고 배달쓰레드에게 말해버리고 결국 새우패티가 없는 슈비버거가 배달가게 되는거죠.
햄버거라는 공유된 자원에 그릴쓰레드1,2 가 접근하는데 처리를 잘못해주어 슈비버거가 변형되었습니다. 위에서 말한 데이터가 변형되거나 손실 및 유실된 상태를 이에 비유할 수 있을겁니다.
네... 새우패티가 빠진 슈비버거... 말만 들어도 정말 끔찍하네요. 😂😂
쓰레드마다 정확한 작업들을 부여하고 조건에 따라 처리하는 것 그리고 동적으로 필요할 때마다 쓰레드를 가져와서 사용하는 것을 개발자가 다루는 것은 복잡하고 어려운작업입니다.
개발자가 기대한 결과는 왼쪽 그림처럼 하나당 한 작업을 딱 맞춰서 줬다고 생각했지만!!! 현실은 오른쪽 그림처럼 되는 것이죠...
그리고 이런 복잡하고 어려운 멀티쓰레드 프로그래밍을 개발자가 간편하게 할 수 있도록 도와주는 것이 바로 애플에서 만든 GCD입니다.
네 드디어 마지막에 GCD가 등장했습니다... GCD는 사실 멀티쓰레드 프로그래밍의 어려움을 해결해주기 위해 나온 정말 착한 친구였습니다ㅎㅎ 이에대해 공부하고 DispatchQueue를 쓸 때마다... 고맙더라구요 네...
여튼!!! 여기까지 GCD의 등장배경에 대해 알아보았습니다. 갑자기 GCD가 딱 있는게 아니더라구요. 이런 등장배경이 있었다 가볍게 알고 가시면 좋을 것 같습니다. 정리하자면 GCD는 천사!!!
📌 정리
- GCD는 멀티쓰레드 프로그래밍의 어려움을 해결하기위해 만들어진 라이브러리(착한 친구)
다음 글에선 본격적으로 GCD를 스위프트에서 어떻게 쓸지!!! 동기/비동기, 직렬/동시에 대해 이야기해보도록 하겠습니다!!! 그럼 이만!!! 다음시간에 만나요~~~
'iOS' 카테고리의 다른 글
[iOS] - UI작업은 왜 메인스레드에서 이루어져야하나 (0) | 2022.12.29 |
---|---|
[iOS] GCD 누구냐 넌 - 2. sync/async & main/global (0) | 2022.12.29 |
[iOS] - Realm 마이그레이션 정리 (0) | 2022.10.13 |
[iOS] - Push Notification(feat. Firebase) (0) | 2022.10.11 |
[iOS] Map Kit View 사용하기 - 1 (0) | 2022.08.11 |