Skip to content

Commit

Permalink
Create 240820 MainActor,_Concurrency.md
Browse files Browse the repository at this point in the history
  • Loading branch information
leeari95 committed Aug 20, 2024
1 parent 905b2c8 commit b88f2a1
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 1 deletion.
75 changes: 75 additions & 0 deletions Sources/AriNote/TIL.docc/Swift/240820 MainActor,_Concurrency.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# 240820 MainActor, Concurrency

MainActor.run와 @MainActor의 차이가 κΆκΈˆν•΄!

8μ›” 20일 (ν™”)

# ν•™μŠ΅λ‚΄μš©

Swift의 Concurrency ν™˜κ²½μ—μ„œ λΉ„λ™κΈ°λ‘œ 데이터λ₯Ό μ²˜λ¦¬ν•œ ν›„ UIλ₯Ό μ—…λ°μ΄νŠΈ ν• λ•Œ λ©”μΈμŠ€λ ˆλ“œμ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œ 방법을 μ°Ύμ•„λ³΄μ•˜λ‹€. μ—¬λŸ¬ 방법이 μžˆμ–΄μ„œ 차이가 뭔지 κΆκΈˆν•΄μ„œ μ•Œμ•„λ³΄μ•˜λ‹€.

## MainActor.run와 @MainActor의 차이

`MainActor.run`은 메인 μŠ€λ ˆλ“œμ—μ„œ νŠΉμ • ν΄λ‘œμ €λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜κΈΈ μ›ν•˜λŠ” μ½”λ“œκ°€ μžˆμ„ λ•Œ ν˜ΈμΆœν•  수 μžˆλŠ” λͺ…λ Ήν˜•(Imperative) 방식이닀.

```swift
MainActor.run {
// 메인 μŠ€λ ˆλ“œμ—μ„œ 싀행될 μ½”λ“œ
}
```

`@MainActor`λŠ” νŠΉμ • ν•¨μˆ˜, λ©”μ„œλ“œ, 클래슀 λ˜λŠ” ꡬ쑰체가 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜λ„λ‘ μ§€μ •ν•˜λŠ” 방법이닀. ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μžλ™μœΌλ‘œ μ½”λ“œκ°€ 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜λ„λ‘ κ΄€λ¦¬ν•œλ‹€.

```swift
@MainActor
func updateUI() {
// UI μ—…λ°μ΄νŠΈ μ½”λ“œ
}
```

## μ„±λŠ₯적인 차이


### MainActor.run
`MainActor.run`은 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μ½”λ“œ 뢀뢄을 λͺ…μ‹œμ μœΌλ‘œ 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•˜λ„λ‘ μ§€μ •ν•œλ‹€.
κ·ΈλŸ¬λ‚˜ `MainActor.run`λŠ” 메인 μŠ€λ ˆλ“œλ‘œμ˜ μ „ν™˜μ„ λ™μ μœΌλ‘œ μ²˜λ¦¬ν•œλ‹€. 이 κ³Όμ •μ—μ„œ μ»΄νŒŒμΌλŸ¬λŠ” μŠ€λ ˆλ“œ μ „ν™˜μ„ μœ„ν•œ 좔가적인 λŸ°νƒ€μž„ μ½”λ“œλ₯Ό μƒμ„±ν•˜λ©°, μ΄λŠ” SIL μ½”λ“œμ˜ 양을 μ¦κ°€μ‹œν‚¨λ‹€. 맀번 `MainActor.run`을 ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ 메인 μŠ€λ ˆλ“œλ‘œμ˜ μ „ν™˜μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ½”λ“œκ°€ μƒμ„±λ˜κ³  μ΄λŸ¬ν•œ 좔가적인 μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ€ μ„±λŠ₯ μ €ν•˜μ˜ 원인이 될 수 μžˆλ‹€.

> MainActor.run을 μ‚¬μš©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ 메인 μŠ€λ ˆλ“œλ‘œμ˜ μ „ν™˜μ„ μœ„ν•΄ 좔가적인 Swift Intermediate Language(SIL) μ½”λ“œλ₯Ό μƒμ„±ν•˜κ²Œ 되며, 이 κ³Όμ •μ—μ„œ Context Switching 및 비동기 μ½”λ“œ 관리와 κ΄€λ ¨λœ μ½”λ“œκ°€ μΆ”κ°€λœλ‹€.
> Swift μ»΄νŒŒμΌλŸ¬λŠ” μ†ŒμŠ€ μ½”λ“œλ₯Ό μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ λ‹¨κ³„μ˜ 쀑간 ν‘œν˜„μ„ μƒμ„±ν•˜λŠ”λ°, 그쀑 ν•˜λ‚˜κ°€ `SIL (Swift Intermediate Language)`λ‹€. SIL은 μ΅œμ ν™”λ₯Ό μœ„ν•΄ μ„€κ³„λœ 쀑간 ν‘œν˜„μœΌλ‘œ, μ½”λ“œμ˜ μ‹€ν–‰ 경둜λ₯Ό μ΅œμ ν™”ν•˜κ±°λ‚˜, λΆˆν•„μš”ν•œ μž‘μ—…μ„ μ œκ±°ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ ν•œλ‹€.
λ˜ν•œ 비동기 μž‘μ—… λ‚΄μ—μ„œ `MainActor.run`λ₯Ό 자주 μ‚¬μš©ν•˜λ©΄ 비동기 μž‘μ—…μ˜ 흐름을 끊고 메인 μŠ€λ ˆλ“œλ‘œ μ „ν™˜ν•˜λŠ” κ³Όμ •μ—μ„œ 지연이 λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.
λ§Œμ•½ λ©”μΈμŠ€λ ˆλ“œκ°€ 이미 λ°”μœ μƒνƒœλΌλ©΄ `MainActor.run`μ—μ„œ 메인 μŠ€λ ˆλ“œλ‘œμ˜ μ „ν™˜μ΄ λŒ€κΈ° μƒνƒœμ— 놓일 μˆ˜λ„ μžˆλ‹€.
즉, 메인 μŠ€λ ˆλ“œμ˜ 병λͺ© ν˜„μƒμ„ μœ λ°œν•  수 있으며 결과적으둜 UI λ Œλ”λ§ μ§€μ—°μ΄λ‚˜ λ‹€λ₯Έ μ€‘μš”ν•œ μž‘μ—…μ˜ μ§€μ—°μœΌλ‘œ μ΄μ–΄μ§ˆ μˆ˜λ„ μžˆλ‹€.
λ˜ν•œ 비동기 μž‘μ—… λ‚΄μ—μ„œ λΉˆλ²ˆν•˜κ²Œ μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ 컴파일러 μ΅œμ ν™”λ₯Ό μ–΄λ ΅κ²Œ λ§Œλ“€κ³  λΆˆν•„μš”ν•œ μ˜€λ²„ν—€λ“œλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€.

### @MainActor

`@MainActor`λŠ” ν΄λ‘œμ €, ν•¨μˆ˜, νƒ€μž… μˆ˜μ€€μ—μ„œ 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜μ–΄μ•Ό 함을 μ„ μ–Έμ μœΌλ‘œ μ§€μ •ν•œλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” ν•΄λ‹Ή μ½”λ“œκ°€ 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λœλ‹€λŠ” 사싀을 컴파일 νƒ€μž„μ— μΈμ§€ν•˜κ³  이에 따라 μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€.

`@MainActor`λ₯Ό μ‚¬μš©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œμ˜ μ‹€ν–‰ 경둜λ₯Ό μ˜ˆμΈ‘ν•˜κ³  μ΅œμ ν™”ν•  수 μžˆλ‹€. 메인 μŠ€λ ˆλ“œμ—μ„œ 싀행될 μ½”λ“œκ°€ μ „μ²΄μ μœΌλ‘œ 잘 μ •μ˜λ˜μ–΄ μžˆμœΌλ―€λ‘œ λΆˆν•„μš”ν•œ μŠ€λ ˆλ“œ μ „ν™˜μ΄λ‚˜ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­(Context Switching)을 μ΅œμ†Œν™”ν•  수 μžˆλ‹€.

λ˜ν•œ `@MainActor`λŠ” 메인 μŠ€λ ˆλ“œ 싀행이 보μž₯되기 λ•Œλ¬Έμ— SIL λ‹¨κ³„μ—μ„œμ˜ μ½”λ“œ 생성도 간결해진닀. μ»΄νŒŒμΌλŸ¬λŠ” 메인 μŠ€λ ˆλ“œμ—μ„œμ˜ 싀행을 염두에 두고 μ΅œμ ν™”λœ SIL μ½”λ“œλ₯Ό μƒμ„±ν•˜λ©°, 이둜 인해 μ„±λŠ₯ μ˜€λ²„ν—€λ“œκ°€ 적은 νŽΈμ΄λ‹€.

## κ·Έλž˜μ„œ 뭘 써야해?

메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μ½”λ“œκ°€ λ§Žκ±°λ‚˜ μΌκ΄€λœ μ‹€ν–‰ ν™˜κ²½μ΄ ν•„μš”ν•  λ•ŒλŠ” `@MainActor`λ₯Ό μ΅œλŒ€ν•œ ν™œμš©ν•˜λ„λ‘ μ‚¬μš©ν•˜μž.

νŠΉμ • μ½”λ“œ λ‚΄μ—μ„œ 일뢀뢄을 메인 μŠ€λ ˆλ“œλ‘œ μ‹€ν–‰ν•΄μ•Όν•  λ•ŒλŠ” `MainActor.run`을 μ‚¬μš©ν•˜μž. λ‹€λ§Œ λΉˆλ²ˆν•œ μ‚¬μš©μ€ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œλ₯Ό λ°œμƒμ‹œμΌœ μ„±λŠ₯ μ €ν•˜λ₯Ό μ΄ˆλž˜ν•  수 μžˆμœΌλ‹ˆ μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹κ² λ‹€.

## 5쀄 μš”μ•½

1. `@MainActor`λŠ” ν•¨μˆ˜λ‚˜ 클래슀 λ‹¨μœ„μ—μ„œ 메인 μŠ€λ ˆλ“œμ—μ„œμ˜ 싀행을 컴파일 νƒ€μž„μ— μ΅œμ ν™”ν•˜μ—¬, λΆˆν•„μš”ν•œ μŠ€λ ˆλ“œ μ „ν™˜μ„ 쀄이고 μ„±λŠ₯을 ν–₯μƒμ‹œν‚¨λ‹€.
2. `MainActor.run`은 νŠΉμ • ν΄λ‘œμ €λ₯Ό 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ λŸ°νƒ€μž„ μ‹œ μŠ€λ ˆλ“œ μ „ν™˜κ³Ό 좔가적인 SIL μ½”λ“œ 생성을 μœ λ°œν•˜μ—¬ μ„±λŠ₯ μ˜€λ²„ν—€λ“œλ₯Ό μ¦κ°€μ‹œν‚¬ 수 μžˆλ‹€.
3. `@MainActor`λŠ” 전체적인 메인 μŠ€λ ˆλ“œ 싀행이 ν•„μš”ν•œ 경우 μ ν•©ν•˜λ©°, μ»΄νŒŒμΌλŸ¬κ°€ μΌκ΄€λœ μ‹€ν–‰ 경둜λ₯Ό μ΅œμ ν™”ν•  수 μžˆλ‹€.
4. `MainActor.run`은 νŠΉμ • μƒν™©μ—μ„œλ§Œ 메인 μŠ€λ ˆλ“œ μ „ν™˜μ΄ ν•„μš”ν•  λ•Œ μ‚¬μš©ν•˜μ§€λ§Œ, λΉˆλ²ˆν•œ μ‚¬μš©μ€ μ„±λŠ₯ μ €ν•˜λ‘œ μ΄μ–΄μ§ˆ 수 μžˆλ‹€.
5. μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•΄ `@MainActor`λ₯Ό μ„ ν˜Έν•˜κ³ , `MainActor.run`은 μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.

---

# 참고 링크

- [https://developer.apple.com/documentation/swift/concurrency](https://developer.apple.com/documentation/swift/concurrency)
- [https://developer.apple.com/documentation/swift/mainactor](https://developer.apple.com/documentation/swift/mainactor)
- [https://mechanicdong.tistory.com/54](https://mechanicdong.tistory.com/54)
4 changes: 3 additions & 1 deletion Sources/AriNote/TIL.docc/TIL.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
```
# λ‚ μ§œ ν‚€μ›Œλ“œ
κ³΅λΆ€ν•œ λ‚΄μš© μš”μ•½ μ„€λͺ…
1μ›” 1일 (μ›”)
# ν•™μŠ΅λ‚΄μš©
Expand All @@ -56,7 +58,7 @@
# 참고 링크
- 링크
- []()
```

## Topics
Expand Down

0 comments on commit b88f2a1

Please sign in to comment.