Notice
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
01-25 03:08
Today
Total
관리 메뉴

그날그날 공부기록

싱글톤 방식의 주의점 본문

Spring 공부

싱글톤 방식의 주의점

given_dragon 2022. 7. 21. 13:21

싱글톤 패턴을 사용하였거나 스프링의 싱글톤 컨테이너를 사용하는 것처럼 싱글톤 방식은 여러 클라이언트가 하나의 인스턴스를 공유하게 된다.

따라서 싱글톤 객체의 상태를 유지(stateful)하게 설계하면 안되고 무상태(stateless)로 설계해야 한다.

  • 특정 클라이언트에 의존하는 필드가 있으면 안된다.
  • 특정 클라이언트가 값을 변경하는 필드가 있으면 안 된다.
  • 가능하다면 읽기만 가능해야 한다.
  • 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.

os시간에 멀티 스레드 간 동시성 문제를 배워 이해가 편했다.

public class StatefulService {
    private int price;  // 상태를 유지하는 필드

    public void order(String name, int price){
        System.out.println("name = " + name + " price = " + price);
        this.price = price;
    }

    public int getPrice(){
        return price;
    }
}

위 코드는 클라이언트로부터 order가 들어오면 필드를 수정하게 된다.

위 객체를 싱글톤 방식으로 사용하고 userA가 10,000원으로 order를 한 뒤 getPrice를 한다.
userB가 그 사이 20,000원으로 order를 했다면 userA의 getPrice는 10,000이 아닌 20,000으로 출력될 것이다.

price 필드가 클라이언트에 의존하고, 값이 변경되기 때문이다.

 

그러므로 아래 코드와 같이 지역변수를 사용하여 공유되지 않게 한다면 문제가 발생하지 않는다.

public class StatefulService {

    public int order(String name, int price){
        System.out.println("name = " + name + " price = " + price);
        return price;
    }
}

신경 쓰지 않으면 실수할 수 있는 부분이어서 항상 신경 써야겠다.

'Spring 공부' 카테고리의 다른 글

@ComponentScan & @Autowired에 대하여  (0) 2022.07.22
스프링의 @Configuration과 싱글톤  (0) 2022.07.21
싱글톤 컨테이너  (0) 2022.07.19
BeanDefinition  (0) 2022.07.18
BeanFactory & ApplicationContext  (0) 2022.07.15
Comments