🔥 Swift Concurrency를 지원하는 ArgumentParser

214자
3분

ArgumentParser는 Swift Concurrency를 지원하며, 특히 async 버전인 run을 지원해요. async 버전인 run을 사용한다면, ParsableCommand 대신 AsyncParsableCommand를 준수해야 해요.

swift
@main
struct FileUtility: AsyncParsableCommand {
    @Argument(
        help: "File to be parsed.",
        transform: URL.init(fileURLWithPath:)
    )
    var file: URL
 
    mutating func run() async throws {
        // FileHandle을 생성하여 파일을 읽을 준비를 해요.
        let handle = try FileHandle(forReadingFrom: file)
 
        // 파일의 각 라인을 비동기적으로 읽어요.
        for try await line in handle.bytes.lines {
            // 각 라인마다 원하는 작업을 수행해요.
        }
 
        // 파일 핸들을 닫아요.
        try handle.close()
    }
}
 
swift
@main
struct FileUtility: AsyncParsableCommand {
    @Argument(
        help: "File to be parsed.",
        transform: URL.init(fileURLWithPath:)
    )
    var file: URL
 
    mutating func run() async throws {
        // FileHandle을 생성하여 파일을 읽을 준비를 해요.
        let handle = try FileHandle(forReadingFrom: file)
 
        // 파일의 각 라인을 비동기적으로 읽어요.
        for try await line in handle.bytes.lines {
            // 각 라인마다 원하는 작업을 수행해요.
        }
 
        // 파일 핸들을 닫아요.
        try handle.close()
    }
}
 

이 코드에서는 AsyncParsableCommand를 채택하고 있어요. run() 메서드는 async throws로 선언하고 있죠. 이렇게 하면 run() 내부에서 await를 사용하여 비동기 작업을 수행할 수 있어요.

@Argument 속성을 사용하여 파싱할 파일 경로를 전달받아요. transform 클로저를 사용하여 파일 경로를 URL 타입으로 변환하죠.

run() 메서드 내부에서는 FileHandle을 생성하여 파일을 읽을 준비를 해요. 그리고 for try await 루프를 사용하여 파일 각 라인을 비동기적으로 읽어요. 이렇게 읽은 각 라인에 대해 원하는 작업을 수행할 수 있죠.

마지막으로 close() 메서드를 호출하여 파일 핸들을 닫아줘요.

주의!

실수로 ParsableCommandasync 버전인 run과 함께 사용한다면, 앱이 run 함수에 도달하지 않고 USAGE 텍스트만 표시할 수 있어요. async 버전인 run을 사용할 때는 반드시 AsyncParsableCommand를 사용해야 해요.

이렇게 ArgumentParser에서 Swift Concurrency를 활용하면 파일 읽기와 같은 비동기 작업을 깔끔하고 직관적으로 처리할 수 있습니다. 이를 통해 코드 가독성이 높아지고, 비동기 작업을 간편하게 다룰 수 있죠.

YouTube 영상

채널 보기
NestJS 파이프가 뭔가요? 컨트롤러를 보호하는 방법 | NestJS 가이드
입력을 전처리하는 Functor - Contravariant와 contramap 이해하기 | 프로그래머를 위한 카테고리 이론
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
Pro펑터, 입력과 출력을 동시에 다루는 펑터 | 프로그래머를 위한 카테고리 이론
NestJS 가드, 바이딩과 스코프 | NestJS 가이드
존 매카시가 들려주는 인공지능의 탄생 이야기
Git Worktree로 여러 피처 동시에 개발하기 | AI 코딩 시대의 필수 스킬
Zod로 스키마 유효성 검사 구현하기 | NestJS 가이드