-
Java: 어플리케이션 실행 옵션 비교 - VM Options / Program ArgumentsJava 2022. 7. 19. 11:59
Java: 어플리케이션 실행 옵션 방식 비교 - VM Options / Program Arguments
자바 어플리케이션은 여러 옵션을 가지고 실행될 수 있습니다. 이 글에서는 옵션들을 설정해주는 두 가지 방법에 대해 알아보고 비교해봅니다.
옵션의 활용과 비교
보통은 배포환경에 따라 별도의 property를 작성해두고, 경우에 따라 다른 property를 읽어가며 배포할 jar를 빌드하는 용도로 많이들 사용하곤 하죠. 아래에서도 해당 상황을 예시로 들어서 설명하려고 합니다.
1. VM Options
옵션을 주는 첫번째 방법은
VM Options
입니다.
이름에서 알 수 있듯이, 이 방법을 통해 전달한 키/값은 JVM에 전달됩니다.누구나 한 번 쯤 메모리 설정과 관련해서
-Xms 어쩌구..
또는-Xmx 저쩌구..
와 같은 코드(또는-XX:initialHeapSize=1g
와 같은...)를 얼핏이라도 본 기억이 있을 것 같은데요.-X
로 시작하는 파라미터를 통해서 메모리 관련 옵션을 설정할 수 있습니다.-D
로 넘겨진 파라미터는 System property로 설정됩니다.
Spring을 조금 만져보다보면-Dspring 어쩌구...
와 같은 설정도 쉽게 볼 수 있죠?(하다못해 복붙을 하다가도...)
저번에 머스태치 관련 블로깅을 하면서도 잠깐 이야길 했었는데, 시스템 프로퍼티는System.getProperty("키")
와 같은 형태로 어플리케이션에서 사용 가능합니다.한 가지 주의 사항이 있다면, 특정 클래스를 사용하려고 하는 경우에는 클래스명보다 옵션을 더 먼저 명시해주어야 하는 점이 있습니다.
2. Program Arguments
Program Arguments
를 통해서도 어플리케이션에 값을 전해줄 수 있습니다. 이를 통해 전달한 키/값은 main()이 실행될 때 함께 넘겨지는데요.
'main()
에 넘겨지는 것...?' 하고 생각해보면 누구나 알고 있는 파라미터... 바로String[] args
에 담겨서 프로그램이 시작될 때 전달되게 됩니다. 당연하게도,args
변수를 통해 사용이 가능합니다.직접 차이를 비교해보기
스프링 어플리케이션 jar 파일을 실행하면서 'local' profile을 읽도록 설정하고 싶은 상황입니다.
먼저 VM Options을 통해서 실행해 보겠습니다.java -jar .\build\libs\application-name-build-0.0.1-SNAPSHOT.jar -Dspring.profiles.active=local
그러면 어플리케이션이 실행될 때 이런 메시지를 만날 수 있습니다.
CAUTION: ...라고 하면서 실행메시지를 캡쳐한 이미지로 보여드리려고 했으나, 인텔리제이와의 설정 충돌로 비정상적인 메시지가 출력된다는 사실을 뒤늦게 깨닫고 삭제 수정 합니다(기존에 나왔던 메시지 내용은 '설정 파일을 찾을 수 없다'는 메시지 아래에 제대로 해당 설정파일 내용을 읽는 로그 내용이었음(그런데 사실은 제대로 읽어지지 않는 것이었음)). 인텔리제이를 사용하지 않고 gradle로 직접 빌드하고 실행하면 문제 없이 실행이 됩니다.
그럼 이번에는 Program Arguments를 통해 파라미터를 넘겨보겠습니다.
java -jar .\build\libs\application-name-build-0.0.1-SNAPSHOT.jar --spring.profiles.active=local
아래는 실행 직후의 로그입니다.
보시는 것처럼 어플리케이션이 실행 시점에 'local' 프로파일을 잘 찾아서 사용하는 것을 볼 수 있습니다.마무리
IDE에서 옵션값을 설정하면서 위 옵션 방식의 차이로 인해 혼동하기도 쉬운 것 같습니다(Program arguments 항목에
-D
옵션을 주거나, VM options 항목에--option
을 주는 등).
위 내용이 상황에 따라 적절한 방식으로 실행 옵션을 적용하시는 데에 도움이 되기를 바랍니다. 😃'Java' 카테고리의 다른 글
PS tip: 그래프 탐색의 자료구조 - ArrayDeque (3) 2022.07.26 Java: Arrays.fill()과 Arrays.setAll()의 차이 (1) 2022.07.12 Java: 오류Error와 예외Exception, Unchecked와 Checked (0) 2022.06.17 Java: Integer.parseInt()와 Integer.valueOf()의 차이점 구분 (2) 2022.06.06 Java: Comparable(compareTo())와 Comparator(compare())의 차이점 (0) 2022.05.17 Java: String[] split(regex, limit) 사용 예시 (0) 2022.05.17