[Spring] 어플리케이션 컨텍스트에서 빈 생성 방법
싱글톤 레지스트리
스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.
왜 스프링은 싱글톤으로 빈을 만든 것인가?
스프링은 대부분 서버환경에서 사용이된다. 그런데 매번 클라이언트에서 요청이 올 때마다 각 로직을 담당하는 오브젝트를 새로 만들어서(싱글톤이 아니라 생각) 사용한다고 생각해보자. 아무리 자바의 오브젝트 생성과 가비지 컬렉션의 성능이 좋아졌다고 한들 너무 많은 요청은 서버가 감당하기 힘들 것이다.
우리가 알아야 할 것은 자바의 기본적인 싱글톤 패턴의 구현 방식의 단점이 있기 때문에,
스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공하고 그것이 바로 "싱글톤 레지스트리 "라 한다.
싱글톤 레지스트리 장점
스태틱 메소드와 Private 생성자를 사용해야하는 클래스가 아니라 평범한 자바 클래스를 싱글톤으로 활용하게 한다.
---> public 생성자를 가질 수 있다.
주의 해야 할 점
싱글톤은 멀티스레드 환경이라면 여러 스레드가 동시에 접근해서 사용할 수 있다.
기본적으로 싱글톤이 멀티스레드 환경에서 서비스 형태의 오브젝트로 사용되는 경우에는 상태정보를 내부에 갖고 있지 않은 무상태 방식으로 만들어져야 한다. 다중 사용자의 요청을 한꺼번에 처리하는 스레드들이 동시에 싱글톤 오브젝트의 인스턴스 변수를 수정하는 것은 매우 위험하다. 저장할 공간이 하나뿐이니 서로 값을 덮어쓰고 자신이 저장하지 않은 값을 읽어올 수 있기 때문이다.
그렇다면 상태가 없는 방식으로 클래스를 만드는 경우에 각 요청에 대한 정보나, DB나 서버의 리소스로부터 생성한 정보는 어떻게 다뤄야할까? 이때 파라미터와 로컬변수, 리턴 값을 이용하면된다. 이것들은 매번 새로운 값을 저장할 독립적인 공간이 만들어지기 때문에 싱글톤이라고 해도 덮어쓸 일이 없다.
스프링 빈의 스코프
빈이 생성되고, 존재하고, 적용되는 범위에 대해 알아보자. 스프링에서는 이것을 빈의 스코프라고 한다. 스프링 빈의 기본 스코프는 싱글톤이다. 싱글톤 스코프는 컨테이너 내에 한 개의 오브젝트만 만들어져서, 강제로 제거하지 않는 한 스프링 컨테이너가 존재하는 동안 계속 유지된다. 스프링에서 만들어지는 대부분의 빈은 싱글톤 스코프를 갖는다. 경우에 따라서는 다른 스코프를 가질 수 있는데 대표적으로 프로토타입 스코프가 있다.
프로토타입은 컨테이너에 빈을 요청할 때마다 매번 새로운 오브젝트를 만들어준다. 그 외에도 웹을 통해 새로운 HTTP 요청이 생길 때마다 생성되는 요청 스코프가 있고, 웹의 세션과 스코프가 유사한 세션 스코프도 있다.