싱글톤 패턴이란, 특정 클래스의 인스턴스가 여러 개 존재하는 것이 아닌, 딱 하나만 존재하도록 보장하는 것을 말한다.
이런 패턴이 존재하는 이유는 다음과 같다.
만약 실시간 결제 정보를 저장하는 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
'개발' 카테고리의 다른 글
[Java] HashMap 내부 코드에 존재하는 transient 키워드 (0) | 2022.06.23 |
---|---|
Short-circuit evaluation과 Sequence Point (0) | 2022.03.13 |
[Java] Queue에서 poll()과 remove() 중 무엇을 선택해야 할까? (0) | 2022.01.23 |
코드 실행시간 측정하기 (Java, Python, C, C++) (0) | 2022.01.10 |
[Git] Tracking connection (-set-upstream 명령) (0) | 2021.11.19 |