swift 동기/비동기 프로그래밍에서 발생할 수 있는 Side Effect

임혜정·2024년 7월 16일
0
post-custom-banner

Side Effect란

의도한 결과 외에 예상치 못하게 따라오는 부수적인 효과를 말한다.
알러지 때문에 항히스타민제를 복용해서 알러지는 가라앉혔지만 졸음같은 부작용이 따라올 수 있는 것처럼 말이다.

Side Effect에 앞서 알아둘 것

함수형 프로그래밍

  • 순수 함수(Pure Functions) - 같은 입력이라면 항상 같은 출력, Side Effect가 없는 함수
  • 비순수 함수 (Impure Functions) - side effect를 가질 수 있는 함수
  • 고차 함수

동기와 비동기 프로그래밍

  • 동기: 순차적 실행, 하나의 작업이 끝나야 다음작업 / 비동기: 동시에 작업
  • 콜백 - 비동기 작업이 완료되고 호출되는 함수
  • 프로미스 - 비동기 작업 결과를 처리하기 위한 객체
  • ⭐️async/await - 비동기 코드를 동기 코드처럼 작성할 수 있는 문법

상태 관리

  • 전역 변수와 지역 변수 : 프로젝트 전체에서 접근할 수 있는 전역 변수,
    특정 범위에서만 접근할 수 있는 지역 변수
  • 불변성 - 데이터를 변경하지 않고 새로운 데이터를 생성하는 방식

동기/비동기 프로그래밍에서 발생할 수 있는 Side Effect

동기 프로그래밍에서 발생할 수 있는 Side Effect

  1. 블로킹(blocking)
    하나의 작업이 오래 걸리면 전체 프로그램 실행이 중단될 수 있다.
    예를 들어 어떤 파일을 읽는 작업이 있고 그것이 오래 걸릴 때 프로그램이 멈춘 것 처럼 보일 수 있다.
func readFile() {
    // 큰 파일을 읽는 작업 (동기적으로 실행)
    let fileContent = try! String(contentsOfFile: "largeLargeFile.txt")
    print("File content read")
}

func processFile() {
    readFile()  // 이 작업이 끝나기 전까지 다른 작업은 대기
    print("File processing done")
}

processFile()

readFile 함수에서 읽는 largeLargeFile.txt가 정말 너무 큰 파일이라면? 읽는 동안 processFile 함수의 다음 줄이 실행되지 않고 프로그램이 멈춘 것처럼 보일 수 있다


  1. 공유 자원 접근(shared resource access)
    여러 함수나 모듈이 동일한 자원(변수나 파일 등)에 접근하면 데이터가 예상치 못하게 변경될 수 있다.
    예를 들어 두 함수가 동시에 같은 변수를 수정하게 된다면 데이터가 손상된다.

비동기 프로그래밍에서 발생할 수 있는 Side Effect

  1. 경쟁 조건 (race condition)
    여러 비동기 작업이 동시에 실행될 때 작업 순서에 따라 결과가 달라질 수 있다. 두 개의 비동기 함수가 동시에 데이터를 업데이트하게 될 시 데이터가 이상해질 수 있다.

  2. 상태 불일치 (iconsistent state)
    비동기 작업이 완료되기 전에 다른 작업이 시작되게되면 상태가 불안정해질 수 있다. 서버에서 데이터로드가 완료되지 않았는데 데이터를 사용하는 부분이 동시에 실행되면 에러가 발생하는 것이다

import Foundation

func fetchData(completion: @escaping (String) -> Void) {
    DispatchQueue.global().async {
        // 서버에서 데이터 가져오는 작업 (비동기적으로 실행)
        let data = "Fetched Data"
        completion(data)
    }
}

var globalData = ""

fetchData { data in
    globalData = data
    print("Data fetched: \(globalData)")
}

print("End of function")

경쟁 조건: globalData가 설정되기 전에 print("End of function")부분이 먼저 출력될 수 있다.
상태 불일치: globalData가 설정되기 전에 다른 코드가 globalData를 사용하려고 하면 잘못된 데이터를 참조할 수 있다.


  1. 에러 처리 복잡성 (complex error handling)
    비동기 코드에서 에러가 발생할 수 있는 지점이 많아 에러 처리가 복잡해진다. 콜백 함수 내에서 발생한 에러가 적절히 처리되지 않을 경우 비정상 종료될 수 있다.

  2. 메모리 누수 (memory leak)
    비동기 작업이 완료되지 않고 자원 해제가 되지 않아서 메모리 누수가 발생할 수 있다.

오늘은 심란하다

profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️
post-custom-banner

0개의 댓글