본문 바로가기

개발

[Spring] 싱글톤 패턴의DIP 위반과 만족

 

싱글톤 패턴이란, 특정 클래스의 인스턴스가 여러 개 존재하는 것이 아닌, 딱 하나만 존재하도록 보장하는 것을 말한다.

 

이런 패턴이 존재하는 이유는 다음과 같다.

 

만약 실시간 결제 정보를 저장하는 DB 객체가 결제 수만큼 생성된다면 이는 리소스 낭비로 이어질 수 있다.

 

그러나 해당 클래스에 싱글톤 패턴을 적용하면, 하나의 인스턴스에 모든 결제 DB를 저장할 수 있게 된다.

 

 

객체 생성은 많은 비용을 요구하나, 참조 접근은 생성에 비해 엄청나게 적은 비용이 들기 때문에 더 효율적이다.

 

그럼 싱글톤 패턴을 적용한 클래스 예제를 살펴보자.

 

public class SingletonService {

    private static final SingletonService instace = new SingletonService();

    public static SingletonService getInstance() {
        return instace;
    }

    private SingletonService() { }

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

 

클래스 인스턴스를 static하게 미리 생성한 후, 이를 반환할 getter를 만들면 된다.

 

@Configuration
public class AppConfig {

    @Bean
    public MemoryMemberRepository MemberRepository() { return MemoryMemberRepository.getInstace(); }

    @Bean
    public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); }

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

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

 

public class MemoryMemberRepository implements MemberRepository {

    private static MemoryMemberRepository instace = new MemoryMemberRepository();
    private static Map<Long, Member> store = new HashMap<>();
    private MemoryMemberRepository() { }

    public static MemoryMemberRepository getInstace() { return instace; }

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}

 

    @Test
    @DisplayName("싱글톤 패턴을 적용하여 DIP를 만족하는 객체 사용")
    void singletonDipMememoryMemberRepositoryTest() {
        AppConfig appConfig = new AppConfig();

        MemberRepository memberRepository1 = appConfig.MemberRepository();
        MemberRepository memberRepository2 = appConfig.MemberRepository();

        System.out.println("memberRepository1 = " + memberRepository1);
        System.out.println("memberRepository2 = " + memberRepository2);

        Assertions.assertThat(memberRepository1).isSameAs(memberRepository2);
    }

 


 

이 내용은 김영한님의 인프런 강의 [스프링 핵심 원리 기본편] 을 수강하다가 궁금증이 생겨서 정리한 내용입니다.

 

https://www.inflearn.com/course/스프링-핵심-원리-기본편

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

 

https://www.inflearn.com/questions/458136

 

싱글톤 패턴의 DIP 만족 - 인프런 | 질문 & 답변

안녕하세요. 항상 훌륭한 강의로 지식 공유 해주셔서 감사합니다.   밑의 질문을 모두 읽어 보아도 여전히 헷갈리는 점이 남아 있어 확실하게 짚고 넘어가고 싶은 마음에 질문드립니다.   싱글

www.inflearn.com