Spring Shell
#
Find similar titles
- (rev. 6)
- ecjang
Structured data
- Category
- Programming
Table of Contents
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' 실행을 중지한다.