JLine 및 ConsoleUI를 갖춘 대화형 Java 콘솔

블로그

홈페이지홈페이지 / 블로그 / JLine 및 ConsoleUI를 갖춘 대화형 Java 콘솔

May 01, 2024

JLine 및 ConsoleUI를 갖춘 대화형 Java 콘솔

작성자: Matthew Tyson 소프트웨어 설계자, InfoWorld | 명령줄 인터페이스(CLI)는 소프트웨어 개발의 내부 세계입니다. 쉘에서 우리는 모든 운영 체제에 직접 접근할 수 있습니다.

매튜 타이슨

소프트웨어 설계자, InfoWorld |

명령줄 인터페이스(CLI)는 소프트웨어 개발의 내부 세계입니다. 셸에서 우리는 운영 체제의 모든 기능에 직접 액세스할 수 있으며 이를 통해 소프트웨어의 모든 측면을 구성하고 조정할 수 있는 능력이 제공됩니다. 많은 도구와 프레임워크에는 명령줄이 통합되어 있습니다. 그뿐만 아니라, 명령 프롬프트는 소프트웨어 시스템 작업의 근본 마법입니다. 거의 무한한 가능성이 있는 곳이죠.

이 기사에서는 Java로 정교한 대화형 명령줄 인터페이스(CLI) 애플리케이션과 REPL(읽기-평가-인쇄 루프 또는 대화형 셸)을 구축하는 방법을 살펴보겠습니다. Java로 기본 데모 애플리케이션을 설정하고 JLine 및 ConsoleUI 라이브러리를 사용하여 필요한 기능을 추가하겠습니다.

우리의 데모는 소프트웨어 프로젝트의 작업 디렉토리를 검사하고 그곳에서 프로젝트에 대한 정보를 수집하는 이론적 응용 프로그램을 기반으로 합니다. 응용프로그램은 또한 디렉토리에 새 프로젝트를 생성할 수도 있습니다. 예제 애플리케이션은 탭 완성이 가능한 explain과 create라는 두 가지 명령을 받아들이는 REPL을 시작합니다. explain 명령은 색상 코딩(필요한 경우 페이징 사용)으로 작업 디렉터리의 폴더 계층 구조를 나열하는 반면, create는 사용자가 만들 프로젝트 종류(Java, JavaScript 또는 Python)를 선택할 수 있는 대화형 메뉴를 시작합니다. Java 애플리케이션인 경우 사용자가 추가할 수 있는 추가 기능(데이터베이스 또는 REST API)을 다중 선택하여 중첩된 메뉴를 볼 수 있도록 허용합니다.

실제로 구현하기보다는 이러한 기능을 사용하여 JLine 기능을 살펴보겠습니다.

이 둘러보기를 위해서는 Java JDK 및 Maven이 설치되어 있어야 합니다. 목록 1에 표시된 것과 같이 Maven 원형을 사용하여 새로운 애플리케이션을 작성하는 것부터 시작하겠습니다.

Maven은 이 명령을 사용하여 새 프로젝트를 레이아웃합니다. 더 진행하기 전에 목록 2에서 수행한 것처럼 필요한 모든 종속성을 추가하고 Java 버전을 11(Java 8 이후의 모든 버전이 작동해야 함)로 설정하겠습니다. 이는 pom에 적용됩니다. .xml 파일을 프로젝트 루트에 저장합니다(나머지 pom.xml은 그대로 둡니다).

다음으로 src/main/java/com/infoworld/App.java의 메인 클래스를 수정하여 REPL 루프를 시작하겠습니다. 목록 3의 코드를 사용하여 App.java를 수정합니다.

목록 3은 사용자 입력 줄을 감시하고 이를 다시 에코하는 매우 간단한 프로그램을 만듭니다. 여기에 우리가 지원하고 설명하고 생성하는 두 가지 명령을 보유하는 "완료자"를 추가했습니다. 즉, 사용자가 프롬프트에 입력할 때 탭하여 이러한 명령을 완료할 수 있습니다. 두 번 탭하면 사용 가능한 명령이 포함된 메뉴가 제공됩니다. JLine은 유창한 스타일의 .completer(new StringsCompleter("describe", "create")) 메서드 호출을 사용하여 이를 매우 쉽게 만들었습니다. JLine에는 문자열 외에도 여러 내장 완성자가 있으며 직접 작성할 수도 있습니다.

본질적으로 REPL은 사용자가 종료에 들어가면 중단되는 무한 while 루프입니다.

목록 4에 표시된 Maven exec:java 명령을 실행하여 테스트할 수 있습니다.

당근 프롬프트, 에코 응답 및 탭 완성 명령이 표시됩니다.

이제 자동 완성과 함께 작동하는 echo REPL이 있으므로 실제로 명령을 처리해 보겠습니다. 입력된 문자열을 명령과 비교하고 각각에 대한 메서드를 호출하여 일반적인 Java를 사용하여 이를 수행합니다. 지금은 create가 아무 작업도 수행하지 않지만 목록 5에 표시된 대로 디렉터리 계층 구조를 출력하는 논리를 구현하겠습니다.

이제 애플리케이션을 실행할 때 explain 명령을 입력하면 들여쓰기 형식의 작업 디렉터리 목록이 표시됩니다. 해당 문자열을 구성하는 작업은 getDirectoryHierarchy()에서 발생합니다. 이 메소드는 java.nio.file 패키지의 일반 Java를 사용하여 디렉토리를 탐색하고 각 파일과 디렉토리를 출력하며, 아래로 내려가는 디렉토리의 각 레벨에 대해 공백을 들여씁니다. 이 작업은 주로 path.relativize(p).getNameCount()를 사용하여 수행됩니다. 현재 경로(.)에서 현재 경로에 대한 상대 경로(예: ./src/main/java)를 제공합니다. getNameCount()는 해당 경로에 있는 이름의 수(이 경우에는 3개)만 계산합니다. 각 이름에 공백을 추가합니다.