[본 포스팅은 인프런 스프링 핵심 원리 - 기본 편을 기반으로 작성하였습니다.]
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢
www.inflearn.com
스프링은 본래 온라인 서비스 기술이다. 즉 사용자가 많아질수록 트래픽이 심해지는 웹 어플리케이션을 만드는데 특화된 기술이다.
if) 스프링 없는 DI 컨테이너를 이용한다면 고객의 요청이 올 때마다 객체가 생성되고 소멸된다.
해결) 해당 객체가 1개만 생성되고 공유하도록 설계하면 된다. -> 싱글톤 패턴
하지만 싱글톤 패턴에도 문제점이 있다.
- 싱글톤 패턴에 구현하는 코드 자체가 많이 들어간다.
- 의존관계상 클라이언트가 구체 클래스에 의존한다.
- 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.
- 테스트하기 어렵다.
- 내부 속성을 변경하거나 초기화 하기 어렵다.
- private 생성자로 자식 클래스를 만들기 어렵다.
- 결론적으로 유연성이 떨어진다.
- 안티패턴으로 불리기도 한다.
위의 문제점을 스프링 컨테이너는 해결하고 객체 인스턴스를 싱글톤으로 관리한다.
싱글톤 방식의 주의점: 공유 필드를 조심하자! 항상 무상태(stateless)로 설계할 것!
- 특정 클라이언트에 의존적인 필드가 있으면 안된다.
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다.
- 가급적 읽기 전용으로 만들 것!
- 필드 대신에 자바에서 공유되는 않는, 지역변수, 파라미터, TreadLocal 등을 사용해야 한다.
마지막으로 가장 중요한 스프링 컨테이너가 싱글톤을 보장해주는 이유에 대해 작성하겠다.
결론부터 말하자면 @Configuration이 CGLIB 바이트조작 라이브러리를 호출해서 싱글톤을 보장해준다.
스프링 컨테이너에 Bean을 등록하여 출력한 결과이다.
bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70
'Spring > Basic' 카테고리의 다른 글
빈 생명주기 콜백 (0) | 2023.08.02 |
---|---|
조회 대상 빈이 2개 이상 - 문제 (0) | 2023.08.02 |
롬복과 최신 트랜드 (0) | 2023.08.02 |
의존관계 자동 주입 (0) | 2023.08.02 |
AppConfig의 관심사 분리 (0) | 2023.08.01 |