싱글톤패턴

잘하고싶다·2022년 5월 19일
0

spring

목록 보기
3/4

싱글톤 디자인이란?

  • 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

싱글톤을 해야하는 이유

  • 웹 어플리케이션의 경우 여러 고객이 동시에 요청을 한다. 요청 마다 객체를 새로 생성 할 경우 메모리 낭비가 심해질 수 있다.
@Test
    @DisplayName("스프링 없는 순수한 DI 컨테이너")
    void pureContainer(){
        AppConfig appConfig = new AppConfig();
        //1. 조회 : 호출할 때 마다 객체를 생성
        MemberService memberService1 = appConfig.memberService();

        //2. 조회 : 호출할 때 마다 객체를 생성
        MemberService memberService2 = appConfig.memberService();

        //참조값이 다른 것을 확인
        System.out.println("memberService1 = " + memberService1);
        System.out.println("memberService2 = " + memberService2);

        assertThat(memberService1).isNotSameAs(memberService2);
    }

결과

이런 경우를 방지하기 위해 나온 것이 싱글톤 패턴이다.

싱글톤 패턴을 적용하는 방법은 여러가지고 아래 코드는 적용 방법 중 하나다.

public class SingletonService {

    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance(){
        return instance;
    }
    //생성자를 private 처리하여 getInstance로만 호출 할 수 있게 변경
    private SingletonService(){

    }

    public void logic(){
        System.out.println("싱글톤 객체 로직 호출");
    }
}

싱글톤 컨테이너

  • 스프링에서는 Bean등록 하면 자동으로 싱글톤으로 관리한다.

싱글톤 방식의 주의점

  • 싱글톤 패턴이든, 스프링의 싱글톤 컨테이너를 사용하던 객체 인스턴스를 하나만 생성하여 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다.

  • 특정 클라이언트에 의존적인 필드가 존재하면 안된다.

  • 특정 클라이언트가 변경할 수 있는 필드가 있으면 안된다.

  • 가급적 읽기만 해야한다.

  • 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.

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;
    }
}

위 코드처럼 싱글톤 패턴으로 service를 호출하면 마지막 요청된 price 파라미터 값에 따라 service의 price값이 변경된다.

해결 방법 중 하나로 return 값을 price로 지정해 호출하는 클라이언트에서 지역변수로 사용한다.

public class StatefulService {

    public int order(String name, int price){
        return price;
    }

}

0개의 댓글