➤ 기본 개념
- Spring은 Spring Container를 통해 객체를 관리한다
- 스프링 컨테이너에서 관리하는 객체를 bean(빈)이라고 한다
- @Configuration : 클래스 위에 작성하여 해당 클래스가 IoC 컨테이너에 bean definition 소스로 사용될 수 있음을 알려줌
- @Bean : 메서드 위에 작성하여 해당 메서드가 스프링 컨테이너에 자동 등록되도록 함
@Configuration과 @Bean 공식 문서
https://docs.spring.io/spring-framework/docs/3.0.0.M4/reference/html/ch03s11.html
❑ Bean Definition
bean definition = 레시피
bean definition은 configuration metadata 정보를 포함하고 있는 인터페이스이다.
configuration metadata
- 빈을 어떻게 생성할 것인가
- 빈의 생명주기에 대한 설명
- 빈의 종속성
Bean Definition 참고 자료
https://www.tutorialspoint.com/spring/spring_bean_definition.htm
BeanDefinition 필드 및 메서드
❑ Bean Scope
Spring Framework는 6개의 scope를 지원함
그 중에 4개는 ApplicationContext를 사용하는 경우에만 사용할 수 있음
bean은 여러 scope 중 하나를 설정할 수 있음
사용자 정의 scope를 설정할 수도 있음
Scop | Description |
singleton |
(Default) Spring IoC 컨테이너당 단일 인스턴스로 bean definition scpoe를 지정
|
prototype | 스프링 컨테이너가 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프 |
request | 웹 요청이 들어오고 나갈 때 까지 유지되는 스코프 |
session | 웹 세션이 생성되고 종료될 때까지 유지되는 스코프 |
application | ServletContext 라는 클래스 타입의 객체로 생성되어 서버가 종료될 때까지 유지 |
websocket | 단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장함 Spring ApplicationContext의 컨텍스트에서만 유효함 |
➤ 스프링 없는 컨테이너만 사용한 객체 생성방법
같은 클래스의 여러 인스턴스를 만들면 서로 다른 주소값을 가진다.
수많은 객체를 생성하게 되면 이 방식은 메모리 낭비가 생기고 효율성이 떨어지게 됨
-> 해결 방법으로 싱글톤 패턴을 사용할 수 있음
❑ Singleton Scope
싱글톤 패턴 : 클래스의 인스턴스를 단 1개만 생성하도록 하는 디자인 패턴
스프링 컨테이너의 시작과 함께 인스턴스가 생성되어 스프링 컨테이너가 종료될 때까지 유지됨
싱글톤 빈의 하나의 공유 인스턴스만 관리함
생성자를 private로만 만들어서 외부에서 임의의 new로 인스턴스를 만드는 것을 방지함
스프링 컨테이너 종료시 소멸 메서드도 자동으로 실행됨
➤ 싱글톤?
싱글톤은 해당 빈의 인스턴스를 오직 하나만 생성해서 사용하는 것을 의미함
단일 인스턴스는 싱글톤 빈의 캐시에 저장됨
이름이 정해진 빈에 대한 모든 요청과 참조는 캐시된 개체를 반환함
싱글톤 스코프의 스프링 빈은 여러번 호출해도 모두 같은 인스턴스의 참조 주소값을 가짐
▶️ 싱글톤 디자인 패턴은 어떤 때 사용할까?
예를 들어 CodeStates라는 회사 클래스와 크루, 수강생 클래스가 있다.
크루와 수강생은 여러 명일 수 있으므로 인스턴스를 여러 개 생성하면 되지만
CodeStates는 어떤 크루나 수강생 객체에서 참조해도 동일한 회사이므로 하나의 인스턴스만 생성해도 된다.
싱글톤 패턴 적용 코드
public class CodeStates {
// static 영역에 단일 객체 생성
private static final CodeStates instance = new CodeStates();
// getInstance 메서드로만 인스턴스 호출
public static CodeStates getInstance() {
return instance;
}
// 생성자를 private 으로 선언하여 외부에서 new 키워드로 인스턴스 생성하는 것을 방지
private CodeStates() {
}
public void getInfo() {
System.out.println("CodeStates 입니다.");
}
}
▶️ 코드 특징
- static 영역에 객체 인스턴스를 미리 1개 생성함
- 객체 인스턴스가 필요한 경우 getInstance() 메서드를 통해서만 조회
- 항상 같은 인스턴스가 호출됨
- 외부에서 생성자를 new로 새로 만드는 것을 방지하기 위해 private으로 생성자를 생성함
스프링 컨테이너의 기본값은 싱글톤이기 때문에 위 코드처럼 직접 static 인스턴스를 만들지 않아도 됨
➤ 싱글톤 패턴의 문제점
- 싱글톤 패턴을 구현하는 코드 자체는 많음
- 의존 관계상 클라이언트가 구체 클래스에 의존함
- 지정해서 가져오기 때문에 테스트하기 어려움
- private 생성자를 사용하여 자식 클래스를 만들기 때문에 유연성이 떨어짐
- 속성 공유
- Application 초기 구동 시 인스턴스 생성
➤ 싱글톤 패턴 문제 해결
싱글톤 패턴의 문제는 스프링 컨테이너로 해결할 수 있다.
스프링 컨테이너는 싱글톤 컨테이너 역할을 한다.
싱글톤 객체로 생성하고 관리하는 기능을 싱글톤 레지스트리라고 함
스프링 컨테이너의 위 기능 덕분에 싱글톤 패턴의 모든 단점을 해결하고 객체를 싱글톤으로 유지할 수 있음
싱글톤 컨테이너로 관리하려는 객체의 클래스에 @Configuration(클래스 위에 작성)와 @Bean(메서드 위에 작성)을 작성해준다.
@Bean을 통해 스프링 컨테이너에 등록됨
➤ 싱글톤 방식 주의점
여러 클라이언트가 하나의 객체 인스턴스를 공유하기 때문에 몇가지 조심할 부분이 있다.
상태를 유지하게(stateful) 설계하면 안된다. 무상태(stateless)로 설계해야 한다.
- 특정 클라이언트가 값을 변경할 수 있으면 안됨
- 특정 클라이언트에서 의존적인 필드가 존재하면 안됨
- 클라이언트가 수정할 수 있으면 안됨, 읽기만 가능해야함
- 스프링 빈의 공유 값을 설정하면 장애가 발생할 수 밖에 없음 -> 공유되지 않는 지역변수, 매개변수 사용
싱글톤 이외의 다른 Scope Reference
읽어주셔서 감사합니다. 좋은하루 되세요.🥰
오개념에 대한 지적은 언제나 환영입니다~
'TIL(Today I Learned)' 카테고리의 다른 글
6/21 (화) Spring Framework - AOP 2️⃣ (0) | 2022.06.21 |
---|---|
6/20 (월) Spring Framework - AOP 1️⃣ (2) | 2022.06.20 |
6/17 (금) Spring Framework - DI(Dependency Injection) 1️⃣ Spring Container와 Bean (0) | 2022.06.18 |
6/15 (수) Spring Framework 모듈, Spring Boot (0) | 2022.06.17 |
6/15 (수) Spring Framework의 특징 2️⃣ (0) | 2022.06.15 |