** 공유가 아닌 개인 공부에 목적을 둔 글입니다
** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다
싱글톤 패턴이란,
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴으로,
private 생성자를 사용해 외부에서 new 로 인스턴스 생성을 하지 못하도록 막는다
해당 인스턴스가 필요할 때는 메소드를 통해서만 조회할 수 있게 한다
그렇다면 왜 싱글톤 패턴이 필요할까?
호출을 할 때마다 새로 객체를 생성하면 메모리 낭비가 심한데,
동시에 여러 클라이언트가 서비스를 요청하는 것을 고려하면 느리고, 비효율적이다
그래서 하나의 인스턴스를 공유하도록 설계하는 것이 좋은 것이다
Spring 은 스프링 컨테이너를 통해 싱글톤 인스턴스를 기본으로 하는데, 스프링 빈이 그것이다
즉 스프링 컨테이너 = 싱글톤 컨테이너이고, 싱글톤으로 관리된 스프링 빈은 같은 참조값을 갖는다
단, 싱글톤 방식을 고려할 때 싱글톤 인스턴스는 상태를 stateful 하게 설계해서는 안된다
같은 인스턴스를 공유하기 때문에 한 클라이언트가 인스턴스 상태에 영향을 주어서는 안되기 때문이다
예를 들어, 메소드내 this.필드 를 통해 필드의 값을 변경하는 일은 없어야 한다 (공유필드를 조심)
스프링 빈은 항상 stateless (무상태) 로 설계하자
한편, 스프링이 싱글톤을 유지하려고 할 때, 클래스의 바이트코드를 조작하는 라이브러리를 사용한다
빈으로 등록된 클래스를 getBean() -> getClass() 로 출력해보면 클래스명에 CGLIB 이 붙어
내가 만든 클래스명보다 길어진 것을 확인할 수 있는데, 이는 스프링이 CGLIB 라는 바이트코드 조작 라이브러리를
사용해 해당 클래스를 상속받은 임의의 다른 클래스를 빈으로 등록한 것이기 때문이다
즉 스프링은 CGLIB 이 붙은 클래스를 통해 싱글톤을 보장하는 것이고 @Configuration 어노테이션이 그것이다
@Bean 만 적용할 시에는 싱글톤이 보장되지 않고,
CGLIB 없이 내가 만든 클래스가 그대로 빈으로 등록된 것을 확인할 수 있다
스프링 설정 정보는 항상 @Configuration 을 사용해야 한다
'Spring' 카테고리의 다른 글
[Spring] @Autowired 의존관계 주입시 조회되는 빈이 여러개일때 (0) | 2021.11.29 |
---|---|
[Spring] @ComponentScan 과 @Autowired (0) | 2021.11.29 |
[Spring] @Configuration, @Bean 이해하기 (0) | 2021.11.26 |
[Spring] DI : Dependency Injection (0) | 2021.08.28 |
[Spring] Optional <T> (0) | 2021.08.26 |