Skip to content

Spring Shell #
Find similar titles

Structured data

Category
Programming

Spring Shell #

Spring Shell 프로젝트는 Spring 기반 프로그래밍 모델을 사용하여 사용자 정의 커맨드를 플러그인할 수 있는 대화식 쉘을 구현하는 방법을 제공한다. Spring Shell 프로젝트의 사용자는 Spring Shell jar에 의존하고, 자신의 커맨드를 추가하여 완전한 기능의 쉘 응용 프로그램을 쉽게 빌드 할 수 있다. 프로젝트의 REST API와 상호 작용하거나 로컬 파일 내용으로 작업할 수 있습니다. 일반적인 Spring 프로젝트처럼 Annotation을 활용하여 대부분 기능을 구현할 수 있으므로, 생산성 향상에 도움이 된다.

Spring Shell 특징 #

  • 사용자 정의 커맨드를 제공하는 간단한 Annotation 기반 프로그래밍 모델.
  • 명령 플러그인 전략의 기초로 Spring Boot 자동 구성 기능 사용.
  • 탭 완성, 색상화 및 스크립트 실행.
  • 명령 프롬프트, 쉘 히스토리 파일 이름의 사용자 정의 가능 및 결과 및 오류 처리 가능.
  • 클리어 스크린, 멋진 도움말, 종료와 같은 이미 내장된 커맨드 사용 가능.
  • ASCII 아트 테이블, 서식, 테두리, 장식 테두리 등.

주요 Annotation #

@ShellComponent #

@Component 계열로, @Controller와 비슷하게 어플리케이션 실행 시 해당 어노테이션을 가진 객체의 메서드들이 어플리케이션의 커맨드로 등록된다.

@ShellMethod #

@RequestMapping과 비슷하게, 해당 어노테이션을 가지는 메서드가 어플리케이션의 커맨드로 등록된다.

@ShellOption #

@RequestParam과 비슷하게, 어플리케이션 커맨드 파라메터를 메서드의 파라메터로 변환한다.

@CliCommand #

@ShellMethod 계열로, 주요 파라메터로 value와 help가 있다.

value: 등록할 커맨드를 지정한다.
help: 커맨드에 대한 설명을 지정한다.

@CliOption #

@ShellOption 계열로, 주요 파라메터로 key와 help가 있다.

key: 등록할 커맨드 파라메터를 지정한다.
help: 커맨드 파라메터에 대한 설명을 지정한다.

@CliAvailabilityIndicator #

커맨드 가용성 판단 메서드를 등록한다. value 파라메터를 갖는다.

value: 가용성을 설정할 커맨드를 지정한다.

주요 클래스 #

Bootstrap #

어플리케이션 설정 및 실행을 담당한다.

JLineShellComponent #

실행되는 어플리케이션의 컨텍스트이다.

DefaultPromptProvider #

쉘에 표시되는 프롬프트를 지정한다.

DefaultHistoryFileNameProvider #

쉘 히스토리를 저장하는 파일이름을 지정한다.

DefaultBannerProvider #

쉘 최초 실행시 표시되는 배너를 지정한다.

Converter #

커맨드 파라메터를 메서드에 inject시 파라메터 문자열을 특정 객체로 변환하는 방법을 지정한다.

Spring Shell 간단한 예제 #

어플리케이션 설정 및 실행 #

<beans ... >
    <context:component-scan base-package="com.insilicogen.cli" />
</beans>

어플리케이션 설정하는 방법은 일반적인 스프링 기반 프로젝트 설정하는 방법과 동일하다.

public static void main(String[] args) throws IOException {
    Bootstrap.main(args);
}
  • Spring shell 어플리케이션을 실행하기 위해서는 Spring config 파일을 스캔해서 적용해야 한다. Bootstrap 클래스를 이용하면, /META-INF/spring/spring-shell-plugin.xml 파일을 Spring config 파일로 읽어서 설정한다.
  • Bootstrap.main을 호출하면 어플리케이션이 실행된다.

커맨드 구현 #

@Component
public class SimpleCLI implements CommandMarker {

    @CliCommand(value = { "web-get", "wg" })
    public String webGet(
      @CliOption(key = "url") String url) {
        return getContentsOfUrlAsString(url);
    }

}
  • @Component 어노테이션을 사용하여 SimpleCLI 객체를 Spring Bean으로 설정하였다.
  • @CliCommand를 사용하여 해당 'webGet' 메서드를 어플리케이션의 'web-get' 커맨드로 등록하였다.
  • @CliOption을 사용하여 'webGet' 메서드의 'url' 파라메터를 'web-get' 커맨드의 '--url' 파라메터와 연결하였다.

커맨드 가용성 판단 #

private boolean adminEnableExecuted = false;

@CliAvailabilityIndicator(value = "web-get")
public boolean isAdminEnabled() {
    return adminEnableExecuted;
}

@CliCommand(value = "admin-enable")
public String adminEnable() {
    adminEnableExecuted = true;
    return "Admin commands enabled.";
}
  • @CliAvailabilityIndicator를 이용하여 쉘 컨텍스트의 상태에 따라 'web-get' 커맨드 실행할지 안 할지 설정할 수 있다.
  • 만약 'admin-enable' 커맨드 실행 전에 'web-get'을 실행한다면 'adminEnableExecuted'가 'false'이므로 'isAdminEnabled'라는 indicator에 의해 'web-get' 실행을 중지한다.

참고 #

0.0.1_20210630_7_v33