Inflearn brand logo image

인프런 커뮤니티 질문&답변

Eric J님의 프로필 이미지
Eric J

작성한 질문수

TS/JS 디자인 패턴 with Canvas: 제로초에게 제대로 배우기

싱글턴(Singleton) - 앱 내에서 단 하나만 존재해야 할 때

강결합

작성

·

61

·

수정됨

1

강결합되는게 왜 싱글턴 패턴의 단점인지 연결이 잘 되지 않아 질문드립니다. 매개변수 주입같은 해법을 주신 것 처럼, 싱글턴 패턴과는 별개의 문제로 느껴지는데, 싱글턴을 안 하면 어떻게 나아지는지 예제 같은게 있을까요?

답변 2

0

Eric J님의 프로필 이미지
Eric J
질문자

(AI 답변이 전부라면) 싱글턴 패턴만의 단점은 아니고 global state라면 가지는 단점을 당연히 싱글턴도 가진다로 이해했습니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네 싱글턴 패턴만의 단점은 아니고 강결합되는 모든 객체들의 단점이라고 보시면 됩니다.

0

안녕하세요, 인프런 AI 인턴입니다. Eric J님.

싱글턴 패턴의 강결합 문제는 싱글턴이 글로벌 상태를 공유하기 때문에 발생할 수 있습니다. 이는 실행 환경의 상태에 따라 동작이 달라질 수 있어 테스트가 어렵고, 다른 코드에 의해 쉽게 변경될 수 있기 때문에 유지보수가 어려워질 수 있습니다. 싱글턴 패턴의 장점으로는 메모리 사용의 효율성을 들 수 있지만, 그 이면에는 코드의 유연성을 저하시키는 단점이 존재합니다.

강결합 문제와 해결 방안

  • 강결합 문제: 싱글턴 패턴으로 인스턴스를 전역적으로 사용하게 되면, 해당 인스턴스에 의존하는 다른 부분의 수정이 어려워집니다. 이는 특히 비즈니스 로직이 변경되거나 테스트 상황에서 문제가 됩니다.
  • 매개변수 주입을 통한 해결: 매개변수 주입은 객체를 생성할 때 필요한 의존성을 외부에서 주입받아 외부 의존성을 충돌 없이 교체할 수 있도록 합니다. 이를 통해 강결합을 완화하고 테스트 용이성을 높일 수 있습니다.

예시

싱글턴 패턴을 사용하지 않음으로서 얻는 장점을 예시로 설명드리겠습니다. 예를 들어, 데이터베이스 연결 객체를 싱글턴으로 관리하는 대신, 각기 다른 테스트 환경에서 다른 설정을 주입하여 다양한 테스트 케이스를 구현할 수 있습니다.

싱글턴 사용 시:

class DatabaseConnection {
  private static instance: DatabaseConnection;

  private constructor(){}

  public static getInstance(): DatabaseConnection {
    if (!DatabaseConnection.instance) {
      DatabaseConnection.instance = new DatabaseConnection();
    }

    return DatabaseConnection.instance;
  }
}

이런 코드에서 데이터베이스 연결 정보를 변경하고 싶을 때 싱글턴이 한 번 생성되면 정보 교체가 어렵습니다.

매개변수 주입으로 해결:

class DatabaseConnection {
  private config: DatabaseConfig;

  constructor(config: DatabaseConfig) {
    this.config = config;
  }
}

이렇게 작성할 경우, 각기 다른 테스트나 환경에 맞게 인스턴스를 생성할 수 있습니다.

관련하여 많은 논의가 진행되고 있는 커뮤니티의 질문 예시로, 싱글턴 패턴과 종속성 주입을 활용하는 방법에 관한 질문을 참고하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Eric J님의 프로필 이미지
Eric J

작성한 질문수

질문하기