Skip to content

[LEVEL 1] 11 - Network #20

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions LEVEL 1/11-Network.md
Original file line number Diff line number Diff line change
@@ -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. 데이터가 서버에 도착할 때 점진적으로 데이터를 얻을 수 없다.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mint3382 님, 점진적으로 데이터를 얻을 수 있다는 것에 대해 추가 설명이나 예시를 들어주면 좋을 것 같습니다!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

스트리밍 컨텐츠나 큰 파일 다운로드, 실시간 데이터 처리가 필요한 경우 Delegate를 사용해 데이터를 점진적으로 처리할 수 있습니다. 이는 데이터가 서버에 도착하는 대로, 부분적으로 처리하겠다는 의미로 다음과 같은 메서드를 사용합니다.

  • urlSession(_:dataTask:didReceive:): 서버에서 데이터가 도착할 때마다 호출
  • urlSession(_:dataTask:didCompleteWithError:): 모든 데이터가 수신 된 후 호출

이를 통해 데이터를 일부씩 처리하여 응답 속도를 향상시키기에 실시간 처리가 가능해 스트리밍 컨텐츠 등이 가능합니다. 또한 대용량 데이터를 처리할 때, 메모리에 전체 데이터를 한번에 저장하지 않아도 된다는 장점이 있습니다.

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, 다운로드 및 업로드 관리 등이 있습니다.
- 또한 에러 처리를 할 때도 다양한 기능을 제공합니다.
- 네트워크 상태 확인, 서버 응답 상태 코드 자동 처리, 사용자 정의 에러 메시지 제공 등이 있습니다.
- 이처럼 서드 파티에서 제공하는 간편한 기능들을 직접 구현할 필요 없이 사용할 수 있다면, 프로젝트의 규모가 클수록 코드 작성 시간을 단축시킬 수 있을 것이며 이는 효율성을 높여줄 것입니다.