정신건강 자가테스트와 병원 예약/진료 기록을 제공하는 서비스
4명, 2025-08 ~ 2025-10
| 구분 | 사용기술 |
|---|---|
| 프론트엔드 | JSP / Jquery |
| 백엔드 | Java / MyBatis |
| 서버 | Apache Tomcat |
| 데이터베이스 | MariaDB |
서버를 갓 실행했을 때는 모든 기능이 정상 작동하지만, 데이터베이스 접근이 포함된 로직을 여러 번 반복 수행하면 특정 시점부터 Too many connections라는 에러가 발생하면서 서버가 응답을 멈췄다.
맡은 기능을 테스트 할 때는 서버를 재실행 시켜가면서 했기 때문에 이런 상황이 발생할거라 예상하지 못했지만, 전체적으로 테스트를 해봤을때 발견한 문제였다.
데이터베이스 접근을 담당하는 모든 DAO 객체에서 MyBatis의 SqlSessionFactory.openSession()을 호출하여 SqlSession을 생성했으나, 사용이 끝난 후 이를 명시적으로 닫아주는 close()로직이 존재하지 않았다.
MyBatis의 SqlSession은 생성 시 데이터베이스 커넥션 객체를 점유하게 되는데, 이를 반환하지 않을 경우 해단 커넥션은 사용중인 상태로 계속 남게 된다.
그래서 점점 쌓이면서 최대 커넥션 수를 넘었고, 더 이상 새로운 연결이 불가능해서 Too many connections 에러를 발생시키게 된 것이다.
close()를 호출하지 않아도 블록 종료 시점에 커넥션이 자동으로 반납되도록 보장했다.Too many connections 에러가 완벽히 해결되었다.병원 입점 신청이라는 기능에서 사이트 관리자가 병원의 사업자 등록증을 볼 수 있도록 PDF 뷰어 기능으로 구현하기 위해 pdf.js 라이브러리를 사용하려던 중, 라이브러리가 업데이트 되면서 기존에 사용하던 핵심 객체가 undefined로 정의되지 않았다고 에러메시지가 나타났다
pdf.js 라이브러리의 업데이트로 인해 기존 구조가 변경된 것을 확인 했고, 업데이트 된 방식에 맞춰 코드를 수정하려고 했지만, 프로젝트 마감 기한이 얼마 남지 않은 상황에서 불확실한 외부 라이브러리의 버그 수정을 하는 것 보다, 더 확실하고 안정적인 대안이 필요하다고 판단했다.
브라우저가 달라도 일관된 디자인의 pdf 뷰어를 제공하고 싶었지만, 시간이 많이 남아있지 않아서 특정 라이브러리에 의존하는 대신, 브라우저 표준 기술인 <iframe> 태그를 활요하는 방식으로 구조를 변경했다.
프레임워크 본질 이해
Spring 프레임워크를 사용하지 않고 Servlet/JSP로만 프로젝트를 진행했는데, 프레임워크가 개발자를 대신해서 의존성 관리와 반복적인 설정 코드를 자동화해 주는 것이 단순한 편리함을 넘어 핵심 로직에 집중할 수 있도록 도와주는 환경이라고 느껴졌다.
리소스 제어의 책임감
DB 커넥션을 직접 제어하면서 수동 관리의 위험성과 리소스 누수가 시스템 마비로 이어지는 과정을 경험했다. 작은 실수가 시스템 전체의 리스크가 될 수 있다는 것을 체감했고, 백엔드에서 자원의 관리도 핵심적으로 중요하다는 것을 알게 되었다.
try-with-resources 구조를 개별적으로 작성해서 DB 커넥션을 반환하고 있는데, 커넥션 객체를 안전하게 닫고 예외를 통합 처리하는 전역적 자원 반납 메서드를 설계하여 중복 코드를 제거 하는 방향으로 업데이트pdf.js의 최신 API 구조를 완벽히 파악하고, 브라우저 환경에 의존하지 않는 독자적인 커스텀 PDF 뷰어를 생성해서 일관된 디자인으로 제공