일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 레벨2
- 백준
- Paging
- 의존성
- 세션
- 스프링 부트
- AWS
- 우아한테크코스
- 프로그래머스
- yml
- 우테코
- Docker
- 서블릿
- JUnit5
- 미션
- mock
- CircuitBreaker
- Spring Batch
- REDIS
- MSA
- 트랜잭션
- 우아한세미나
- Level2
- 스프링부트
- JPA
- 코드리뷰
- HTTP
- 프리코스
- AOP
- 자바
Archives
- Today
- Total
늘
[스프링 싱글톤] Bean과 Component 차이 본문
728x90
왜 스프링은 싱글톤으로 Bean을 만드는가?
스프링은 was 시작과 동시에 Ioc컨테이너에 빈을 생성하고 관리한다. 따라서 서버의 성능을 좋게 하기 위해서 싱글톤 방식을 취한다. 싱글톤 방식을 사용하지 않는다면 매번 Bean을 생성해야 하므로 성능이 안 좋다.
하지만 싱글톤을 사용하면 한 번에 Bean을 여러 개 만들어서 요청이 들어올 때마다 사용하면 되기 때문에 성능이 좋아진다.
저번 게시물에 디자인 패턴에서 싱글톤 패턴을 학습해서 정리했었다. 그런데 이번 스프링 컨테이너의 싱글톤을 공부하면서 같은 싱글톤이라고 생각했는데 스프링의 싱글톤 레지스트리와 자바의 싱글톤 패턴은 다르다고 한다!
싱글톤 레지스트리는 자바의 싱글톤 패턴의 단점을 보완한 것이라고 한다.
자바의 싱글톤패턴의 단점은 아래와 같다.
- private로 생성자를 지정하기 때문에, 상속되지 않아 다형성을 지원하지 않기 때문에 객체지향적이지 못하다.
- static으로 지정하기 때문에, 전역 상태로 사용이 되어 아무 객체나 자유롭게 접근하고 수정하고 공유할 수 있는 것은 객체지향 프로그래밍에서 권장하지 않는 모델이다. (하지만 util 클래스에서의 사용은 도메인과 직접적인 관련이 없어서 사용해도 괜찮다고 생각이 된다.)
- 싱글톤으로 생성되면 객체테스트가 어렵기 때문에, 테스트를 위한 객체를 새로 만들어야 한다.
단점을 보완하기 위해 스프링은 싱글톤 레지스트리로 싱글톤 객체 생성 관리를 하기 때문에 객체에서는 싱글톤 생성과 관리를 할 필요가 없어져 평범한 객체로서 사용이 가능하다.
평범한 객체로서 사용이 가능해지면서 아래와 같은 장점을 같게 된다.
- 생성자를 public으로 지정 가능하여 객체를 객체지향적으로 프로그래밍 가능.
- static으로 지정할 필요 없기 때문에 전역 상태로 관리되지 않아도 된다.
- 테스트를 위해 해당 객체를 그대로 사용 가능하여 테스트에도 용이하다.(자바 엔터프라이즈 환경에서는 가장 중요)
이러한 이유들로 스프링 컨테이너는 bean으로 관리를 하는 것이다. 이게 사용 이유!
@Bean
- Spring IoC 컨테이너(또는 DI 컨테이너)에 의해 생성 및 관리된다.
- 기본적으로 싱글톤 방식으로 Bean이 생성된다.
- 매서드에 붙일 수 있다. 클래스 위에는 @Configuration을 붙여줘야 한다.(객체를 생성할 때 싱글톤을 보장하기 위해)
- 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다.
@Compononet
- 개발자가 직접 컨트롤이 가능한 Class들의 경우엔 @Component를 사용한다.
- class에서만 사용이 가능하다. (뜯어보면 target이 TYPE으로 지정되어 있어서 class에서만 사용이 가능하다.)
정리
@component은 setter나 builder 등을 통해서 사용자가 프로퍼티를 변경해서 생성한 인스턴스를 스프링에게 관리하라고 맡기는 것,
@bean는 클래스를 스프링한테 알아서 인스턴스 생성한 후에 등록(bean으로) 하라고 맡기는 것 차이가 있다.
Reference
728x90
'백앤드 개발일지 > 스프링부트' 카테고리의 다른 글
[Gradle] runtimeOnly와 implementation와 testImplementation의 차이 (0) | 2022.03.31 |
---|---|
[아키텍처] 계층형 아키텍처와 MSA (2) | 2022.02.11 |
[webflux] webclient 이슈 정리 (2) | 2022.01.04 |
springboot logback cloudwatch에 보내기 (0) | 2021.12.01 |
[스프링부트] AOP를 이용한 로그파일 설정 & slf4j (0) | 2021.11.07 |
Comments