꾸준한 개발일기

웹 애플리케이션과 싱글톤 컨테이너란? 본문

Programing/스프링

웹 애플리케이션과 싱글톤 컨테이너란?

꾸개일 2025. 3. 7. 06:43
반응형

1️⃣ 웹 애플리케이션의 특징

웹 애플리케이션은 여러 사용자가 동시에 요청하는 환경에서 동작합니다.

  • HTTP 요청이 들어올 때마다 새로운 컨트롤러, 서비스, 리포지토리 등의 객체가 생성되면 메모리 낭비가 발생합니다.
  • 이를 방지하기 위해 객체를 한 번만 생성하고 공유하는 방식이 필요합니다.

2️⃣ 싱글톤 패턴

싱글톤 패턴은 객체의 인스턴스를 하나만 생성하여 공유하는 디자인 패턴입니다.
하지만, 직접 싱글톤을 구현하면 다음과 같은 문제점이 발생할 수 있습니다.
코드가 복잡해짐: private 생성자, static 메서드 등을 직접 관리해야 함
테스트가 어려움: 여러 테스트 환경에서 객체를 재사용하는 것이 어려움
다른 객체와의 의존성 관리가 어려움

3️⃣ 스프링의 싱글톤 컨테이너

스프링은 이러한 문제를 해결하기 위해 싱글톤 컨테이너(스프링 컨테이너) 를 제공합니다.

  • 스프링 컨테이너가 객체를 자동으로 싱글톤으로 관리해 줌
  • 개발자는 별도로 싱글톤을 구현할 필요 없음
@Component
public class SingletonService {
    public void logic() {
        System.out.println("싱글톤 객체 로직 호출");
    }
}

이렇게 빈으로 등록하면, @Component에 의해 Spring이 자동으로 싱글톤으로 관리해 줍니다.


💡 싱글톤 컨테이너 심화 개념

✔ 1. 싱글톤 레지스트리

  • 스프링은 객체를 ApplicationContext(컨테이너) 에 보관하고,
  • 동일한 요청이 들어오면 기존 객체를 반환하는 방식으로 싱글톤을 유지합니다.

✔ 2. 빈의 스코프

싱글톤이 기본이지만, 필요하면 다른 스코프도 사용할 수 있습니다.

  • @Scope("singleton") (기본값) → 한 개의 인스턴스를 애플리케이션 전체에서 공유
  • @Scope("prototype") → 요청할 때마다 새로운 인스턴스 생성
  • @Scope("request") → HTTP 요청마다 새로운 인스턴스 생성 (웹 환경에서 사용)

✔ 3. 싱글톤과 멀티스레드

싱글톤 빈은 멀티스레드 환경에서 공유되므로 동시성 문제를 주의해야 합니다.

  • 상태를 가지지 않는 Stateless 객체로 설계하는 것이 중요
  • 상태를 유지해야 한다면 ThreadLocal, 동기화(synchronized), 별도 객체 주입 등의 방법 고려
@Component
@Scope("prototype") // 매번 새로운 객체 생성
public class PrototypeBean {
    public void logic() {
        System.out.println("프로토타입 빈 호출");
    }
}

🎯 정리

싱글톤 패턴은 객체를 1개만 생성해 공유하는 패턴
스프링 컨테이너는 직접 싱글톤을 구현하지 않아도 자동으로 관리해 줌
빈의 스코프를 조절하면 필요한 경우 새로운 객체를 생성할 수도 있음
멀티스레드 환경에서는 싱글톤 객체의 상태 관리에 주의해야 함

 

반응형
Comments