iOS 앱 개발 심화 강의
스파르타 코딩 클럽
아키텍처 (Architecture)
: 시스템 전체적인 모습을 정의 (기능, 성능 보안 등 비기능적 요소에 대한 해결책 제시)
- MVC ( Model - View - Controller )
Model : 데이터와 데이터 처리 로직 관리 (구조체, 클래스)
View : 사용자 인터페이스 관리 ( UI Component 포함)
Controller : Model과 View의 상호작용
장점 : 비교적 간단한 구조 ( 직관적 ) && 세 가지 부분이 분리되어 독립적으로 작동
단점 : ViewController가 비교적 비대해지는 경향 ( 하나의 ViewController에 많은 역할과 책임 집중 -> 테스트가 어려워질 수 있음 )
- MVVM ( Model - View - ViewModel )
Model : MVC와 동일하게 데이터와 비즈니스 로직을 담당
View : 스토리보드와 컨트롤러 역할 ( UI를 그리고, 사용자 상호작용_interection )
ViewModel : 모델과 View 간에 중간 매개체 역할 ( View에 데이터를 표시하기 위해 비즈니스 로직 처리, 모델 데이터 가공 )
장점 : MVC의 단점을 보완한다 - 뷰와 로직이 분리되어 가독성 ↑, 유지보수성 ↑ && 테스트 용이성 ( 독립적 테스트 가능 )
단점 : 초기 이해가 어려울 수 있음 ( Learning Curve ) && 작은 규모의 프로젝트에선 오히려 복잡해 보일 수 있음 (보일러 플레이트)
디자인 패턴( Design Pattern )
: 자주 발생하는 문제에 대한 해결책을 재사용 가능한 형태로 정리
- 클래스나 객체의 작은 규모의 디자인 문제 해결)
- 클래스나 객체의 상호작용 구조화
- 구현 단계에서 수시로 적용
1) Delegate Pattern
- 한 객체가 다른 객체의 대리자
- 다른 객체의 이벤트나 데이터를 처리하는 방식 (객체 간 결합도 ↓, 유연성 ↑, 확장 가능성 ↑)
- 사용 예시로는 TableView나 CollectionView
특징 : 다중 상속 지원 x ( Protocol을 사용하여 비슷하게 구현 가능 )
자체적 이벤트 x ( 호출 시 메서드 제공하고, 해당 객체에서 발생한 이벤트 , 데이터 처리 )
2) Observer Pattern
- 하나의 객체 변경 시 해당 객체에 의존하는 다른 객체들에게 알림을 보내 변경사항 적용
- NotificationCenter : 등록, 발송, 처리 ( 중복 ↓, 관리 수월 )
특징 : 객체 간 결합도 ↓, 유연성 ↑
변경사항 적용 객체들을 동적으로 관리
직접 호출을 피할 수 있음
변경 사항에 대한 응답을 캡슐화 → 유지보수성 ↑
주의할 점 : 통제 불가 && 디버깅 어려움(순서보장 x) && 메모리 누수
3) Singleton Pattern
- 하나의 객체 인스턴스만 생성 → 전역에 제공 ( 앱 전역에 공유되어야하는 상태나 기능을 효율적으로 관리 )
특징 : 객체간 의존성 ↓
주의할 점 : 전역 상태 ( 프로그램 예측이 어려울 수 있음 ) && 테스트가 어려움 && 결합도 ↑
* 이외에도 다양한 디자인 패턴이 있음
Thread : 프로세스 내에서 실행되는 작은 단위의 실행 흐름
- 각각 독립적으로 실행 ( 여러 Thread가 동시 작업 수행 )
- 시스템 자원 효율적 활용
- 병렬적 작업 처리
동기(sync) : 순차적인 작업
비동기(async) : 여러 작업이 동시에 진행 ( 네트워크 요청, 파일 입출력, 사용자 입력 대기 등에 사용됨 )
- Callback : url이 많아지면 피라미드처럼 계속 적어야 해서 가독성이 떨어짐
- Concurrency : 코드가 직관적 ( 코드를 동기적으로 작성하면서 비동기적으로 실행 )
- Reactive Programming : 데이터 스트림과 변화에 반응하여 데이터 처리 수행 ( RxSwift, Conbine 라이브러리 )
* Task : 비동기적으로 실행되는 코드 조각
Instruments : 성능 분석 및 디버깅 도구 ( 메모리 누수 확인 ... )