🔥 옵션과 플래그 이름 설정하기

266자
4분

커맨드 라인에서 사용하는 옵션과 플래그 이름은 대개 속성 이름에서 비롯됩니다. 예를 들면 --count--index 같은 식입니다. 카멜 케이스(camel-case) 이름은 --strip-whitespace처럼 하이픈으로 구분된 소문자 단어로 바꿉니다.

이 기본 동작을 재정의하려면 @Option 또는 @Flag 이니셜라이저에 하나 이상 이름 지정을 명시하면 됩니다. 다음 명령은 네 가지 이름 지정 방식을 보여줍니다:

swift
struct Example: ParsableCommand {
    @Flag(name: .long)  // 기본값과 동일
    var stripWhitespace = false
 
    @Flag(name: .short)
    var verbose = false
 
    @Option(name: .customLong("count"))
    var iterationCount: Int
 
    @Option(name: [.customShort("I"), .long])
    var inputFile: String
}
 
swift
struct Example: ParsableCommand {
    @Flag(name: .long)  // 기본값과 동일
    var stripWhitespace = false
 
    @Flag(name: .short)
    var verbose = false
 
    @Option(name: .customLong("count"))
    var iterationCount: Int
 
    @Option(name: [.customShort("I"), .long])
    var inputFile: String
}
 

각 이름 지정 방식을 하나씩 살펴보겠습니다:

  • .long 또는 .short를 지정하면 속성 이름을 커맨드 라인 이름 소스로 사용해요. long 이름은 전체 이름을 사용하고 앞에 대시 두 개(-)를 붙이고, short 이름은 한 문자를 사용하고 앞에 대시 한 개()를 붙입니다. 이 예제에서 stripWhitespaceverbose 플래그를 이런 식으로 지정했습니다:

    text
    % example --strip-whitespace -v
    
    text
    % example --strip-whitespace -v
    
  • .customLong(_:) 또는 .customShort(_:)를 지정하면 주어진 문자열이나 문자를 속성 long 또는 short 이름으로 사용합니다.

    text
    % example --count 10 -I file1.swift
    
    text
    % example --count 10 -I file1.swift
    
  • 배열 리터럴 구문으로 여러 이름을 지정할 수 있어요. inputFile 속성은 기본 long 이름으로도 제공할 수 있습니다:

    text
    % example --input-file file1.swift
    
    text
    % example --input-file file1.swift
    

참고: .customLongwithSingleDash: true를 전달하여 -verbose와 같은 single-dash 플래그나 옵션을 만들 수도 있습니다. 이 이름 지정은 레거시 커맨드 라인 인터페이스를 마이그레이션할 때처럼 꼭 필요한 경우에만 사용하세요. single-dash 접두사와 함께 long 이름을 사용하면 short 이름과 조합될 때 모호성이 발생할 수 있거든요. -file이 옵션 한 개인지 -f, -i, -l, -e 네 가지 short 옵션을 조합한 것인지 명확하지 않을 수 있습니다.

이렇게 옵션과 플래그 이름을 설정하는 방법에 대해 알아봤습니다. 상황에 맞게 적절한 방식을 선택하여 사용하면 좋겠네요. 커맨드 라인 인터페이스를 설계할 때는 사용자 입장에서 직관적이고 일관성 있는 이름을 고르는 게 중요하답니다!

YouTube 영상

채널 보기
C++ 속의 펑터 | 프로그래머를 위한 카테고리 이론
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
API 응답 지연과 복잡한 에러, NestJS 인터셉터로 관리하는 방법 | NestJS 가이드
인터셉터와 RxJS로 캐시 시스템 구축하기 | NestJS 가이드
함수 객체의 보편적 구성 | 프로그래머를 위한 카테고리 이론
NestJS 커스텀 데코레이터 인자 전달 및 파이프 검증 활용법 | NestJS 가이드
관점 지향 로깅 인터셉터 구현 및 전역 바인딩 전략 | NestJS 가이드
NestJS 가드, 바이딩과 스코프 | NestJS 가이드