WEB/back-end

[Spring] Spring Shell과 profile로 분리하기

메징징 2021. 3. 9. 23:30
반응형

 

Spring Shell

스프링 쉘은 스프링에서 커맨드 어플리케이션을 쉽게 만들 수 있도록 제공하고 있습니다.
특히 버전 2부터 스프링 부트에 적합하게 개선되어 저도 버전 2를 사용해서 구현했습니다.

 

Dependency 추가

pom.xml에 의존성을 추가해서 간단하게 사용할 수 있습니다 :)

<dependency>
    <groupId>org.springframework.shell</groupId>
    <artifactId>spring-shell-starter</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

 

커맨드 작성하기

커맨드 메소드를 작성할 클래스에 @ShellComponent 어노테이션을 붙여주고, 메소드에는 @ShellMethod를 붙여줍니다.

@ShellComponent 의 경우 어플리케이션 실행시

해당 어노케이션을 가진 객체의 메서드(@ShellMethod)가 커맨드로 등록됩니다.

 

메서드명이 입력하는 커맨드가 되지만 어노테이션에 key옵션을 설정해주면 key를 통해 커맨드를 입력할 수 있습니다.
메서드의 파라미터를 통해 커맨드 입력시 인자를 받아올 수 있습니다.

@ShellMethod(value = "예매 내역 조회", key = "rsvs")
public String getBookingList(String memberId) {

     StringBuilder result = new StringBuilder();

    //TODO 

    return result.toString();
}

 

profile 설정하기

저는 cli로 profile을 사용하기 위해 application-cli.properties를 새로 작성했습니다.
profile을 사용하면 환경별로 설정을 다르게 해줄 수 있는데,
기본적으로 apllication.properties를 바탕으로 하고, 활성화시킨 profile을 오버라이딩하게 됩니다.

db나 다른 설정은 동일하게 사용할 것이기 때문에

웹서버를 사용하지 않겠다는 설정만 apllication-cli.properties 아래와 같이 추가했습니다.

spring.main.web-application-type=NONE

그리고 기본적으로 cli를 profile을 활성화 했을 때만 cli를 사용하고 싶기 때문에 각각의 properties에 아래와 같이 활성화/비활성화 설정도 추가해주었습니다.

spring.shell.interactive.enabled = true/false

 

cli 실행하기

실행시에는 IDE에 profle을 설정하는 방법을 여러가지 적용했으나 하나도 되지 않았습니다...

 

메인 메서드에 아래 코드를 추가해서 활성화 시키는 방법을 쓰기도 했지만,

System.setProperty("spring.profiles.active", "cli");

그냥 커맨드로 입력하는게 편해서 아래처럼 빌드 후 -Dspring.profiles.active=cli 옵션을 추가해 실행시켜주었습니다.

$ ./mvnw clean package -DskipTests
$ java -jar -Dspring.profiles.active=cli target/moviedapanda-web-0.0.1-SNAPSHOT.war

참고로 REPL이 작동해서 테스트가 돌아가지 않기 때문에
start.spring.io에서 생성한 sample integration test를 삭제하거나 -DskipTests을 입력해 테스트를 건너뛰고 빌드해주어야 합니다.

 

참고로 저는 기본 명령어를 해제하지 않았기 때문에 그대로 사용 가능합니다.

필요없거나 수정하고 싶다면 비활성화하거나 오버라이딩해서 사용가능하다고 합니다.

 

 

 

 

자세한 내용은 아래 공식 문서에서 확인할 수 있습니다.

[참고] Spring Shell Reference Documentation