싱글톤에서의 상태값
스프링 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("송지효");
}
}
Author And Source
이 문제에 관하여(싱글톤에서의 상태값), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@monkeydugi/싱글톤에서의-상태값저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)