헝D의 일기장

회사에서 운영중인 웹 어플리케이션에서는 db 연결 프레임워크로 마이바티스를 사용하고 있다.

하지만 간혹 대용량 데이터를 처리해야하는 경우가 종종 있는데, 이러한 경우에는 마이바티스를 사용하는 것보다는 jdbc batch 방식을 이용하는 것이 성능에 더 좋아 batch 방식을 사용하고 있다.

그렇게 운영하던 와중 한가지 이상한 점을 발견했는데, jdbc 배치 처리를 위해 db 커넥션을 생성하는 클래스가 싱글톤 패턴으로 구현되었다는 것이다. 

기본적으로 tomcat은 다중 유저의 요청을 멀티스레드로 처리하게 되고, 멀티 스레드 환경에서 싱글톤 패턴을 사용하게 되면 각각의 스레드가 static 변수에 접근할 수 있게 되면서 동시성 문제가 생길 수 있다. 즉 대용량 데이터를 처리하는 메뉴들을 여러명의 사용자가 동시에 사용하게 될 경우 하나의 커넥션에 여러 스레드가 접근하게 되고 의도치 않게 커넥션이 종료되어버리거나 하는 문제가 발생할 수 있다. 

싱글톤패턴은 실제로 문제점이 많아 안티패턴으로 불리기도 한다고 하는데, 웹 어플리케이션 같은 멀티 스레드 환경에서는 특히나 싱글톤 패턴 사용시에 무상태(stateless) 방식으로 만들도록 유의가 필요하다. 

 

 

profile

헝D의 일기장

@헝D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!