[TestCode/Spring] RANDOM_PORT

2024. 3. 9. 14:18Dev/TestCode

 

📝 공부하며 여러 글을 검색하고 정리해서 작성하느라, 틀린 부분이 있을 수 있습니다. 참고해주세요~!

 

 

TDD 활용한 코드를 작성하는 강의를 보다가... 다음과 같은 코드를 만나게 되었습니다.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

 

그래서 문득 궁금한 점이 생겨서 내용들을 정리하게 되었습니다.

 

 

1. 왜 랜덤 포트를 사용하는가?

 

- 포트를 하나만 지정해서 사용할 경우, 포트 충돌이 발생할 수 있습니다.

- 랜덤 포트를 사용하게 되면, 여러 테스트들을 병렬 수행 가능합니다.

 

2. 어떻게 랜덤 포트를 사용하는가?

 

포트 번호를 System.out.println();을 통하여 출력하였습니다! 저는 SpringBoot 3.2.3과 JAVA 17 사용했는데요!

 

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.server.LocalServerPort;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class test {

    @LocalServerPort
    int port;

    @Test
    public void portTest(){
        System.out.println("RANDOM_PORT? " + port);
    }

}

 

스프링부트에 내장되어 있는 톰캣 포트 번호가 8080이 기본값이지만, 다음과 같이 포트 번호가 랜덤으로 설정된 것을 확인할 수 있었습니다. 포트 번호는 서버 다시 시작할 때마다, 변경되는 것을 확인할 수 있습니다.

 

3. 주의할 점은?

 

- RANDOM_PORT를 사용할 경우 다음과 같은 상황이 발생한다고 합니다.

 

'별도의 쓰레드에서 스프링 컨테이너가 실행된다.'

'스프링 컨테이너가 실제로 구동되어 테스트와 다른 쓰레드에서 실행되니 하나의 트랜잭션으로 묶일 수 없는 것이다'

 

즉, 롤백되지 않을 수 있다고 합니다!! 그래서 사용할 때 생각하면서 사용하는 게 좋습니다.

 

4. MOCK과의 차이점

 

랜덤 포트에 대해 찾아보다가, 'SpringBootTest.WebEnvironment.MOCK'을 알게 되었습니다.

MOCK RANDOM_PORT
- 내장 톰캣 구동을 안함
- 대신 가짜 서블릿 컨테이너를 띄움
- 내장되어 있는 톰캣이 구동됨
- 서블릿 컨테이너가 랜덤 포트 위에서 실시

 

 

References

1. RANDOM_PORT를 하는 이유

2. @Transactional로 롤백되지 않는 이유

3. @SpringBootTest [공식 문서]

4. Springboot Test