2021-11-16-TIL
Today I Learned
Console Application With Spring Boot
- https://www.baeldung.com/spring-boot-console-app
- Running Spring Boot console application under IDE & Maven
- https://stackoverflow.com/questions/28199999/how-does-a-spring-boot-console-based-application-work
- https://recordsoflife.tistory.com/385
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
외부 출처
댓글
아직 댓글이 없습니다