본문 바로가기
코딩log/Spring Framework

[Spring Framework]싱글톤 레지스트리와 스프링 프레임워크

by 벨크 2023. 3. 12.
반응형

  앞서 스프링 프레임워크의 IoC 기능 중 의존관계 주입(Dependency Injection)에 관한 내용을 살펴보았습니다. 의존관계 주입이 스프링 프레임워크의 IoC 기능 중 가장 핵심이 되는 기능인데요. 오늘은 의존관계 주입 말고 다른 IoC 기능 중 하나인 싱글톤 레지스트리에 대해 알아보겠습니다.


싱글톤 레지스트리

싱글톤 레지스트리와 스프링 프레임워크

 

싱글톤 or 싱글톤 패턴이란?

 

  Spring Famework의 싱글톤 레지스트리에 대해 이야기하기 전에 먼저 싱글톤이 무엇인지 알아보겠습니다. 싱글톤 혹은 싱글톤 패턴이란 어떤 객체 혹은 클래스의 인스턴스를 하나만 생성하여 사용하는 디자인 패턴을 이야기합니다. 객체의 인스턴스가 JVM상에 하나만 존재한다는 뜻입니다.

 

  Spring은 서버 클라이언트 환경. 즉, 웹 서비스를 기반에 둔 프레임워크입니다. 서버 클라이언트 환경에서는 여러 개의 클라이언트가 동시다발적으로 서버에 객체 생성을 요구합니다. 이때, 동시에 여러 개의 인스턴스가 다량으로 생성됩니다. 이로 인해 서버에 부하가 발생할 가능성이 커집니다. 이를 방지하기 위해 싱글톤 패턴으로 특정 객체의 인스턴스를 하나만 생성시키고 이를 공유해 서버 부하 및 메모리 낭비를 방지합니다.

 

싱글톤 패턴의 문제점

 

  위의 상황만 놓고 보면, 서버/클라이언트 환경에서는 당연히 싱글톤 패턴을 적용하여 프로그램을 짜야할 거 같습니다. 하지만 싱글톤 패턴에는 치명적인 문제점이 존재합니다. 그래서 디자인 패턴에서도 싱글톤 패턴의 적용을 않기도 합니다. 과연 싱글톤 패턴에는 어떤 문제점이 존재할까요?

 

class suvCar {

   private static final INSTANCE = new suvCar();
   
   private static suvCar getInstance() { return INSTANCE; }
   
   private suvCar(){}
   
}

 

  위의 소스가 일반적으로 싱글톤 패턴을 구현한 예제입니다. 객체 자기 자신을 private static final로 instance를 생성해서 가지고 있고, getInstance()를 사용하여 가져다 씁니다. 그리고 private 생성자를 선언하여 무분별한 객체 생성을 막습니다.

 

  이렇게 싱글톤을 구현하게 되면 해당 Class는 private 생성자 때문에 상속해서 사용할 수 없게 됩니다. 상속이란 객체지향의 핵심 개념인데, 이를 사용하지 못한다는 것은 객체지향을 제대로 사용하지 못하게 된다는 의미입니다.

 

  또, 이런 방식으로 싱글톤 패턴을 적용시키면, 앞서 공부했던 좋은 객체 지향의 원칙 중 OCP(개방폐쇄 원칙)과 DIP(의존관계역전 원칙)을 지키지 못하게 됩니다. 인스턴스를 생성할 때 인터페이스의 구체 클래스를 알아야 하기 때문입니다.

 

Spring과 싱글톤 레지스트리

 

  싱글톤 레지스트리란, 앞서 말했던 싱글톤 패턴의 문제점을 해결하고, 스프링 IoC 컨테이너인 ApplicationContext가 Bean을 싱글톤 형태의 Object로 만들고 관리하는 기능을 말합니다. 싱글톤 패턴이 기존에 가지고 있는 문제점을 해결했기 때문에 스프링 프레임워크는 기본적으로 객체를 싱글톤으로 생성시킵니다.

 

  ApplicationContext가 객체를 생성하고 싱글톤으로 관리하기 때문에, Class는 private 생성자를 따로 만들 필요가 없어지고 평범한 Class처럼 설계가 가능해집니다. 따라서 싱글톤 패턴이 가지고 있는 단점은 모두 제거하고, 장점만 이용해 사용할 수 있게 됩니다.

 

싱글톤 객체 사용 시 주의점

 

  스프링을 이용해 싱글톤 패턴의 장점만 사용이 가능해졌어도 싱글톤 객체의 사용 시 주의사항은 여전히 존재합니다. 이는 싱글톤 객체의 문제점이 아닙니다. '하나의 인스턴스를 공유'한다는 개념을 적용시키면서 발생할 수 있는 주의점이라고 볼 수 있습니다.

 

  싱글톤 객체 사용 시 주의해야 할 점의 핵심은 객체가 상태를 가지게 설계하면 안 된다는 것입니다. 상태를 가진다는 게 조금 모호한 표현일 수 있으니 조금 구체적으로 알아보겠습니다.

  • 클라이언트에 의존적인 필드가 있으면 안 된다.
  • 클라이언트가 수정이 가능한 필드가 있으면 안 된다.

  상태를 가지지 않게 설계를 한다는 것은 위와 같은 의미입니다. 특정 클라이언트에 의존적이지 않게 하거나 수정이 불가능하게 하려면 싱글톤 내부의 필드들은 읽기 전용 필드만 존재하거나, 지역변수나 파라미터를 이용해야 합니다.


  오늘은 스프링 IoC 컨테이너의 또 다른 기능인 싱글톤 레지스트리에 대해 알아보았습니다. 다음번에도 스프링 프레임워크의 또 다른 기능에 대해 공부해 보도록 하겠습니다. 읽어주셔서 감사합니다!

 

이전 글: [Spring Framework] Spring Bean과 Application Context

 

[Spring Framework]Spring Bean과 Application Context

의존관계 주입을 스프링으로 구현하면서 우리는 Bean이라는 단어와 Application Context라는 객체에 대해서 접하게 되었습니다. 해당 개념들은 스프링으로 개발을 진행하면서 지속적으로 만날 개념들

belklog.tistory.com

반응형

댓글