230516

바람찬허파·2023년 5월 15일
0

Spring 컨테이너를 통한 싱글톤 구현

Spring 컨테이너는 Configuration에서 빈을 등록하면, 해당 빈을 가지고 공유한다.
떄문에 싱글톤을 구현하기 위해 추가의 코드(static, getInstance)를 작성할 필요가 없다.
실제로 getBean()을 통해 테스트를 해도, 같은 빈이 호출되는 것을 알 수 있다.
물론 객체를 생성할 때마다 빈을 생성하는 방식도 가능하다 (후에 빈 스코프에서 학습예정)

싱글톤 방식의 주의점

앞서서 Spring 컨테이너는 기본적으로 싱글톤을 따른다.
싱글톤 방식은 여러 클라이언트가 하나의 객체 인스턴스를 사용한다는 것이다.
이때 주의 해야 할 점은 싱글톤 객체가 stateful하지 않고 stateless해야 한다는 것이다.
객체 내부의 price 변수가 있고, 이를 변경하는 메소드가 있다면
userA가 price 변수를 200원으로 바꾸고, 가격을 조회하고자 한다. 하지만 그 사이에 다른 스레드에서 userB가 price변수를 500원으로 바꾼다.

-> 그렇다면 userA에게는 200원이 아닌 500원의 가격이 조회될 것이다. (실제였다면 500원이 결제되거나)
이렇듯 싱글톤 객체가 stateful하다면 이 오류를 찾는데에도 시간이 오래 걸린다. 항상 주의해야 하는 부분!
만약, stateless하게 짜고 싶다면 order 당시에 바로 price를 리턴해서 공유되지 않는 변수를 사용하여 해결할 수 있다.

0개의 댓글