샘성의 iOS 개발 일지

GCD API 동작 방식과 필요성에 대해 설명하시오. 본문

iOS/면접

GCD API 동작 방식과 필요성에 대해 설명하시오.

SamusesApple 2023. 5. 8. 12:24
728x90

 

GCD 란?

  Grand Central Dispatch의 줄임말로, 우리가 항상 UI를 그리는 작업을 메인 쓰레드에 요청할 때 사용하는 'DispatchQueue.main.async'의 DispatchQueue가 GCD에서 사용하는 큐의 이름이다.

GCD는 main queue, global queue, custom queue가 있다. global queue를 제외하고는 기본적으로, 직렬큐의 설정을 갖고 있다. 

동시큐는 여러개의 쓰레드에서 작업을 동시에 처리하게 하는 것이고, 직렬큐는 반대로, 하나의 쓰레드에서만 작업을 처리하는 방식이다.

 

  즉, 'DispatchQueue.main().async'를 해석하면, "GCD 중 메인 큐(하나에만)에 비동기적으로 00 일 좀 해줘"가 된다.

그렇다면 반대로, 'DispatchQueue.global().sync'는?  "GCD 중 글로벌 큐(여러개 쓰레드 사용)에, 동기적으로 일 좀 해줘"가 된다.

 

 동기(sync)한 작업은, 작업이 끝날때까지 기다린 후, 다음 작업을 하는 것이다. (결과값이 나오면 다음 작업 시작함)

반대로, 비동기(async)한 작업은, 작업이 끝날때까지 기다리지 않고, 다음 작업을 하는 것이다. (결과값이 나오든 말든 그냥 일만 계속 함)

 

 

 

 

GCD API 동작 방식?

  기본적으로 네트워킹을 요청하는 작업은 오래 걸리기 때문에 비동기적으로 일어나도록 설계 되어있다. 그러므로, 작업을 Operation으로 래핑한 다음에, Queue에 넣는다. Queue에서 남는 스레드에 작업을 배분하여 일을 시킨다(동시).

 

 

 

 

GCD 필요성

  수행할 작업을 클로저의 형태로 DispatchQueue에 추가하면 GCD가 스레드를 자동으로 생성하고 실행해주고 쓰레드를 관리해주기 때문에, 쓰레드 관리가 자동적으로 된다는 장점이 있다. 또한, 필요한 작업의 종류에 따라 동시, 직렬 그리고 동기, 비동기로 나누어서 처리할 수 있다는 이점이 있다.

 

  예를 들면, 로그인 버튼을 누르면 '유저 정보 유무 확인' - '네트워킹 통한 유저 프로필 사진 불러오기' - '로그인 완료 되면 메인화면 띄우기 / 로그인 안되면 경고창 띄우기' 라는 과정을 가정해볼 수 있다.  

 

  이럴 경우, 우리는 global queue에게 동기적으로 작업을 요청할 수 있다. 왜냐면, 정보 유무 확인 후에 유저 사진을 불러와야 하기 때문이다. 만약 처리가 끝나지 않음에도 해당 작업들을 전부 다 비동기적으로 처리하게 한다면, 쓰레드는 버튼 누르자마자 경고창부터 띄울지도 모른다... '유저 정보 유무 확인'이 끝나기도 전에 로그인이 안된다고 소리칠지도 모른다... 사실 경고창 띄우는 것조차 UI 작업이기에 그 전에 왜 main쓰레드에서 처리하지 않았냐고 개발자를 혼낼 것이다..ㅠ

 

  그리고 반대로, 네트워킹 작업을 메인 쓰레드에서 동기적으로 처리하게 된다면 앱이 멈췄다고 소리칠 것이다....

그러므로 수행해야 할 작업의 종류에 따라 다른 방식으로 처리할 수 있다는 이점이 있기에 GCD가 필요하다.

  

728x90