주말이지만 오늘도 스프링 팀 프로젝트를 진행하게 되었다. 주중에 마무리하지 못한 부분이 있어서 모여서 여러가지 개발과 발표 준비 등을 진행했었다.
발표 자료를 준비하면서 실제 프로젝트 기간 중 겪었던 문제에 대해 정리를 하게 되었는데 여기에도 간단하게 정리해보았다.
1. 커넥션 풀
프로젝트를 진행하다보니 팀원들이 모두 하나의 같은 데이터베이스를 사용하게 되었다. 그러다가 다수의 팀원들이 DB와 연결이 불가능한 상황이 생겼다.
왜 이런 일이 발생했는지 원인을 알아보고, 해결해 본 과정에서 커넥션 풀이라는 개념을 알게되었다.
DB와 연결(Connection)을 맺고 해제하는 것은 상당한 비용이 들어가는 작업이다. 때문에 우리가 로컬에서 스프링 어플리케이션을 작동하면 위의 사진과 같이 DB와의 연결을 미리 만들어둔다. 만들어둔 연결을 풀에 보관하여 사용하게 된다. 요청이 들어오면 이 연결을 사용하고 사용이 끝난 뒤 반납하게 된다.
이 커넥션 풀을 이용하게 되면 여러 이점이 있다. 수 많은 요청이 들어올때마다 DB와의 연결을 맺고 해제하는 것은 너무나도 비용이 많이 드는 작업이기 때문에 서버에 부하가 심하게 걸릴 수 있다. 커넥션 풀을 이용하면 이런 부하를 줄이면서 빠른 속도로 DB와의 연결을 이용할 수 있다.
또한 서버의 한정적인 자원을 효율적으로 이용할 수 있다. 지정해 둔 커넥션 풀의 숫자만큼만 연결을 만들도록 제한을 할 수 있기 때문에 자원을 효율적으로 배분하여 사용할 수 있다.
여기까지가 커넥션 풀에 개념에 대한 간단한 정리였다. 그렇다면 직접 겪었던 문제가 무엇이었는지 한 번 적어보겠다.
팀원들이 작성한 코드를 테스트해보려고 DB에 접근하려고 할 때 오류가 발생했다.
오류 메시지는 'Max Client Connections Reached(최대 클라이언트 커넥션에 도달했다.)"였다. 이를 바탕으로 해결책을 찾아보다가 위의 커넥션 풀이라는 개념을 알게된 것이었다.
그렇다면 우리가 스프링 어플리케이션을 실행했을 때 연결이 몇 개나 생성되는지 어떻게 알 수 있을지를 찾아보았다. 수파베이스에서 직접 pg_stat_activity를 쿼리를 날려 확인하면 연결 정보를 확인할 수 있다.
스프링 어플리케이션을 실행해서 직접 확인해보면 맨 아래 10개의 행을 보면 "Postgresql JDBC Driver"로 10개의 연결이 생성되어 있음을 알 수 있다.(order by로 정렬한 것은 맨 아래에 10개가 뜨도록 정렬해서 캡처하기 위함이었다.)
스프링 어플리케이션에서 몇 개의 연결을 만드는지는 알아내었으니 이제 수파베이스에서 몇 개의 연결을 허용하는지를 알아보면 된다. DB 설정에 들어가면 쉽게 풀 사이즈를 확인하고 변경할 수 있다.
설정을 건드린 적이 없었고 기본 값으로 풀 사이즈가 15로 되어 있었다. 이제 원인을 쉽게 알 수 있다. 팀원 중에 2명만 어플리케이션을 각자 실행해도 이미 최대 풀 사이즈의 연결이 만들어진다. 따라서 그 뒤로 연결을 시도한 팀원들이 연결이 불가능했던 것이다.
그렇다면 해결 방법은 크게 두 가지가 있을 것이다.
먼저 스프링 쪽 설정 파일에서 최대 풀 사이즈를 지정해주어 풀 사이즈를 줄이는 것이다. 물론 나중에 어플리케이션을 실제 띄울 때는 다시 수정해주어야겠지만 풀 사이즈를 줄여주면 팀원들과 개발을 진행하면서 DB에 접근하는데 큰 문제는 없을 것이다.
또 다른 방법으로는 수파베이스에서 풀 사이즈를 늘려주는 것이다. 실제로 이 방법을 택해서 진행했다. 풀 사이즈를 넉넉하게 늘려주었더니 큰 문제없이 팀원들 모두 테스트를 진행할 수 있었다.
허무하리만치 간단하게 해결이 가능한 문제였지만, 그 과정을 통해서 여러가지 몰랐던 것들을 배울 수 있었다. DB와 우리가 만든 어플리케이션이 어떻게 연결되어있는지에 대한 내용도 전혀 모르던 내용이었고 한 번도 생각해 본 적 없는 내용이었다. 이렇게 오류와 문제를 해결해나가면서 여러 공부하는 것이 나중에 큰 도움이 될 것 같다.
2. 오늘 배운 것
- 커넥션 풀 개념에 대해 조금 더 찾아보고 알게되었다. 적절한 커넥션 풀 사이즈를 선택하는 법에 대해서도 나중에 더 공부해봐야겠다.
'오늘 배운 것' 카테고리의 다른 글
24-06-03 팀 프로젝트 회고 (0) | 2024.06.03 |
---|---|
24-06-02 정규 표현식 작성하기 (0) | 2024.06.02 |
24-05-31 Spring 팀 프로젝트 (4) (0) | 2024.05.31 |
24-05-30 Spring 팀 프로젝트 (3) (0) | 2024.05.30 |
24-05-29 Spring 팀 프로젝트 (2) (0) | 2024.05.29 |