Published 2021. 9. 26. 22:15
반응형

스프링 DI컨테이너는 디폴트로 싱글톤으로 관리하게 됩니다.
싱글톤은 객체를 매번 새로 생성하지 않아 메모리 관리에 효율적입니다.
하지만 가장 큰 단점은 객체를 공유한다는데 있습니다.
그렇기 때문에 싱글톤은 상태값을 가지면 안됩니다.
왜 상태값을 가지면 안되는지 알아보도록 하겠습니다.

🔍 상태값을 가지면 안되는 이유

  • 싱글톤 객체

    @Getter
    @Setter
    public class SingletonT {
    
      private final static SingletonT instance = new SingletonT();
    
      private String name;
    
      public static SingletonT getInstance() {
          return instance;
      }
    
      public String setLocalVariable(String variable) {
          return variable;
      }
    
      private SingletonT() {
    
      }
    }

위는 싱글톤 객체이며, 테스트 코드로 실험을 해보겠습니다.
이 테스트는 모두 성공 테스트입니다.
싱글톤은 객체를 공유하기 때문에 user1은 김종국이지만 user2가 송지효로 가입을
하는 바람에 결국 두 회원 모두 송지효가 되었습니다.
만약 이런게 결제금액이라면 더욱 더 큰 문제가 발생합니다.
즉, 싱글톤은 절대 상태를 가져서는 안됩니다.
어차피 동시에 요청할 일이 없어!!라고 생각해도 사용하면 안됩니다.
개발은 혼자하는 것이 아니기 때문에 다른 개발자가 다른 곳에서 호출할 수 있는 것입니다.

class SingletonTTest {

    @Test
    void t() {
        SingletonT user1 = SingletonT.getInstance();
        SingletonT user2 = SingletonT.getInstance();

        user1.setName("김종국");
        user2.setName("송지효");

        assertThat(user1.getName()).isEqualTo(user2.getName());
        assertThat(user2.getName()).isEqualTo("송지효");
    }
}

리팩토링 소스

반응형
복사했습니다!