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

Lego님의 프로필 이미지

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

DataSource 예제2 - 커넥션 풀

커넥션이 왜 10개가 만들어지는 것인가요?

해결된 질문

작성

·

885

·

수정됨

2

영상에서 커넥션이 10개 만들어지는 것을 보여주셨는데 반복해서 코드를 실행하지 않았는데 왜 10개가 만들어지는 건가요?

  1. datasource.setMeximumPoolSize(10);은 커넥션에 풀의 최대 크기를 10개로 지정하는 것 아닌가요? 이 코드만으로 최대 크기도 지정하면서 커넥션 10개 생성까지 할 수 있는 건가요?

  2. 실무에서도 보통 10개를 쓰신다고 말씀하셨는데 메이저 웹이나 어플일 경우 사용자 수가 기본 만 단위는 넘어갈텐데 10개로 다 커버가 가능한가요?

답변 1

1

안녕하세요, Lego 님. 공식 서포터즈 y2gcoder 입니다.

datasource.setMeximumPoolSize(10);은 커넥션에 풀의 최대 크기를 10개로 지정하는 것 아닌가요? 이 코드만으로 최대 크기도 지정하면서 커넥션 10개 생성까지 할 수 있는 건가요?

=> 이것은 기본 설정 때문에 그렇습니다. 스프링 부트에서 HikariCP의 기본적으로 생성하고 유지해놓을 커넥션 수는 커넥션풀의 최대 크기와 동일합니다. 그래서 최대 크기를 10으로 설정하면 10개를 미리 생성해놓고 시작합니다. 이는 minimum idle 값을 조정해주시면 변경하실 수 있습니다.

실무에서도 보통 10개를 쓰신다고 말씀하셨는데 메이저 웹이나 어플일 경우 사용자 수가 기본 만 단위는 넘어갈텐데 10개로 다 커버가 가능한가요?

=> 영한님께서도 말씀하셨듯이 다양한 상황에 따라 커넥션 풀의 개수는 변경될 수 있습니다. 사용자가 많은 웹, 앱이라면 커넥션 풀 개수를 증가해서 더 넉넉하게 잡을 수도 있고, 혹은 해당 애플리케이션을 여러 개의 서버에 구동해서 애플리케이션 서버 자체를 늘릴 수도 있습니다. 이는 회사의 정책, 자원, 사용하고 있는 서버, DB의 종류에 따라 달라지기 때문에 직접 테스트를 통해 조정하는 것이 맞다고 생각합니다.

감사합니다.

Lego님의 프로필 이미지
Lego
질문자

항상 친절한 답변 덕분에 도움이 많이 되고 있습니다.

질문이 하나 더 생겼는데 쓰레드 풀에서는 몇 천개를 생성하는데 커넥션 풀은 왜 적은 숫자로도 커버가 가능한 것인가요?

쓰레드 풀에서는 몇 천개를 생성하는데 커넥션 풀은 왜 적은 숫자로도 커버가 가능한 것인가요?

해당 질문은 요청이 많이 들어오는 웹 어플리케이션 서버에서 커넥션 풀을 10개 정도로 해도 감당이 가능할 지에 대해 질문 주신 것으로 이해했습니다. 답변은 프로젝트 성격이나 각종 상황에 따라 다를 수 있을 것 같습니다.

먼저 해당 링크(클릭)을 보시면 스프링 부트가 주로 사용하는 톰캣의 쓰레드 풀 에서 저장하는 쓰레드 수의 기본값은 200 정도라고 합니다. 그러면 기본적으로 쓰레드풀 200개, HikariCP의 커넥션 풀의 커넥션 수의 기본값은 10개 정도입니다.

이 기본값으로 사용자 몇천 명 혹은 만 단위까지도 감당할 수 있는 이유는 웹의 모든 사용자가 동시에 해당 웹으로 요청을 보내는 경우는 거의 없기 때문입니다. 다 같이 동시에 보내자고 약속하는 특수한 상황이 아니라면 사용자들 모두 동시에 요청을 보내는 경우는 흔하지 않습니다. 그러니 사용자보다 훨씬 적은 쓰레드 풀의 쓰레드 수와 커넥션 풀의 커넥션 수로도 감당할 수 있는 것입니다.

또한 요즘은 AWS, GCP, Azure 등 클라우드 서버를 많이 사용하게 되면서 스케일링 업하는 것이 예전보다 쉬워졌습니다. 그래서 요청이 폭증하거나 점점 더 많아지면 그냥 해당 서버 인스턴스를 하나 더 띄워버리면 서버 1개에서 받던 요청을 서버 2개에서 받아 부하를 분산할 수 있게 됩니다.

그래서 보통 200 : 10 정도로 기본값을 잡고 그 이상은 스케일링 업이나 테스트를 통해 적절하게 개수를 조정해준다는 점을 미리 말씀드립니다.

그래서 쓰레드 풀에 비해 커넥션 풀의 갯수가 적은 이유는 무엇이냐면 하는 역할이 다르기 때문입니다.

쓰레드풀은 기본적으로 동시 요청을 처리하기 위해 사용합니다. 쓰레드 풀의 크기가 많으면 많을 수록 더 많은 동시 요청을 처리할 수 있게 됩니다. 커넥션 풀은 데이터베이스 커넥션을 재사용하기 위해 사용합니다. 데이터베이스 연결에 드는 비용을 줄이기 위해서 사용하는 것입니다. 또한 DB 작업은 대부분 짧은 시간 안에 완료되기 때문에 커넥션 풀에서 여러 쓰레드가 동시에 연결하고 공유하는 것이 가능합니다.

요청 수에 DB 커넥션이 필요한 일이 비례할 수는 있으나 커넥션 풀의 본질적인 목적은 커넥션 비용을 줄이기 위함이라는 점에서 한 번 이해해보시면 좋겠습니다.

Lego님의 프로필 이미지

작성한 질문수

질문하기