Spring - Spring Singleton환경에서의 주의사항
목록  
제 목 Spring Singleton환경에서의 주의사항
작성자 박세청 작성일 2013/11/08 02:42


2011/06/23 - [Framework/Spring] - Spring의 ApplicationContext는 Singleton Registry이다.

위에서처럼 Spring은 Bean들을 Singleton으로 관리하게 된다.
Singleton은 멀티스레드 환경이라면 여러 스레드가 동시에 접근하여 사용할 수 있기 때문에 주의해야 한다.

기본적으로 Singleton이 멀티스레드 환경에서 서비스 형태의 오브젝트로 사용되는 경우에는 상태 정보를 내부에 갖고 있지 않은 무상태(stateless) 방식으로 만들어 져야 한다. (클래스의 attribute들이 없는 형태)

이를 지키지 않는다면 서버에 배포되고 여러 사용자들이 동시에 접속해서 클래스의 상태(attribute)를 변경한다면 심각한 문제가 발생할 것이다.

그렇다면 어떻게 처리를 해야할까? 파라미터, 로컬변수, 리턴값 등을 이용해서 구현을 하면 된다.
아래 코드로 알아보도록 하자.

public class UserDAO {
    private ConnectionMaker connectionMaker;
    private Connection c;
    private User user;

    public User get(String id) throws ClassNotFoundException, SQLException {
       this.c = connectionMaker.makeConnection();
       ....
    }
}

위 코드는 Singleton으로 돌아가는 Spring환경에선 문제가 된다.
만약 connectionMaker 변수를 A스레드가 1번객체로 변경을 했다. (private 라 직접 수정은 안되지만 생성자를 통해서든 setter를 통해서든 값을 초기화 시키는 부분은 있을 것이다.) 
이후 B스레드가 connectionMaker 변수를 2번객체로 변경을 해버린다면 운이 좋다면 A스레드가 작업이 다 끝난후 B스레드가 변경하여 정상적으로 진행이 되었겠지만 A스레드 작업 중간에 B스레드로 Context switch가 되어 버린다라면 심각한 문제가 발생할 수도 있다.

위와 같은 문제 때문에 읽기전용 속성(static final이나 final) 이외에는 Stateless 클래스로 설계를 해 주는 것이 좋다.
저작자 표시




이전글 Spring Bean의 Scope
다음글 Spring의 ApplicationContext는 Singleton Registry이다.

목록