[Spring] spring Boot 와 singleton

LDB·2024년 12월 25일
0

Spring

목록 보기
4/6
post-thumbnail

연관관계

singleton 패턴은 spring계열 프레임워크를 메인으로 삼고 개발하는 개발자라면 알아야할 기본소양중에 하나라고 볼 수 있다. 앞서 말하면 singleton패턴은 여러차례 호출되어도 최초에 생성한 객체 1개만 리턴하는 패턴이다. spring Boot에서는 싱글톤 컨테이너라는 기능을 활용해 객체들을 관리한다. 더욱 와닿게 설명하자면 대표적으로 Bean 어노테이션이 싱글톤을 활용한 기능이다.

싱글톤 패턴이란?

위에서 간단히 설명 했듯이 싱글톤 패턴은 여러차례 호출되어도 최초에 생성한 객체 1개만 리턴한다는 의미이다. 싱글톤 패턴이 나오게 된 이유는 객체지향 프로그래밍에서 객체를 매번 생성한다는 것은 비용이 많이드는 행위이다, 만약 매번 객체를 생성한다면 그만큼 메모리가 할당이 많이 될 것이고 언젠가 메모리 오버플로우상태가 되어 시스템이 갑자기 중단되는 최악의 상황이 올 수 있다. 그러한 상황을 해결하기 위해 나온 방법중에 하나가 바로 싱글톤 패턴이다.

인스턴스가 필요할 때, 똑같은 인스턴스를 만들지 않고 기존의 인스턴스를 활용하는 것이라고 정리하면 되겠다.

코드로 예시를 하자면 이렇게 표현할 수 있다.

package com.spring.jpatest.service;

public class singletonServicetest {
    //1. static 영역에 객체를 딱 1개만 생성해둔다.
    private static final singletonServicetest test = new singletonServicetest();
    
    //2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다.
    public static singletonServicetest getInstance() {
        return test;
    }

    //3. 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
    private singletonServicetest() {
    }

    // 임의로 호출 잘 되는지 확인용 함수
    public void call() {
        System.out.println("성공!");
    }
}

싱글톤의 장점

  1. 객체를 매번 생성하는 것이 아니라 한번만 생성해서 활용하기 때문에 메모리 절약이 된다.
  2. 속도 개선이 된다.
  3. 전역으로 사용되는 인스턴스이기에 접근이 쉽다.

싱글톤의 단점

  1. 구현하는 과정에 코드의 가독성이 떨어진다.

  2. 테스트 하기가 어렵다.

    • 생성방식이 제한적이기에 Mock, 동적객체 주입이 어렵다.

      MOCK : 모의객체란 의미이고 개발한 프로그램을 테스트 할 경우 테스트를 수행할 모듈과 연결되는 외부의 다른 서비스나 모듈들을 실제 사용하는 모듈을 사용하지 않고 실제의 모듈을 "흉내" 내는 "가짜" 모듈을 작성하여 테스트의 효용성을 높이는데 사용하는 객체이다.

    • 인스턴스가 자원을 공유하고 있기 때문에 매번 상태를 초기화한다.

  3. private 생성자이기 때문에 상속이 어렵다.

  4. 서버 환경에서 싱글톤이 1개만 생성됨을 보장하지 못한다.

  5. 전역으로 접근이 되기에 동시성 문제가 일어날 수 있다.

spring의 DI 컨테이너

위와 같이 싱글톤 패턴에는 장점보다 단점이 많기에 잘 사용되지 않았다. 하지만 spring의 싱글톤 컨테이너가 나오게 되면서 위의 단점을 보완할 수 있게 되었다.

  • 싱글톤 패턴을 구현하기위해 가독성 떨어지는 코드 작성이 불필요
  • private 생성자가 제거되었다.
  • 객체지향적으로 개발 가능
  • 프레임워크를 통해 오로지 1개 객체 생성이 보장된다.

스프링 DI 컨테이너 : 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 흔히 Bean이 싱글톤으로 관리가 된다.

위와 같이 싱글톤 컨테이너를 사용하면 가독성 떨어지는 코드를 작성하거나 private생성자로부터 자유롭게 싱글톤을 사용할 수 있다.
(스프링에서 Bean등록 방식은 기본적으로 싱글톤 방식이지만, 싱글톤 방식만 지원하는 것은 아니다. 요청할 때마다 새로운 객체를 생성해서 반환하는 기능도 제공이 가능하다.)


참고 사이트

https://parkmuhyeun.github.io/etc/java/2022-12-13-Static/

https://parkmuhyeun.github.io/study/spring/2022-02-24-Spring(4)/

https://velog.io/@sorzzzzy/Spring-Boot2-5.-싱글톤-컨테이너

https://hel-p.tistory.com/32

profile
가끔은 정신줄 놓고 멍 때리는 것도 필요하다.

0개의 댓글

관련 채용 정보