Spring Boot3 min read

Spring Boot server.port 우선순위: 파일·환경변수·실행 인자로 최종 포트 판단하기

2026년 11월 3일3 min read작성자 Flature

기본 설정에서는 설정 파일보다 OS 환경변수가, OS 환경변수보다 명령행 인자가 우선합니다. server.port를 세 곳에 다르게 지정하는 예제로 최종 값을 판단하고, 예상과 다를 때 확인할 조건을 설명합니다.

Spring Boot server.port 우선순위: 파일·환경변수·실행 인자로 최종 포트 판단하기

Spring Boot의 기본 설정에서 같은 server.port를 설정 파일·OS 환경변수·명령행 인자에 모두 지정하면 명령행 인자의 값이 적용됩니다. 세 소스만 비교하면 우선순위는 명령행 인자 > OS 환경변수 > 설정 파일입니다.

설정 파일을 바꿔도 포트가 달라지지 않는 이유

Spring Boot는 여러 설정 소스를 Spring Environment에 모으고, 같은 속성이 겹치면 소스의 우선순위에 따라 값을 결정합니다. 파일을 마지막에 수정했다고 그 값이 우선하는 것은 아닙니다.

이 구조를 이용하면 파일에 공통 기본값을 두고 실행 환경마다 환경변수로 바꾸거나, 한 번의 실행에만 명령행 인자로 다른 값을 지정할 수 있습니다. 반면 파일만 읽어서는 실제 적용값을 알기 어려우므로 실행 조건도 함께 확인해야 합니다.

세 가지 표기를 같은 속성으로 비교하기

설정 소스 지정 예 세 소스 사이의 우선순위
application.properties server.port=8081 낮음
OS 환경변수 SERVER_PORT=8082 중간
명령행 인자 --server.port=8083 높음

환경변수에서는 server.port에 대응하는 이름으로 SERVER_PORT를 사용합니다. 기본적으로 SpringApplication은 --로 시작하는 옵션 인자를 속성으로 변환하여 Environment에 추가합니다.

  1. 실행 인자에 --server.port가 있으면 그 값을 선택합니다.
  2. 해당 인자가 없으면 실행 프로세스에 전달된 SERVER_PORT를 확인합니다.
  3. 둘 다 없으면 로드된 설정 파일의 server.port를 확인합니다.

이 판단 순서는 다른 설정 소스가 같은 속성을 덮어쓰지 않는다는 전제에서 사용합니다.

예제: 8081·8082·8083 중 어떤 값이 적용되는가

Java로 실행 가능한 Spring Boot 웹 애플리케이션 app.jar가 준비되어 있고, 명령행 속성 처리를 비활성화하지 않았다고 가정합니다. 아래 실행 구문은 Bash 같은 유닉스 계열 셸 기준입니다. 다른 설정 파일이나 시스템 속성, 테스트 설정 등에서는 포트를 지정하지 않습니다.

먼저 JAR를 실행할 작업 디렉터리의 application.properties에 다음 값을 둡니다. 기본 설정 검색 위치를 변경하지 않았다면 현재 디렉터리의 이 파일은 로드 대상입니다.

server.port=8081

이어서 환경변수와 명령행 인자를 함께 지정해 실행하는 예입니다.

SERVER_PORT=8082 java -jar app.jar --server.port=8083

이 구문은 해당 Java 프로세스에 환경변수 SERVER_PORT=8082를 전달하고, 애플리케이션 인자로 --server.port=8083을 넘깁니다. 예상되는 최종 server.port 값은 8083입니다. 환경변수가 파일 값보다 우선하지만, 명령행 인자가 환경변수보다 다시 우선하기 때문입니다.

같은 파일을 두고 실행하는 구문 예상 server.port 판단 이유
SERVER_PORT=8082 java -jar app.jar --server.port=8083 8083 명령행 인자 우선
SERVER_PORT=8082 java -jar app.jar 8082 명령행 지정이 없어 환경변수 적용
java -jar app.jar 8081 SERVER_PORT도 전달되지 않았다면 파일 값 적용

마지막 행은 셸에 이미 설정된 SERVER_PORT도 없다는 전제입니다. 명령 앞에서 환경변수 지정을 생략하는 것만으로 기존 환경변수가 제거되지는 않습니다.

예상과 다를 때 확인할 조건과 적용 범위

  • 명령행 속성 처리 여부: 애플리케이션에서 SpringApplication.setAddCommandLineProperties(false)를 호출했다면 --server.port가 기본 방식으로 Environment에 추가되지 않습니다.
  • 프로세스에 전달된 환경변수: 설정을 편집한 셸과 실제 애플리케이션 실행 환경이 같은지 확인합니다. 비교 대상은 Java 프로세스가 전달받은 SERVER_PORT입니다.
  • 실제로 로드된 파일: 외부 파일과 프로파일별 파일 등 여러 설정 파일이 있으면 파일 사이에도 우선순위가 있습니다. 먼저 파일 계층에서 선택되는 값을 파악한 뒤 환경변수·명령행 인자와 비교합니다.
  • 다른 설정 소스: Java 시스템 속성, SPRING_APPLICATION_JSON, 테스트용 속성 등도 우선순위에 참여합니다. 세 소스의 비교표가 Spring Boot 전체 설정 순서를 뜻하지는 않습니다.

추가 진단이 필요하면 Actuator의 env와 configprops 엔드포인트가 속성의 출처나 바인딩 확인에 도움이 될 수 있습니다. 다만 사용 가능 여부와 노출 설정을 확인해야 하며, 값은 기본적으로 마스킹되므로 조회만으로 원래 값이 보인다고 가정하면 안 됩니다.

포트가 예상과 다르면 파일 수정부터 반복하기보다 실제 실행 인자와 프로세스 환경변수를 먼저 대조하세요. 선택된 값과 그 출처를 함께 기록하면 다음 실행에서도 같은 기준으로 판단할 수 있습니다.

참고한 공식 문서

이어서 확인할 내용