작성
·
277
0
스프링은 싱글톤으로 객체를 생성하기 때문에 변경 가능성이 없어야 한다고 하셨잖아요, 그런데 의존관계 주입 방법에서 setter를 이용해 주입하는 방법은 변경 가능성이 있는 경우에 사용하라고 하신것과 약간 충돌이 나는 느낌이 있어서요,
위 설명에서 무엇을 알려주시고자 했는지 의도에 대한 부가설명을 해주세요.
혹시 싱글톤 객체는 stateless 해야 한다는 것은 구현체의 필드값이 stateless 해야 한다는 것이고, 생성자 주입과 setter 주입은 어떤 구현체를 쓸 것인가와 관련된 부분인가요? 제가 다른 주제의 이야기를 혼동하고 있었나요?
또, 생성자 주입을 이용하는 이유는 단지 널포인터익셉션을 방지하기 위함일 뿐인가요? 이것만 주의하면 setter 주입을 사용해도 되나요? 변경 가능성이 있는 의존관계에서 사용한다는데 생각보다 많은 곳에서 사용될 것 같아서요,,
답변 1
2
안녕하세요, taeyeong.jeong419 님! 공식 서포터즈 codesweaver 입니다.
스프링 컨테이너는 스프링 빈을 (기본적으로) 싱글톤 스코프로 관리합니다.
싱글톤인 스프링 빈은 여러 프로세스가 동시에 접근, 사용할 수 있기에 stateless 설계가 중요합니다.
그렇지 않으면 리소스 충돌이 일어나는 등 상황을 예측할 수 없기 때문입니다.
그래서 강의에서는 생성자를 통한 스프링 빈 주입을 권장하였습니다.
그리고 setter를 제공하지 않아, 외부에서 이를 변경할 가능성을 완전히 차단합니다.
그리고 멤버 변수에 private final을 적용하여 내부에서 변경할 가능성도 차단하는게 일반적입니다.
이런 규칙은 ‘법칙’이 아니기에 강요할 수 없으나, 여러 상황을 겪으며 축적된 좋은 사례(best practice)라고 생각하시면 됩니다.
감사합니다.