일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 삽입 이상
- AWS
- 자료구조
- 자바
- 정규화
- MSA
- 낙관적 락
- 3-way handshaking
- Kafka
- JPA
- buildSrc
- Spring
- HTTP
- 갱신 이상
- ocp
- 삭제 이상
- 캐시 오염
- 페이지네이션
- gatway
- Redis
- 데이터베이스
- 네트워크
- 비관적 락
- Dirty Checking
- java
- DB
- well-know port
- null
- 스레드 풀
- Kotlin
- Today
- Total
어 나 갱수.
[Spring] 싱글톤 패턴 🐶 본문
싱글톤 패턴 (Singleton pattern)
소프트웨어 디자인 패턴에서 싱글톤 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
싱글톤 패턴을 사용하는 이유
만약 우리가 만들었던 DI 컨테이너인 요청을 할 때마다 새로운 객체를 생성한다. 요청이 엄청나게 많은 트래픽 사이트에서는 계속 생성하게 되면 메모리 낭비가 심하기 때문이다.
순수한 DI 컨테이너
객체를 생성하면 매번 새로운 객체가 생성된다.
많은 객체를 생성해야 하는 서비스에서는 메모리 낭비가 많아진다.
싱글톤 패턴 구현
클래스 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.
그래서 객체가 2개 생성되는 것을 막아야 한다. -> private를 사용해서 외부에서 new 키워드를 사용하지 못하도록 해야 한다.
1. static 객체를 통해서 해당 객체를 1개만 생성하도록 선언한다.
2. static method를 통해서 외부에서 생성할 수 있도록 제한한다.
3. new 연산자를 통해 외부에서 new로 객체생성하는 것을 private 생성자를 통해서 제한한다.
싱글톤 패턴의 문제점
- 싱글톤 패턴은 구현하는 코드가 많다.
- 의존관계상 클라이언트가 구현체에 의존한다. -> DIP를 위반한다.
- 클라이언트가 구현체에 의존해서 OCP를 위반할 가능성이 높다.
- private 생성자로 자식 클래스를 만들기 어렵다.
- 유연성이 떨어진다.
스프링의 싱글톤 패턴
스프링에서는 싱글톤 패턴을 따로 구현하지 않아도 객체 인스턴스를 싱글톤으로 관리한다.
이러한 기능 덕분에 싱글톤 패턴의 모든 단점을 해결하고 객체를 싱글톤으로 유지할 수 있다.
지금까지 우리가 학습한 스프링 빈이 바로 싱글톤으로 관리되는 빈이다.
싱글톤 컨테이너
스프링 컨테이너는 싱글톤 패턴을 구현하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.
스프링 컨테이너는 싱글톤 컨테이너 역할을 한다.
스프링 컨테이너의 이러한 기능 덕분에 싱글톤 패턴의 모든 단점을 해결하고 객체를 싱글톤으로 유지할 수 있다.
- 싱글톤 패턴을 위한 코드들이 필요 없다.
- DIP, OCP와 private 생성자로부터 자유로워질 수 있다.
스프링에서는 따로 싱글톤 관련 코드를 작성하지 않아도 스프링의 기능으로 빈에다가 객체를 하나를 생성합니다.
그리고 같은 객체를 새롭게 생성했지만 같은 객체를 불러오는 결과를 볼 수 있습니다.
위의 사진과 같이 싱글톤 컨테이너를 적용시키면 memberService를 요청하면 스프링 DI 컨테이너에 미리 생성된 동일한 memberService를 반환합니다.
주의할 점
- 싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 상황이라면 객체 상태를 유지하게 설계하면 안 된다.
- 무상태로 설계해야 한다.
- 스프링 빈의 필드에 공유값을 설정하면 정말 큰 장애가 발생할 수 있다
해당 글은 김영한님의 <스프링 핵심> 강좌를 기반으로 작성되었습니다.
'Spring' 카테고리의 다른 글
[Spring] SpringSecurity 6.1에서 SecurityConfig 마이그레이션 (0) | 2024.04.28 |
---|---|
[Spring Boot] ResponseEntity를 왜 사용하나요 ? 😀 (0) | 2024.03.01 |
[JPA] JPA 영속성 컨텍스트 🤫 (6) | 2023.12.03 |
[Spring] @Bean과 @Component의 차이 👏 (1) | 2023.11.13 |
[SpringBoot] Spring Security란? 👏🏿 (0) | 2023.09.02 |