싱글톤

정재현·2022년 7월 18일
0

웹 어플리케이션과 싱글톤

  • 웹어플리케이션은 여러 명의 사용자가 요청을 한다.
    client A request
    client B =====> 여러개의 객체가 생성됨
    client C

  • 메모리 낭비가 심하다.

  • 해당 객체가 1개만 생성되게하고 공유.

public class SingletonService {
    // 객체를 미리 생성해 논다.
    private static final SingletonService instance = new SingletonService();
    
    public static SingletonService getInstance(){
        return instance;
    }
	// 외부에서 생성할 수 없도록 private 으로 선언
    private SingletonService(){
        
    }
    
    public static void main(String[] args) {
        
    }
}

싱글톤 패턴의 문제점

  • 싱글톤 패턴 구현 코드가 늘어난다.
  • 테스트하기 어렵다.
  • 유연성이 떨어진다. ( DI 적용 어려움 )
  • DIP 위반. OCP 위반 가능성 높음.

싱글톤 컨테이너

  • 싱글톤 패턴의 문제점 해결, 싱글톤으로 관리

stateful하면 안된다.

package com.example.spring_java.singleton;


import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;


class StatefulServiceTest {

    @Test
    void stateful(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
        StatefulService statefulService1 = ac.getBean(StatefulService.class);
        StatefulService statefulService2 = ac.getBean(StatefulService.class);

        statefulService1.order("service1", 10000);
        statefulService2.order("service2", 30000);

        Assertions.assertThat(statefulService1.getPrice()).isEqualTo(30000);
    }

    static class TestConfig{

        @Bean
        public StatefulService statefulService(){
            return new StatefulService();
        }
    }

}

price가 10000 아닌 30000으로 변경된다.

spring에서는 싱글톤을 보장해준다

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepo());
    }

    @Bean
    public OrderService orderService(){
        return new OrderServiceImpl(memberRepo(), discountPolicy());
    }

}

위의 코드에서 MemberRepo가 2군데에서 사용되고 있다.
1. MemberService가 호출될 때 MemberRepo객체가 생성된다.
2. OrderService가 호출될 때 MemberRepo객체가 또 생성되야 하지만
스프링 컨테이너에서 이미 생성된 객체를 반환해준다.
=> 싱글톤 페턴이 유지되게 된다.

profile
back end개발자로 성장하기

0개의 댓글

관련 채용 정보