
프로젝트 개발중 Too Many Connections 오류가 떴습니다. 처음 보는 에러이기도 하고, 애초에 디비나 aws 서버에 접근이 되지 않았습니다.

RDS를 사용하기 때문에 서버를 사용중인 다른 인원들에게 실행하고 있는 프로젝트를 종료시키라 하고, 제가 다시 접속해보았습니다.
다른 인원이 사용하면 지금 보는 것처럼 빨간색 네모칸은 에러가 뜨고, 혼자 접속한다면 그 아래처럼 뜨지 않습니다.
프로젝트 팀원끼리 RDS서버를 사용하는데 한 명이라도 서버를 실행하면 다른 인원들은 Too Many Connections 오류가 뜬다는 것을 확인했습니다.
첫 번째 RDS 문제라고 생각했습니다.
프로젝트를 실행 시킨 뒤 'SHOW PROCESSLIST'로 현재 사용중인 스레드에 대한 정보를 확인했습니다.

실행을 하면 매우 많은 스레드가 생겨있습니다.
애플리케이션을 실행할 때 많은 스레드가 생성되고 데이터베이스 연결이 Sleep 상태로 유지되는 문제를 경험했습니다.
이 문제는 RDS의 max_connections와 wait_timeout 설정을 조정한다 하더라도 사용자가 많아지면 동일하게 발생할 수 있습니다. JPA를 사용하기 때문에 데이터베이스 연결을 직접적으로 관리하지 않지만, 애플리케이션 코드에 문제가 있을 가능성이 높다고 판단했습니다.
원인은 여러가지 문제로 인하여 생길 수 있다고 판단하였습니다. 코드 문제, 데이터베이스 설정 문제 등 여러가지 원인을 고려하여 설정을 하도록 하였습니다.

wait_timeout과 interactive_timeout 값이 28800초(8시간)로 설정되어 있기 때문에, 유휴 상태의 연결이 오랫동안 Sleep 상태로 유지되고 있었습니다.
즉 , 각각의 timeout 설정을 변경하였습니다.
SET GLOBAL wait_timeout = 600;
SET GLOBAL interactive_timeout = 600;
다음과 같이 설정을 변경해주고, 현재 스레드모두 KILL을 한다음 다시 실행했습니다.
그런데 동일하게 Sleep상태로 스레드가 동일하게 매우 많이 나왔습니다.
저는 프로젝트의 코드가 문제가 있다고 판단하였습니다.
문제가 될 만한 코드들을 확인하였습니다.
SignServiceImpl과 메인 기능인 BlockServiceImpl의 메서드들에 @Transactional 어노테이션이 빠져 있었습니다. 데이터베이스와 상호작용하는 메서드이기 때문에 트랜잭션으로 관리를 해야 한다고 판단하였지만, 모두 @Transactional 어노테이션이 빠져 있었기 때문에, 트랜잭션이 끝날 때 데이터베이스 연결이 자동으로 반환되지 않아서 많은 스레드가 유휴 상태로 남아 있게 되었다고 생각하였습니다.
데이터베이스와 상호작용되는 메서드들을 트랜잭션으로 관리하기 위하여 @Transactional 어노테이션을 추가하고 다시 확인하였습니다.

이렇게 하나의 스레드만 생긴 것을 확인하였습니다. 그렇다면 다른 팀원들도 이 서버에 접속을 할 수 있어야 합니다.
2명의 팀원들도 프로젝트를 실행 시켜 접속하게 하였습니다.

저 포함하여 팀원 2명 총 3명이 rds에 접속했고,
사진 처럼 스레드 3개가 생겼습니다.즉, 현재 3개의 유휴 연결이 있으며, 이는 트랜잭션 관리가 제대로 되고 있음을 나타냅니다.
즉, 트랜잭션 어노테이션 추가 후 데이터베이스 연결이 적절히 관리되고 있으며, 유휴 상태의 스레드가 적절히 반환되는 것을 확인할 수 있습니다. 이는 성공적인 결과입니다.
처음 보는 에러를 마주쳐도 당황하지 말고, 여러가지 원인을 정리한 후 하나씩 설정 및 수정을 하면 해결할 수 있다는 자신감을 얻었습니다.
또한 코딩을 더욱더 신중하게 해야겠다는 마음가짐이 생겼습니다.