DB 풀을 닫을 때 나는 주로 close 를 사용했는데, freeConnection 도 있다는 것을 알게됐다.
close() 와 freeConnection() 은 모두 연결을 종료하는 메서드이다. 하지만 사용되는 문맥에 따라 차이가 있다는 것을 알았는데, 구체적으로 알고 사용하고 싶어 정리해봤다.
커넥션을 닫아주거나 풀어주지 않으면 발생하는 문제
"Connection Pool Exception: Cannot get a connection, pool error Timeout waiting for idle object" 과 같은 문제가 발생할 수 있다.
close()
일반적으로 데이터베이스 연결 또는 네트워크 소켓 연결과 같은 리소스를 해제하는데 사용한다. 이 메서드를 호출하면 해당 연결이 완전히 닫히고, 해당 리소스가 시스템에 반환된다. 일반적으로 close() 를 호출한 후에는 해당 연결을 다시 열 수 없다.
close() 의 단점
close()는 데이터베이스 연결을 닫기 때문에, 다시 사용하기 위해서는 열어야 한다. 데이터베이스 연결을 자주 열고 닫을 경우 다음과 같은 문제가 발생할 수 있다.
- 성능 저하: 데이터베이스 연결을 맺는 작업은 일반적으로 시간과 리소스를 소비한다. 따라서, 연결을 자주 열고 닫으면 매번 연결 설정 및 해제에 소요되는 오버헤드가 발생하여 전체적인 성능이 저하될 수 있다.
- 리소스 낭비: 데이터베이스 서버는 동시에 처리할 수 있는 연결의 최대 개수를 가지고 있다. 자주 연결을 열면서 해당 연결을 적절히 닫지 않으면, 사용 가능한 연결 개수가 고갈되어 다른 요청들이 대기하거나 거부될 수 있다. 또한, 각각의 데이터베이스 연결은 네트워크 포트나 메모리 등의 시스템 리소스를 차지하므로, 불필요한 연결 생성으로 인해 시스템 자원이 낭비된다.
- 상태 관리 어려움: 데이터베이스 연결 객체는 일반적으로 트랜잭션 상태, 세션 정보 등과 같은 내부 상태를 유지한다. 이러한 상태를 올바르게 관리하지 않고 자주 연결을 열고 닫으면 예기치 않은 동작 또는 오류가 발생할 수 있다.
- 보안 취약성: 데이터베이스에 대한 인증 및 권한 검사와 같은 보안 절차는 일반적으로 로그인 시에만 수행됩니다. 따라서, 매번 새로운 데이터베이스 연결을 만들면 해당 절차가 반복되어 보안 취약성이 높아집니다.
따라서, 데이터베이스 연결을 필요할 때마다 열고 작업 후 바로 닫는 것보다 커넥션 풀링(connection pooling)과 같은 기술을 사용하여 재사용 가능한 커넥션 객체를 관리하는 것이 좋다. 이렇게 함으로써 성능 향상과 리소스 관리의 이점을 얻으며 안정적인 애플리케이션 운영을 할 수 있다.
freeConnection()
주로 커넥션 풀링(connection pooling)과 관련된 개념에서 사용된다. 커넥션 풀은 애플리케이션이 여러 번의 데이터베이스 연결을 필요로 할 때, 매번 새로운 연결을 만들지 않고 기존의 연결을 재사용하여 성능을 향상시키는 기술이다. freeConnection() 메서드는 커넥션 풀에 있는 재사용 가능한 커넥션을 해제하는 역할을 한다. 이렇게 하면 해당 커넥션이 다시 사용 가능한 상태가 되어 다른 요청에서 재사용할 수 있다.
따라서, freeConnection()으로 풀에 반환된 커넥션은 나중에 어떠한 부분에서도 가져와서 사용할 수 있으며, 이는 성능 개선과 리소스 관리 측면에서 이점을 제공하는 것이다.
freeConnection 의 장점
freeConnection()을 사용하여 풀에 반환된 커넥션은 나중에 다른 부분에서 가져와서 재사용할 수 있다. 커넥션 풀은 일정한 수의 연결 객체를 미리 생성하고 유지한다. 다른 부분에서 새로운 데이터베이스 연결이 필요한 경우, 해당 부분은 다시 커넥션 풀에서 사용 가능한 커넥션을 가져올 수 있다. 이렇게 함으로써 매번 새로운 연결을 만들지 않고 기존의 연결을 재사용할 수 있다. 애플리케이션이 데이터베이스 연결이 필요한 경우, 커넥션 풀에서 사용 가능한 커넥션을 가져와 작업을 수행한다. 작업이 완료되면 해당 커넥션은 freeConnection() 메서드를 사용하여 다시 풀에 반환된다.
freeConnection / close 중 어떤 것을 사용해야할까?
close()와 freeConnection()은 다른 목적과 사용 시나리오를 가지고 있다. 따라서 어떤 메서드를 사용해야 하는지는 상황에 따라 다르다.
그러나 freeConnection()을 사용하는 것에는 몇 가지 장점이 있을 수 있다:
- 성능 개선: 커넥션 풀링은 애플리케이션의 성능을 향상시키는 데 도움이 된다. 커넥션 풀은 미리 연결된 여러 개의 커넥션을 유지하고, 요청이 들어올 때마다 이러한 커넥션 중 하나를 할당하여 재사용한다. 이렇게 함으로써 매번 새로운 연결을 만들 필요가 없어져서 연결 설정 및 해제에 소요되는 시간과 리소스가 절약된다.
- 확장성: 커넥션 풀링은 애플리케이션이 동시에 많은 수의 요청을 처리할 수 있는 확장성을 제공한다. 커넥션 풀에서 관리되는 여러 개의 커넥션이 동시에 작업할 수 있으므로, 병렬 처리 및 동시성 제어 측면에서 이점을 얻을 수 있다.
- 리소스 관리: freeConnection() 메서드를 사용하여 재사용 가능한 커넥션 객체를 풀에 반환하면, 애플리케이션이 너무 많은 연결 객체를 생성하지 않아도 된다. 이로 인해 시스템 자원(예: 네트워크 포트, 데이터베이스 연결)의 낭비를 줄일 수 있다.
- 코드 간소화: freeConnection() 메서드 호출로 인해 직접적인 연결 종료 및 리소스 해제 작업을 처리할 필요가 없어진다. 대신, 컨텍스트 내에서 해당 메서드를 호출하여 재사용 가능한 상태로 만들기만 하면 된다. 따라서, 애플리케이션이 데이터베이스나 기타 리소스와 지속적인 연결 작업을 수행하며 성능과 확장성 측면에서 이점을 얻고자 한다면, freeConnection()과 같은 커넥션 풀링 기능을 고려하는 것이 좋다.
정리하면 ...
다시 사용할 확률이 높은 경우에는 freeConnection()을 사용하여 커넥션을 풀에 반환하는 것이 좋다. 이는 커넥션을 닫지 않고 재사용 가능한 상태로 유지하여 성능 개선과 리소스 관리에 도움을 준다.
반면, 다시 사용할 확률이 낮거나 없는 경우에는 close()를 사용하여 연결을 명시적으로 종료하는 것이 좋다. 이렇게 함으로써 리소스를 즉시 해제하고, 불필요한 연결을 유지하지 않아 리소스 낭비를 방지할 수 있다.
따라서, 어떤 메서드를 선택할지는 커넥션의 재사용 가능성과 애플리케이션의 요구 사항에 따라 결정되어야 한다. 커넥션 풀링을 사용하는 경우에는 freeConnection()을 사용하여 재사용 가능한 커넥션으로 반환하고, 커넥션 풀링을 사용하지 않는 경우 또는 재사용할 필요가 없는 경우에는 close()를 사용하여 연결을 종료하는 것이 일반적인 패턴이다.