Swift

Swift 네트워크 추상화 - URL 처리방법

elisha0103 2023. 5. 9. 15:26

RESTful API를 사용하는 네트워킹 통신을 공부하다보니, 네트워크 추상화 단계에 URL을 별도로 처리하는 코드가 있어 궁금증이 들었다.

1. 왜 URL을 별도로 처리해야하는가?

2. URLComponents, URLQueryItem 타입들은 각각 무슨 용도이며, 어떻게 사용되는가?

 

무조건 공식문서부터 확인했지만 잘 이해가 되지 않았다.

따라서 위 궁금증에 답을 하기 위해서 먼저 기초를 다시 확인할 필요가 있었다.

 

1. URL

먼저, URL의 개념을 알기 전 URI를 확인하고 넘어가야했다.

URI는 우리말로 통합 자원 식별자를 칭한다. 즉, URI는 인터넷 상의 리소스 '자원 자체'를 의미한다고 할 수 있다.

URL은 인터넷 상의 리소스가 존재하는 '위치'를 나타내기 위한 규약이다. 즉, URL은 '자원이 있는 위치'를 나타낸다.

URL은 식별자와 위치를 알 수 있는데 예시를 확인해보면 되겠다.

 

tistory.com  : 이는 식별자이다. 즉, URI이다. 저 식별자는 위치를 나타내는 것이 아니라 리소스의 이름이다.

하지만, https://tistory.com : 이는 URL이다. URI에서 https 라는 네트워크 프로토콜 정보가 추가되면서 식별자의 위치를 알 수 있는 '정보'로 변경됐다. 따라서 URL을 통해 식별자(tistory.com)와 식별자의 주소 정보를 알 수 있게 된다.

 

 

URL의 구조

https://elisha0103.tistory.com/manage/newpost/?type=post

 

위 URL의 구조를 살펴보면 다음과 같다.

 

https://elisha0103.tistory.com/manage/newpost/?type=post

https <scheme>: 사용할 프로토콜

elisha0103.tistory.com <host>: 접근할 서버의 호스트 이름

manage/newpost < path>: 접근할 서버에 있는 정보의 경로

type=post <query>: 접근할 서버에 있는 정보에 대한 추가적인 정보나 조건 (추가적인 데이터 표현)

 


 

2. Swift에서 URL을 별도로 처리하는 이유

핵심을 먼저 말하자면, 네트워크 추상화를 위해서 URL도 추상화를 진행한다.

 

Swift에서 URLSession과 URL 문자열을 가지고 서버에 데이터를 요청할 수 있다.

예를 들어, https://example.com/search?q=swift&limit=10 URL이 있다고 하면

위 URL 문자열 모두를 String 타입으로 URLSession의 dataTask 함수에 전달하여 데이터를 요청할 수 있을 것이다.

만약, 검색어를 사용자로부터 입력받아 서버에 요청한다면

"https://example.com/search?q=\(searchKeywords)&limit=10"

 

위 형식으로 문자열에 변수를 활용하여 요청 할 것이다. 간단한 URL이라면 괜찮지만 query가 더 많이 추가된다고 가정해보자.

이 경우 문자열은 복잡해지고 오타를 발견하기 어려우며 네트워크 기능을 추상화하는데 적합하지 않을 것이다.

따라서, URLComponents와 URLQueryItem을 사용하여 URL도 추상화한다.

 


 

3. URLComponents, URLQueryItem

Swift에서 URLComponents의 정의는 다음과 같다.

URLComponents

해석해보면, URL을 구성하는 요소들(scheme, host, path, query 등)로 구성된 구조를 의미한다.

쉽게 말해서, URL을 구성하는 요소들을 개별적인 프로퍼티로 분리하여 관리할 수 있도록 구성된 Struct 타입이다.

 

Swift에서 URLQueryItem의 정의는 다음과 같다.

URLQueryItem

URLQueryItem은 name과 value를 쌍으로 가지는 구조체 타입이다.

URL에서 query는 이름과 값을 쌍으로 가지는 구조를 취하기 때문에 URLQueryItem도 이 쌍을 관리하기 위해 사용된다.

URLQueryItem은 URL의 쿼리 문자열에 대해 파싱을 하거나 생성을 할 때 유용하게 사용된다.

 

앞에 예시로 말한 URL에 URLQueryItem 객체를 사용하면

"https://example.com/search?\(queryItems)"

URL이 위 구성처럼 나타내어진다.

이 문자열을 그대로 dataTask에 사용한다는 뜻이 아니라 시스템적으로 URL 구성이 간단해진다 정도로만 이해하자.

 

 

이제 URLComponents와 URLQueryItem을 사용하여 URL 추상화를 해보자.

URL: https://example.com/search?q=swift&limit=10

 

var components = URLComponents()
var queryItems: [URLQueryItem] = []

queryItems.append(URLQueryItem(name: "q", value: "swift")
queryItems.append(URLQueryItem(name: "limit", value: "10")

components.scheme = "https"
components.host = "example.com"
components.path = "/search"
components.queryItems = queryItems

if let url = components.url {
	print(url.absoluteString)
}

// 출력: "https://example.com/search?q=swift&limit=10"

 

URLComponents를 사용하면 URL의 각 요소를 분리하여 개별적으로 처리할 수 있고, URL을 구성하는 파라미터들을 쉽게 조작할 수 있다. 이러한 방법은 유지보수성을 향상시키고, URL 구성 요소를 동적으로 생성하거나 변경해야 하는 경우 유용하다.

즉, URL 추상화를 사용하면 네트워크 추상화를 구성하는데 편리하고 코드의 유연성을 제공한다.

 

 

'Swift' 카테고리의 다른 글

애플 Text엔진 TextKit  (2) 2024.09.08
TCA - Binding  (0) 2023.08.17
TCA - Environment는 어디갔나?  (0) 2023.07.10
TCA(The Composable Architecture)란?  (1) 2023.07.06
객체지향 생활체조  (0) 2023.05.05