인프런 커뮤니티 질문&답변

고규천님의 프로필 이미지

작성한 질문수

토비의 스프링 부트 - 이해와 원리

프로퍼티 빈의 후처리기 도입

Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의

작성

·

206

0

 server.contextPath=/app 처럼

/ 이후 아무 텍스를 넣고 port 값은 설정하지 않은 상태에서

실행을 하게 되면 아래와 같이 포트가 랜덤하게 설정됩니다.

실행할때마다 포트 번호가 다르게 할당됩니다.

Tomcat started on port(s): 33745 (http) with context path '/app'

어떤 부분에서 이렇게 랜덤한 포트를 설정해주는지 궁금합니다.

답변 5

0

고규천님의 프로필 이미지
고규천
질문자

앗 ㅎㅎ

Inet 까지 가게될줄은 몰랐네요!! 

server.port=

혹시 몰라 이렇게 해봤더니 이번에는 Null 값으로 인식되어서 실행이 안되네요..

아무 생각없이 잘 되어 있으니깐 쓰면 되겠지 하면서 오다가 이번에 토비님 강의를 꼼꼼히 보면서 역시나 겸손해야겠구나 다시 생각하게 됩니다.

제 질문에 하나하나 신경써주셔서 너무나 감사드립니다!!

0

토비님의 프로필 이미지
토비
지식공유자

질문해주신 덕분에 부트의 내부 구현을 자세히 살펴볼 수 있었습니다. 🙂

프로퍼티에 port를 넣지 않으면 port = 0 으로 설정한 것과 마찬가지입니다. int 타입이기 때문에 디폴트 값인 0이 들어가겠죠. 실제로 server.port=0으로 해도 동일하게 랜덤한 포트로 톰캣이 실행됩니다. 스프링 부트의 가이드에도 비슷한 설명이 있습니다.

 

그러면 port = 0이면 왜 랜덤 포트가 뜰까요. 저도 궁금해졌습니다. 0번 포트는 실제 사용되지 않기 때문에 랜덤 포트로 대체하게 되는데 이걸 누가하는 걸까요.

세 가지 후보가 있습니다.

  • 스프링 부트의 톰캣 자동 구성 기능

  • 톰캣 서버 구현

  • 자바 네트워크 라이브러리

디버거를 이용해서 하나씩 추적해보니 port = 0을 다루는 코드는 부트와 톰캣에는 없었습니다. 최종적으로 네트워크 서버를 만들 때 사용하는 SocketServer에서 서버 주소(IP)와 포트를 가지고 있는 InetSocketAddress 오브젝트를 만드는데요. 그 내부의 코멘트에 힌트가 있습니다.

 


    /**
     * Creates a socket address where the IP address is the wildcard address
     * and the port number a specified value.
     * <p>
     * A valid port value is between 0 and 65535.
     * A port number of {@code zero} will let the system pick up an
     * ephemeral port in a {@code bind} operation.
     *
     * @param   port    The port number
     * @throws IllegalArgumentException if the port parameter is outside the specified
     * range of valid port values.
     */
    public InetSocketAddress(int port) {
        this(InetAddress.anyLocalAddress(), port);
    }

디버깅을 해보면 port = 0 값은 이 생성자까지 넘어오는데 위에 설명이 있듯이 포트가 0인 경우엔 시스셈이 바인딩이 가능한 임의의 포트를 하나 고르게 되어있습니다.

포트를 0번으로 서버를 띄우려고 하면 자바 네트워크 라이브러리와 OS 레벨에서 사용가능한 랜덤한 포트를 선택하는 방식으로 되어있네요. 톰캣과 스프링 부트는 그걸 그대로 사용하는 것입니다.

 

 

0

고규천님의 프로필 이미지
고규천
질문자

https://github.com/k2c-repo/test-spring-boot.git
dev 브랜치 입니다.

프로퍼티에서 server.port 부분을 설정하지 않고 해보시면 됩니다.

0

토비님의 프로필 이미지
토비
지식공유자

흠, 그런데 생각을 해보니 랜덤 포트는 주로 테스트할 때 적용하는 방식인데요. 테스트가 아니고 애플리케이션을 실행했는데 랜덤 값이 나왔다면 이건 처음 보는 현상이네요. 랜덤 포트로 실행되는 프로젝트를 공유해주시면 어디서 그렇게 되는지 한번 추적을 해보겠습니다.

0

토비님의 프로필 이미지
토비
지식공유자

스프링 부트에서 기본적으로 제공하는 톰캣 서버 자동구성 클래스에서 포트 넘버를 프로퍼티로 제공하는 방법과 랜덤 포트 등을 지원합니다. 스프링 부트의 톰캣 포트 지정 방식에 대해서는 스프링 부트 레퍼런스 문서에서 찾아보실 수 있습니다.