Picocli를 활용한 자바 CLI 애플리케이션의 명령 객체 설계

CLI 개발에서 명령 중심 아키텍처의 필요성

자바 기반 명령줄 도구를 제작할 때, 사용자가 입력한 인수를 효율적으로 해석하고 이에 맞는 동작을 수행하는 구조가 필수적이다. 명령 객체 패턴은 각각의 기능을 독립된 클래스 단위로 분리함으로써 확장성과 테스트 용이성을 높인다. Picocli는 이러한 패턴을 자연스럽게 지원하는 경량 프레임워크로, 어노테이션 기반 설정만으로 복잡한 파싱 로직을 자동화할 수 있다.

Picocli의 핵심 특징

Picocli는 자바 애플리케이션에 명령행 인터페이스를 통합하기 위한 오픈소스 라이브러리다. 주요 기능으로는 ANSI 색상 출력, 자동 완성 스크립트 생성, 하위 명령 지원, 형식 검증 등이 있으며, 특히 어노테이션 기반 구성 방식 덕분에 코드 가독성이 뛰어나다. 이를 통해 개발자는 비즈니스 로직에 집중할 수 있고, 명령어 기반 설계와 잘 맞물린다.

명령 객체 패턴의 원리

이 패턴은 '행위'를 캡슐화하여 요청 자체를 일급 객체로 만든다. 각 명령은 실행 가능한 유닛으로서, 나중에 큐에 저장하거나 취소 기능을 붙이는 등의 유연한 처리가 가능하다. CLI 환경에서는 각 서브커맨드(subcommand)를 별도의 클래스로 정의함으로써 모듈화를 달성할 수 있다.

Picocli를 통한 명령 객체 구현 전략

Picocli는 @Command, @Option, @Parameters 등의 어노테이션을 제공하여, 클래스를 명령 단위로 등록하고 인수를 선언적으로 바인딩할 수 있게 한다. 이 방식은 명령어 계층 구조를 직관적으로 표현하며, 런타임 시 자동으로 파싱 및 유효성 검사를 수행한다.

실습: 간단한 CLI 도구 만들기

1단계: 빌드 의존성 추가

Maven 기반 프로젝트라면 pom.xml에 다음 항목을 포함시킨다.

<dependency>
    <groupId>info.picocli</groupId>
    <artifactId>picocli</artifactId>
    <version>4.7.5</version>
</dependency>

2단계: 명령 클래스 정의

아래 예제는 입력받은 문자열을 출력하는 GreetCommand를 보여준다. 필수 옵션으로 이름을 지정하며, 기본값과 설명도 어노테이션으로 설정 가능하다.

import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import java.util.concurrent.Callable;

@Command(name = "greet", description = "사용자에게 인사 메시지를 출력합니다.")
public class GreetCommand implements Callable<Integer> {

    @Option(names = {"-n", "--name"}, required = true, description = "사용자 이름")
    private String userName;

    @Option(names = {"--shout"}, description = "대문자로 출력 여부")
    private boolean shoutMode;

    @Override
    public Integer call() {
        String message = "Hello, " + userName + "!";
        if (shoutMode) {
            message = message.toUpperCase();
        }
        System.out.println(message);
        return 0;
    }
}

3단계: 실행 진입점 작성

애플리케이션 진입점에서는 CommandLine 인스턴스를 생성하고 명령 객체를 등록한 후, 인수를 전달해 실행한다.

import picocli.CommandLine;

public class CLITool {
    public static void main(String[] args) {
        CommandLine cmd = new CommandLine(new GreetCommand());
        int exitCode = cmd.execute(args);
        System.exit(exitCode);
    }
}

4단계: 빌드 및 실행

프로젝트를 빌드한 후 터미널에서 다음과 같이 실행할 수 있다.

java -jar cli-tool.jar greet --name Alice --shout

출력 결과: HELLO, ALICE!

응용 예제: 복합 명령 구조

여러 하위 명령을 포함하는 CLI 도구는 다음과 같이 구성할 수 있다.

@Command(subcommands = {GreetCommand.class, EchoCommand.class})
public class MainCommand {}

이 경우 java -jar app.jar greet --name Bob처럼 하위 명령을 직접 호출할 수 있다.

태그: java Picocli cli Command Pattern Annotation Processing

6월 15일 00:45에 게시됨