포스트

2021-11-16-TIL

Today I Learned

Console Application With Spring Boot

Spring Boot라고 하면 웹 서버부터 떠올리지만, 웹 없이 한 번 실행하고 끝나는 콘솔 애플리케이션도 만들 수 있다. 필요한 것은 두 가지다. 시작 후 실행할 코드를 넣을 자리와, 웹 서버를 띄우지 않게 하는 설정이다.


시작 후 실행할 코드: CommandLineRunner와 ApplicationRunner

Spring Boot는 CommandLineRunner나 ApplicationRunner를 구현한 빈을 찾아 SpringApplication.run(...)이 끝나기 직전에 실행한다. 두 인터페이스는 인자를 받는 방식만 다르다. CommandLineRunner는 명령행 인자를 문자열 배열 그대로 받고, ApplicationRunner는 --name=value 같은 옵션을 파싱해 둔 ApplicationArguments로 받는다. 러너가 여러 개면 @Order로 실행 순서를 정한다.

1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootApplication
public class ConsoleApp implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ConsoleApp.class, args);
    }

    @Override
    public void run(String... args) {
        System.out.println("args = " + Arrays.toString(args));
    }
}

웹 서버 끄기

클래스패스에 spring-boot-starter-web이 있으면 Spring Boot는 내장 톰캣을 띄우고 요청을 기다리므로 프로세스가 끝나지 않는다. 콘솔 애플리케이션이라면 웹 스타터를 빼거나, 애플리케이션 타입을 NONE으로 지정한다.

1
spring.main.web-application-type=none

코드로는 SpringApplication.setWebApplicationType(WebApplicationType.NONE)을 호출해도 같다. 이렇게 하면 러너가 끝난 뒤 실행 중인 비데몬 스레드가 없을 때 프로세스가 자연스럽게 종료된다. 종료 코드를 지정해야 하면 ExitCodeGenerator 빈을 두고 System.exit(SpringApplication.exit(context))처럼 SpringApplication.exit(...)이 돌려준 코드를 System.exit(...)에 넘긴다.

참고한 자료외부 출처 1

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다