diff --git a/LEVEL 1/11-Network.md b/LEVEL 1/11-Network.md new file mode 100644 index 0000000..6cec139 --- /dev/null +++ b/LEVEL 1/11-Network.md @@ -0,0 +1,56 @@ +## iOS 앱에서 네트워크 통신을 하는 방법에는 어떤 것들이 있나요? +- URLSession +- URLSession + Swift Concurrency +- URLSession + Combine +- WebSocket +- Alamofire +- Moya + +## URLSession의 기본 사용 방법을 설명해주세요. +- URLSession은 HTTP와 같은 네트워크 데이터 전송 요청을 보내고 받는 핵심 객체로 이러한 요청을 처리 하기 위한 클래스들의 그룹입니다. +### shared +- 기본적으로 URLSession은 shared를 통해서 사용합니다. +- shared는 기본 요청을 위한 합당한 기본 동작을 제공하는 싱글톤 세션 객체입니다. +- 어떠한 조건도 줄 필요가 없는 간단한 작업일 때 사용합니다. +- shared에는 delegate와 customizable configuration 객제가 존재하지 않습니다. +- 때문에 다음과 같은 제한 사항이 있습니다. +1. 데이터가 서버에 도착할 때 점진적으로 데이터를 얻을 수 없다. +2. 기본 연결 동작을 사용자 지정할 수 없다. +3. 인증 기능에 제한이 있다. +4. 앱이 실행중이지 않은 상태에서 다운로드나 업로드를 실행할 수 없다. +- shared는 네트워크 작업의 간소화, 자원 효율성의 향상 등을 위해 만들어 졌습니다. +- 네트워크 연결, 캐시, 쿠키 관리 등은 시스템 자원을 소비하는 작업인데 매번 새로운 URLSession 인스턴스를 생성하면 불필요한 리소스를 사용하게 되며 메모리 사용량과 성능에도 영향을 미칩니다. +- shared를 사용하면 하나의 URLSession 인스턴스를 여러 요청에서 공유하므로, 이러한 자원 낭비를 방지할 수 있습니다. + +### Configuration +- 만일 URLSession에 특정한 조건을 주고 싶다면 Configuration을 사용할 수 있습니다. +- 조건을 주어서 데이터를 요청하고, 가져오는 것 등을 설정해줍니다. +- 이러한 조건은 URLSession에 대한 동작과 정책을 정의하는 것인데 이때 Configuration의 정책이 Request 객체보다 더 우선시됩니다. +- Default 세션: shared와 매우 유사하지만 delegate를 사용하여 점진적으로 데이터를 얻을 수 있습니다. +- Ephemeral 세션: Default세션과 유사하지만 캐시, 쿠키 또는 자격증명을 디스트게 기록하지 않습니다. +- Backgorund 세션: 앱이 실행되지 않는 동안 백그라운드에서 업로드 및 다운로드를 수행할 수 있습니다. +- 이러한 Configuration을 따라 생성된 Session 인스턴스는 서버에 필요한 데이터를 요청하는 Request 객체를 생성 및 설정하여 서버에서 해당 request에 대한 응답을 받는 적절한 Task를 생성합니다. + +## 네트워크 요청 시 에러 처리는 어떻게 하나요? +### 1. 옵셔널 및 다중 파라미터 +- 간단한 요청 처리에 적합합니다. +- 간단한 코드로 빠르게 구현할 수 있습니다. +- 가독성 및 유지보수성이 낮습니다. +### 2. Result 타입 +- 명확한 성공/실패의 분리가 필요할 때 사용합니다. +- 구조적이고 가독성이 높습니다. +- 약간의 추가 구현이 필요합니다. +### 3. Combine +- 반응형 프로그래밍이 필요할 때 유용합니다. +- 비동기 작업의 체이닝과 에러 처리가 용이합니다. +### 4. async/await +- 1번 방법에서 최신화된 Swift 문법을 적용한 방법입니다. +- 간결하고 명확한 비동기 코드를 작성할 수 있습니다. + +## 서드 파티 라이브러리(예: Alamofire)를 사용하는 이유는 무엇인가요? +- 생산성과 작업 효율적인 측면에서 장점을 가져갈 수 있습니다. +- URLSession에서는 직접 추가적인 구현이 필요한 많은 부분들을 서드파티에서는 미리 구현하여 간단한 방법으로 제공합니다. +- 예를 들어 JSON 인코딩 및 디코딩, Multipart Form Data, 다운로드 및 업로드 관리 등이 있습니다. +- 또한 에러 처리를 할 때도 다양한 기능을 제공합니다. +- 네트워크 상태 확인, 서버 응답 상태 코드 자동 처리, 사용자 정의 에러 메시지 제공 등이 있습니다. +- 이처럼 서드 파티에서 제공하는 간편한 기능들을 직접 구현할 필요 없이 사용할 수 있다면, 프로젝트의 규모가 클수록 코드 작성 시간을 단축시킬 수 있을 것이며 이는 효율성을 높여줄 것입니다.