이 포스트는 앨런(Allen)님의 강의 중 “iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해” 보고 공부한 내용을 정리한 포스트 입니다.



참고 자료

앨런(Allen)님의 강의 “iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해”



섹션 0



간단한 GCD / Operation 소개

  • iOS에서 대기행렬을 “Queue” 또는 “대기열”이라고 표현하며 크게 두 가지로 나뉨.

    • 1) GCD(Grand Central Dispatch) - Dispatch Queue

    • 2) Operation - Operation Queue

      • 작업 자체로는 Operation 라고 표현.
  • GCD / Operation

    • 직접적으로 스레드 관리 X, “Queue를 만들어 작업을 분산 처리.”

      • Queue(대기열/대기행렬) 안에 Tasks(작업들)을 넣어주기만 하면 iOS(Operating System)이 알아서 스레드를 생성하여 작업을 분배, 분산 처리한다.
    • GCD / Operation 을 사용하여 “시스템에서 알아서 스레드 숫자를 관리한다.”

      • 직접 스레드를 관리, 생성하는 것은 하드웨어나 일의 부하(load)와 같은 시스템에 대한 지식이 없이 사용시 오히려 앱이 느려질 수 있음.
    • 스레드 보다 더 높은 레벨/차원에서 일을 한다고 보면 됨.

    • 쉽게 다른 스레드에서 (오래 걸리는)작업들이 “비동기적으로 동작”하도록 만들어 줌.

      • 어떤 API들은 내부적으로 다른 스레드에서 비동기적으로 실행되도록 설계되어 있음.


Queue에 보내는 방법

// Code Example
DispatchQueue.global().async {
    // 작업 코드
    // 즉, 다른 스레드로 보낼 작업을 배치
}
  • 위 예시 코드는 “글로벌 큐에 비동기적으로 작업을 보내겠다.”라는 뜻이다.

    • 이 DispatchQueue 클로저 안에 들어가는 것은 “작업의 한 단위 이다.”

    • 즉, “{ }” 이 괄호 안에 들어가는 것이 “작업의 한 단위.”

      • 만약 작업이 2개이면 DispatchQueue로 보내는 코드가 2개가 되어야 한다. 한 괄호 안에 모든 작업을 넣어주면 X.
// 작업 당 DispatchQueue로 보내는 코드 예시

DispatchQueue.global().async {
    task 1
}

DispatchQueue.global().async {
    task 2
}
  • 작업의 단위 == “하나의 클로저” 안에 보내는 작업 자체가 묶이는 개념.

    • 작업의 단위가 중요한 이유는 한 클로저 안에 작업(task)에 관한 여러 중간 과정의 작업들이 있다고 가정하면 “하나의 클로저” 안에 묶여있는 작업들이니 모두 순서대로 이루어 진다.

      • 비동기적으로 작업을 처리하는 큐 안에 여러 줄의 코드가 써있다고 비동기적으로 중간 과정이 먼저 끝나는 중간 과정 작업의 순서대로 끝나는것이 아니고 하나의 클로저 안에 묶여있는 작업이므로 코드의 순서대로 작업이 처리되는 것이다.


GCD 와 Operation 의 차이점 (간략하게 설명)

  • GCD (Grand Central Dispatch)

    • = Dispatch Queue.

    • 간단한 일 (커뮤니케이션의 양).

      • 클로저로 묶을 수 있는 간단한 작업양
    • 함수를 사용하는 작업 (메서드 위주).

  • Operation

    • = Operation Queue.

    • 복잡한 일 (커뮤니케이션의 양).

    • 데이터와 기능을 캡슐화한 객체.

    • GCD를 기반으로 만들어진 기술.

      • GCD 기술 + 여러가지 기능 (취소 / 순서지정 / 일시중지(상태추적))

      • 2016년에 APPLE에서 발표한 기술.

      • GCD 에서 발전된 기술이라고 생각하면 됨.



마무리

  • GCD 또는 Operation 중 한 가지를 꼭 써야한다. 뭐가 더 중요하고 두 가지 중 이게 좋다 낫다 라는 개념은 없다.

    • 다만 프로젝트의 효율성과 적합성 등을 고려해 사용해야 한다.

    • 각각의 장단점 그리고 프로젝트의 적합성플 파악해 GCD를 사용할지 Operation을 사용할지 선택하면 된다.

    • 다만 Operation 은 Class 이기 때문에 Class 로 만들어 놓으면 재사용하기 편하다.