본문 바로가기
개발자의 공부방/자바

자바] 디자인 패턴, 싱글톤 패턴

by 쥬니준 2021. 11. 15.
728x90
반응형

1. 개요

일단 정처기 공부하면서도 나왔던 것 같은데 어쨌든 면접 질문에 빡쳐서 또 공부한다. 🤬
생각할 수록 빡친다.
디자인 패턴 1 싱글톤 패턴을 먼저 시작해본다.

예를 들어서 3명의 클라이언트가 있다고 가정한다. 각각의 클라이언트는 어떤 어플리케이션을 실행한다.
이때 이 어플리케이션 내부의 서비스 로직 중 어떤 것이 호출되는데 3명이 실행하고 호출하면 당연히 3번의 서비스 로직의 인스턴스가 생성되고 호출된다. 그럼 만약 100명이 호출한다면?

싱글톤 패턴은 이런 무분별한 인스턴스의 메모리 낭비를 방지하기 위해서 나온 것이다.
이제 코드를 통해 알아본다.

 

2. 본론

1) 싱글톤 패턴 코드

package hello.core.singleton;

public class SingletonService {

    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance() {
        return instance;
    }

    private SingletonService() {
    }

    /*public SingletonService(int a) {
    }*/

    public void logic() {
        System.out.println("이게 바로 싱글톤이다. 새퀴들아!!!");
    }
}

위의 코드 첫번째 라인을 보시면 private static final로 되어 있다.

이는 static 메모리 영역에 올라가는데 프로그램의 시작 ~ 종료될 때 까지 메모리에 남아있기 때문에 static을 붙이며 상수로써 final을 붙여 바꿀 수 없게끔 한다. 즉, 모든 영역에 고정된 값으로 쓰겠다는 의미이다.

 

싱글톤패턴은 외부에서 new 객체를 통해 인스턴스 호출하는 것도 막아야함으로 기본 생성자를 private로 바꿔놓는다.

access 할 수 없으며, 이 상태에서 Test를 진행하면 컴파일 에러가 뜬다. (좋은 에러...크크..)

 

2) 싱글톤 패턴 테스트

    @Test
    @DisplayName("싱글톤 패턴이다!!!")
    void sigletonServiceTest() {
        SingletonService singletonService1 = SingletonService.getInstance();
        SingletonService singletonService2 = SingletonService.getInstance();
//        SingletonService singletonService2 = new SingletonService(1);


        singletonService1.logic();
        System.out.println("singletonService1 = " + singletonService1);
        System.out.println("singletonService2 = " + singletonService2);

        assertThat(singletonService1).isSameAs(singletonService2);
        //isSameAs : ==
        //isEquals : value
    }

 

위의 테스트를 돌려보면 아래와 같은 결과가 나온다.

assertThat의 isSameAs를 통해서 두 객체가 동일함을 확인했다.

 

(새퀴들아는...너무 감정이 올라왔다..)

 

3) 싱글톤 패턴의 장점

  • 외부에서 생성할 수 없다.
  • 고정된 영역에 미리 할당되어 있어 메모리 낭비를 하지 않는다.
  • JVM이 종료될 때 까지 계속 사용이 가능하다.

 

4) 싱글톤 패턴의 단점

  • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
  • 의존관계상 클라이언트가 구체 클래스에 의존한다. 이는 SOLID의 DIP(의존관계역전의원칙)에 어긋난다.
  • 클라이언트가 구체 클래스에 의존해서 OCP(개방폐쇄의 원칙)을 위반할 가능성이 높다.
  • 내부 속성을 변경하거나 초기화하기 어렵다.
  • private 생성자로 자식 클래스를 만들기 어렵다.
  • 테스트하기 어렵다.
  • 결과적으로 유연성이 떨어지며 안티패턴으로 불리기도 한다.

 

 

3. 결론

디자인패턴의 제일 기본적인 패턴이고 많이 사용되는 싱글톤 패턴을 알아봤다.

국비지원을 받으며 자바를 배울 때 처음 사용해보고 봤었으나 실무에서는 이를 직접적으로 다루면서 사용해본적 없어 장점과 단점이 어떤 것인지 잘 알지 못했으나 이런 간단한 코드를 통해서 다시 한번 상기시켜보도록 했다.

또한 위의 싱글톤 패턴의 단점은 스프링에서 모두 해결되어 사용된다.

즉, 스프링 만세. 🤭

반응형

댓글0