2024. 3. 9. 14:18ㆍDev/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
'Dev > TestCode' 카테고리의 다른 글
| [Spring/TestCode] WebMvcTest or SpringBootTest(+AutoConfigureMockMvc) (1) | 2025.03.10 |
|---|---|
| [TestCode/Spring] TestCode에 Lombok 사용하기 (0) | 2024.03.10 |
| [TestCode/IntelliJ] show passed / test coverage (0) | 2024.03.09 |
| [TestCode] JUnit Test (0) | 2023.09.13 |