Dev./Spring

[Spring] 스프링이 싱글톤 빈을 생성하는 과정

limitation01 2025. 11. 21. 09:07

싱글톤이란?

객체 하나만 만들어 전역적으로 공유하는 패턴

핵심

  • 단 하나의 인스턴스
  • 어디서든 같은 인스턴스를 공유

싱글톤 빈

스프링은 기본적으로 애플리케이션 당 하나의 객체만 만들어 재사용

  • 싱글톤 스코프 제공
  • 개발자가 별도로 prototype/request/session scope 바꾸지 않는 한 1개의 객체만 생성후 재사용

생성 과정

1. 컴포넌트 스캔

스프링이 실행되면 @ComponentScan 설정에 따라 프로젝트를 훑어 빈 클래스들을 찾는다.

ex)

  • @Component
  • @Service
  • @Repository
  • @Controller
  • @RestController

이 클래스를 빈으로 만들겟다고 등록

2. 빈 객체를 한번만 new 로 생성

이때 싱글톤 인스턴스가 생성된다.

스프링은 내부적으로 싱글톤 저장소를 Map 형태로 사용하고 있다.

singletonObject["userService"] = new UserService();
singletonObject["scheduleService"] = new ScheduleService();
singletonObject["commentService"] = new CommentService();

이렇게 객체를 만들어 저장

3. 의존성 주입

필요한 곳에 만들어둔 싱글톤 객체를 주입한다.

예를들어

@Service
public class ScheduleService{}

@RestController
@RequiredArgsConstructor
public class ScheduleController{
	private final ScheduleService scheduleService = new ScheduleService();  [1]
	private final ScheduleService scheduleService;                          [2]
}

로직을 작성할때 컨트롤러 작성할 때1 번처럼 내가 new 하지 않고 2 번처럼 작성했다. ( 스프링이 new 자동으로 해준다)

스프링이 이부분을 의존성 주입으로 알아서 해주는 것

ScheduleController 만들때 생성자로 ScheduleService가 필요하다. 내가 주입 해줄께

이미 만들어둔 ScheduleService 1개를 재사용

그래서 왜 스프링이 빈을 싱글톤으로 생성할까?

웹 서버는 기본적으로 요청이 매우많음

  • 그때마다 new하면 비용증가, 메모리 낭비
  • 그래서 스프링은 기본적으로 싱글톤 재사용
  • 스프링은 애플리케이션에서 객체 생성 비용을 줄이고 요청 처리를 빠르고 효율적으로 하기위해 싱글톤 사용

특히 대부분의 Controller/Service/Repository는 값을 저장하지도, 요청 데이터를 필드에 보관하지도 않고 항상 같은 기능을 제공하는 도구같은 객체라 한번만 만들어서 재사용 하는게 좋다고 한다.