[내일배움캠프 46일차] 앱 개발 심화1

NH·2025년 5월 7일

내일배움캠프

목록 보기
46/62
post-thumbnail

앱 개발 심화 과정 시작

CH 3-5 iOS 앱 개발 심화주차는

  • 이번 주차는 CRUD(데이터 생성, 읽기, 수정, 삭제)를 숙달하고, 앱의 구조를 체계적으로 설계하는 방법과 효율적으로 기능을 구현하는 방법을 배운다.
  • 심화 과정이 시작되면서 새로운 팀으로 편성 되었다
  • 팀 이름은 퍼스트 파티
  • 오늘부터 심화과정 강의를 듣고 TIL로 정리할 예정이다!

👨‍💻 iOS 앱 개발 심화 강의

1. Xcode Instruments

  • Xcode 에서 제공하는 앱의 성능 분석 및 디버깅 도구
  • 앱 개발자라면 메모리 릭이 나지 않는 앱을 개발해야하므로, 메모리 릭에 대한 분석을 할 때 Xcode Instruments 를 활용하면 좋음
  • Xcode Instruments 를 통해서 성능 분석, 메모리 릭 분석을 할 수 있음
  • 이번 강의에서는 Xcode Instruments 를 활용해서 메모리 릭을 잡아내는 공부를 해봅니다.
  • 메모리 릭 분석을 하면서 스택 트레이스(Stack Trace) 도 함께 확인 가능

Stack Trace

  • 스택(Stack)을 추적(Trace)한다.
  • 코드를 실행하면 스택에 쌓이면서 코드를 수행하게 된다. 이를 콜 스택(Call Stack) 이라 함.
  • 코드를 콜 한 순서를 알 수 있는 스택.
  • 이 스택을 뒤돌아보며 코드가 수행된 기록을 훑어보는 것을 스택 트레이스라고 한다.

프로파일링

  • 앱의 성능을 분석하고 최적화하는 과정을 프로파일링(Profile) 이라고 한다.

Xcode Instruments 로 메모리 누수 잡기

  • 순환 참조가 발생하는 코드를 사용
    ClassAClassB 가 서로를 순환 참조하도록 설정

  • ProductProfile 클릭하면 Xcode Instruments 열림
  • 초록생 체크 표시 : 메모리 누수 X
  • 빨간색 X 표시 : 메모리 누수 발생

  • 어떤 객체가 메모리 누수를 발생시키는지 확인 가능
  • 오른쪽에 Stack Tree 확인 가능

  • Cycles & Roots 선택 시, 어떻게 참조가 되었는지 그래프로 보여줌

  • 아래 Call Tree 에서 Invert Call Tree , Hide System Libraries 클릭하면 콜 스택 쉽게 확인 가능
  • 콜스택 아래서부터 순서대로 시작
    AppDelegate 에서 앱 시작ViewController.buttonTapped(_:) 실행ClassA 에서 메모리 릭 발생

2. 동기, 비동기

프로세스와 스레드

  • 프로세스: 실행중인 프로그램을 프로세스라고 한다.
    - 즉, 실행하기 위해 메모리 위에 올라온 프로그램을 프로세스라고 한다.
    - iOS 앱 개발을 했을 때의 결과물인 도 iOS 운영체제에 속한 프로그램 이다.
    - iOS 앱을 실행하면 프로세스 라고 부를 수 있다.

  • 스레드: 프로세스 내에서 작업을 수행하는 단위.
    • 한 개의 프로세스 내에서 여러개의 스레드가 동시에 작업을 수행할 수 있다.
    • 즉, 실행중인 iOS 앱을 프로세스 라고 표현하므로 iOS 앱이 실행중일때 여러가지 스레드가 동시에 일을 한다.
    • 크게 메인 스레드와 백그라운드 스레드로 구분할 수 있다.
    • 여러 개의 스레드를 가지고 동시에 작업을 하는 것을 멀티 스레딩이라고 한다.
    • Thread = 쓰레드 라고도 함.

동기, 비동기

  • 동기 = synchronous = sync
    어떤 스레드에서 작업 A 를 처리하다가 새로운 작업 B 가 들어오면,
    그 작업 B 을 수행하고 완료될때까지 기다렸다가 다시 작업 A 를 수행하는 작업 처리 방식.
    직렬적으로 작업을 수행

  • 비동기 = asynchronous = async
    어떤 스레드에서 작업 A 를 처리하다 새로운 작업 B 가 들어오면,
    다른 스레드에 작업 B 를 넘기고, 수행하고 있던 작업 A 는 멈추지 않고 병렬적으로 동시에 수행하는 작업 처리 방식. 작업 B 가 완료되면, 완료되었다는 결과와 소식을 전해받는다.
    병렬적으로 작업을 수행

    예를 들어 어떤 스레드에서 UI 를 그리는 작업을 하다가, 네트워크 통신을 해서 어떤 데이터를 받는 작업이 새로 들어왔다고 가정해보면,

    • 동기적으로 작업 수행
      UI 를 그리다가 멈추고, 네트워크 통신 작업을 한 뒤 서버에서 결과가 도착했을 때 다시 UI 그리는 작업 시작.

    • 비동기적으로 작업 수행
      UI 를 그리다가, 네트워크 통신 작업이 들어오면 다른 스레드에 작업을 넘기고 UI 작업은 이어서 계속 수행. 서버 결과가 돌아왔을 때 응답을 돌려받음.
  • 앱에서 처리해야할 여러가지 작업들을 모두 하나의 스레드에서 동기적으로 처리한다면, 앱의 성능이 매우 떨어지게 될 것입니다. 따라서 개발자는 반드시 동기/비동기 개념과 스레드의 개념에 대해서 이해해야 된다.


DispatchQueue, GCD 개념

▪️ GCD (Grand Central Dispath)

https://developer.apple.com/documentation/DISPATCH

  • 애플 공식문서에서 Grand Central Dispatch (GCD) 는 동시성 프로그래밍을 돕는 프레임워크라고 명시하고 있다.
  • iOS, macOS, watchOS 등등에 사용할 수 있는 동시성 프레임 워크. 동시성 프로그래밍이란 여러가지 일을 동시에 작업하도록 하는 프로그래밍을 의미.
  • 그 중에서 Swift 에서 사용하는 GCD 기술로 Dispatch Queue 가 있다. 즉 GCD 안에 DispatchQueue 가 포함되는 개념.

즉, 여러 가지의 스레드를 가지고 멀티 스레딩 작업을 하며, 비동기적으로 여러가지 작업을 수행하기 위해서는 Dispatch Queue 를 사용하면 된다.

DispatchQueue

  • Dispatch: 보내다, 발송하다.
  • Queue: 큐. 자료구조 중 큐를 의미.

그러면 Dispatch Queue 라는건 어디론가 보내기 위한 큐를 의미하는데 이건 무슨 뜻일까?

  • 큐 (Queue) 의 개념

    • 여러가지 자료구조 중 하나로, 먼저 들어온 데이터가 먼저 나간다는 특징을 가짐. (선입선출)
    • 우선순위 큐 (Priority Queue) 는 데이터가 나가는 우선순위 규칙을 부여하고, 우선순위에 따른 순서대로 데이터를 내보냄.
    • 쉽게 생각하면 데이터를 집어넣고, 내부 규칙에 따른 순서대로 데이터를 내보내는 자료구조.

▪️ 과거

  • 과거 프로그래밍에서는 멀티 스레딩, 비동기 작업을 하기 위해서는 개발자가 직접 스스로 판단한 뒤 넘겨줌
    • 스레드를 생성
    • 어떤 스레드에 작업을 할당해줄지
  • 이는 복잡하고 어려우며 개발자가 할 일이 많아짐.

▪️ 현재

  • 이를 해결하는 시스템이 DispatchQueue
  • 개발자는 작업이 생겼을 때 그저 Dispatch Queue 에 작업을 넘겨줌
  • 그러면 운영체제가 DispatchQueue 에 들어간 작업들을 살피며 적절한 스레드에 할당

DispatchQueue어떤 쓰레드로 작업을 보내기 위한 큐 를 의미하는 것입니다.

개발자가 작업을 DispatchQueue 에 보내면, 알아서 적절한 쓰레드를 찾아 작업을 할당시킵니다.


DispatchQueue 종류

  1. 메인 큐 (Main Queue)
    • UI 업데이트와 관련된 작업을 처리
    • 앱의 메인 스레드에서 실행
    • Serial Queue. (직렬 큐)
  2. 글로벌 큐 (Global Queue)
    • 백그라운드 작업을 처리
    • Concurrent Queue. (동시성 큐)
  3. 커스텀 큐 (Custom Queue)
    • 개발자가 직접 생성하고 관리하는 큐
    • 직렬(Serial) 또는 동시(Concurrent) 큐로 설정 가능

Serial vs Concurrent

  • Serial Queue (직렬 큐)
    • 들어온 작업들은 한 가지 쓰레드에 모두 보내는 큐
    • 큐에 추가된 작업을 한 번에 하나씩 순서대로 실행하는 큐
    • 쓰레드 하나에 모든 작업을 할당하기 때문에 작업 완료 순서가 보장됨
  • Concurrent Queue (동시성 큐)
    • 큐에 추가된 여러 작업을 동시에 실행할 수 있는 큐
    • 여러 스레드에서 작업이 동시에 병렬적으로 실행 가능
    • 작업의 완료 순서는 보장되지 않음

Qos (Quality Of Service)

작업의 중요도를 시스템에 알려주는 방법.

이를 통해 시스템은 리소스(CPU 시간, 에너지 등)를 효율적으로 분배할 수 있다.

이 작업이 어느정도의 중요도인지를 OS 에게 알리고 작업을 할당하는데 도움을 준다고 이해 가능.

  1. User Interactive (최고 우선순위)
    • 설명: 지금 당장 해야하는 작업
    • 예시: UI 업데이트, 애니메이션 등
    • 특징: 매우 빠르게 처리되어야 하는 작업
  2. User Initiated (높은 우선순위)
    • 설명: 사용자가 기다리고 있다는 것을 알림
    • 예시: 버튼 클릭 후 데이터 로딩
    • 특징: 몇 초 안에 완료되어야 하는 작업
  3. Default (기본 우선순위)
    • 설명: 평범한 작업
    • 예시: 일반적인 백그라운드 작업
    • 특징: 특별한 지정이 없을 때 사용됨
  4. Utility (낮은 우선순위)
    • 설명: 천천히 해도 되는 작업
    • 예시: 데이터 다운로드, 백업
    • 특징: 시간이 걸리지만 즉시 필요하지 않은 작업
  5. Background (최저 우선순위)
    • 설명: 언제 끝나도 상관없는 작업
    • 예시: 대용량 데이터 정리, 동기화
    • 특징: 사용자가 직접적으로 인지하지 못하는 작업
  6. Unspecified (시스템 결정)
    • 설명: 어떤 우선순위로 처리해도 상관없는 작업
    • 특징: 시스템이 알아서 우선순위 결정

Dispatch Queue 실습

▪️ SerialQueue + sync + async

  • serialQueue 이기 때문에 async여도 task2 가 끝나고 task3이 시작한다.


▪️ ConcurrentQueue + sync + async

  • ConcurrentQueue를 사용하여 task2 와 task3 가 같이 작업을 시작한다.

▪️ ConcurrentQueue + async + qos 예제 코드

  • ConcurrentQueue를 사용했지만 qos가 설정되어있어, background 작업이 먼저 시작되었지만 userInteractive 작업이 먼저 끝났다.
profile
iOS 개발 블로그

0개의 댓글