프로그램 전체에서 단 하나의 객체만 생성하여 재사용하는 디자인 패턴이다.
(Spring에서는 기본적으로 모든 @Bean, @Component, @Service 객체들이 자동으로 싱글톤으로 관리된다.)
Singleton패턴은 Singleton인터페이스를 구현받아 사용할 수 있다.(implements Singleton)
위와 같은 이유로 싱글톤을 사용한다.
싱글톤 객체는 상태를 공유하므로 세터와 같이 필드 변경이 가능할 경우 다음과 같은 문제가 생긴다.

위 코드는 세터를 이용하여 클라이언트 1과 2가 각각 값을 할당하고, 클라이언트 1이 다시 조회하는 코드이다.
실행 결과

하나의 객체를 공유하므로 클라이언트 1이 설정한 값은 클라이언트 2가 설정한 값으로 덮어씌어진다.
따라서 싱글톤 객체는 항상 stateless하게 설계하는 것이 좋다.