티스토리 뷰

반응형

 

Sendable 프로토콜 개요
Sendable이 뭐길래 Swift 6에서 강조될까?

Swift를 쓰는 개발자라면, 최근 자주 보게 되는 키워드 중 하나가 Sendable 프로토콜일 거예요. 애플 공식 문서에서는 Sendable을 이렇게 설명하고 있습니다:

Sendable 프로토콜은 데이터 레이스 없이 다양한 컨텍스트에서 안전하게 전달될 수 있는 타입을 나타낸다.

즉, 여러 스레드나 Task 간에 데이터를 주고받을 때 충돌 없이 안전하게 다룰 수 있는 타입인지를 보장해주는 약속 같은 개념입니다.

Swift6부터는 이 개념이 더 엄격하고 자주 쓰이게 되니, 지금 정확히 이해해두는 것이 앞으로의 개발에 큰 도움이 될 거예요! 개념이 어렵게 느껴지신다고요? 괜찮아요. 지금부터 하나하나 아주 쉽게 설명드릴게요 🙂

 


 

왜 Sendable이 중요한 걸까요?

Swift에서 비동기 코드가 많아지고, 여러 작업(Task)이 동시에 진행되면서 생길 수 있는 대표적인 문제가 데이터 레이스예요. 예를 들어, 두 개의 비동기 작업이 동시에 같은 변수에 접근해서 값을 바꾸려 한다면, 결과가 예측 불가능해지죠. 은행 송금을 예시로 들어볼게요. 동시에 동일 동작이 중복 실행되어버린다면? 그래서 이중 출금이 되어버린다면? 큰일 날 거에요!

이런 위험을 막기 위해 등장한 개념이 바로 Sendable. 이 프로토콜을 통해 우리는 "이 타입은 다른 Task에 안전하게 넘겨도 돼요" 라는 걸 컴파일러에게 알려줄 수 있어요.

즉, Sendable을 활용하면 스레드 안전성을 확보하면서 컴파일 타임에 문제를 미리 잡아주는 장점이 생기죠. 복잡한 동시성 코드를 작성할 때, 우리의 실수를 컴파일러가 대신 잡아주는 건 정말 큰 힘이 됩니다. 조기에 데이터 경쟁 이슈를 해소할 수 있도록 해주기 때문이죠.

 

 


어떤 타입이 Sendable인가요?

다행히도, Swift는 기본적으로 많은 타입을 자동으로 Sendable로 간주해 줍니다. 예를 들어 아래와 같은 경우들이 대표적이에요:

  • struct enum과 같이 값을 복사해서 사용하는 타입 (값 타입)
  • mutable(변경 가능)한 저장소를 가지지 않는 클래스(참조 타입)
  • 내부적으로 상태 접근을 제어하는 방식(예: lock 사용 or actor 내 제한)이 적용된 클래스
  • @Sendable 키워드가 붙은 클로저나 함수

즉, 상태를 공유하지 않거나, 상태에 접근하는 방법이 통제되어 있다면 Sendable로 간주될 수 있어요.

단, 명시적으로 Sendable을 준수하려면 해당 타입이 정의된 같은 파일 내에서 조건을 만족해야 하고, 컴파일러가 확인할 수 있어야 합니다.

 


Sendable은 어떻게 동작하나요?

재밌는 점은, Sendable 프로토콜은 실제로 우리가 구현해야 할 메서드나 프로퍼티가 전혀 없다는 것이에요. 즉, 단순히 "이 타입은 안전해!"라고 컴파일러에게 말해주는 약속의 마크 같은 개념이죠.

그런데 단순한 표시만이 아닙니다. 컴파일러는 실제로 여러분이 만든 타입을 검사해서 다음과 같은 점을 체크해요:

  • 이 타입은 스레드 안전한가?
  • 내부에 Sendable이 아닌 프로퍼티가 들어있지는 않은가?
  • 외부에서 상태를 변경할 여지가 있는가?

이러한 점들을 바탕으로 타입이 Sendable을 따를 수 있는지 판단해 줍니다.

Swift6부터는 이 검사가 더 철저해지고, Sendable을 요구하는 API들도 늘어나고 있어요. 따라서 앞으로는 Sendable 준수가 거의 필수가 될 것입니다. 미리 그 개념을 이해하고, 활용할 줄 알아야 좋을 것 같아요.

 


Sendable Actors

구조체나 열거형이 아닌 액터(actor)는 어떨까요? 모든 액터 타입들은 암시적으로 Sendable합니다. 액터는 내부의 변경가능한 상태들이 순차적으로 변경되는 것을 보장하는 특성이 있기 떄문이에요.

이러한 점들 때문에 actor도 Swift6 이후 부터는 더더욱 중요한 개념으로 사용됩니다.

 


📚 참고할 문서와 더 알아보기

더 깊이 들어가고 싶다면 아래 공식 문서를 참고해보세요:

  • Concurrency in The Swift Programming Language (애플 공식 문서 링크)

 

 


마치며...

Swift는 점점 더 강력하고 안전한 비동기 프로그래밍을 지원하기 위해 발전하고 있어요. 그 중심에 있는 개념 중 하나가 바로 Swift Concurrency와 빼놓을 수 없는 Sendable입니다.

지금부터 조금씩 익숙해지고, 직접 타입을 설계할 때 Sendable을 염두에 두면, 더 안전하고 예측 가능한 앱을 만드는 데 도움이 될거라 생각합니다. 

지금까지 Swift6, Swift Concurrency의 Sendable protocol 개념과 중요성을 알아보았습니다. 좋은 주제로 또 찾아올게요. 감사합니다!

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함