싱글톤이란?
객체 하나만 만들어 전역적으로 공유하는 패턴
핵심
- 단 하나의 인스턴스
- 어디서든 같은 인스턴스를 공유
싱글톤 빈
스프링은 기본적으로 애플리케이션 당 하나의 객체만 만들어 재사용
- 싱글톤 스코프 제공
- 개발자가 별도로 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는 값을 저장하지도, 요청 데이터를 필드에 보관하지도 않고 항상 같은 기능을 제공하는 도구같은 객체라 한번만 만들어서 재사용 하는게 좋다고 한다.
'Dev. > Spring' 카테고리의 다른 글
| [Spring] Lombok 생성자 @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (1) | 2025.11.20 |
|---|---|
| [Spring] 응답DTO에 엔티티 의존성을 주입해야 하는 경우 (0) | 2025.11.19 |
| [Spring] Pageable+Page 사용해 Pagination 적용해보기 (0) | 2025.11.18 |
| [Spring] record DTO 클래스 (0) | 2025.11.17 |
| [Spring] DELETE 메소드에 RequestBody를 지양해야 하는 이유 (0) | 2025.11.13 |