Spring은 DI를 사용하여 객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입시켜주는 방식을 사용한다.
이 DI를 통해 모듈간의 결합도는 낮아지고 유연성은 높아지게 된다.
Spring에서는 이 객체를 Bean
이라고 부르며, 프로젝트가 실행될 때 Bean 컨테이너가 객체를 생성해준다.
이 때, Bean은 Default로 싱글턴 패턴
으로 만들어진다.
Bean을 singleton패턴으로 만들면, 먼저 단점이 있다.
다형성을 적용하지 못한다.
안정성이 필요한 프로젝트에서 단위 테스트가 어렵다.
→ 테스트의 순서에 따라 결과가 달라짐.
→ 이 과정을 거치고 나면 Bean으로 등록된 객체를 사용할 수 있게 됨.
→ 컨테이너가 종료되면 Singleton으로 설정된 객체들도 소멸됨
만약 Bean이 상태값을 가지게 된다면, Bean 상태가 똑같이 유지되지 못하는 단점을 가지고 있다.
예를들어, Thread 1은 value를 증가시키고, Thread 2는 value를 조회하는 로직이 수행된다면, 이는 실행 순서에 따라 값이 달라질 수 있다.
따라서 Singleton으로 생성된 객체는 상태값을 가질 수 없다.
그러나, Prototype으로 Bean Scope을 설정해주면, IoC 컨테이너와 함께 생성/소멸되는 것이 아니라 요청일 올때마다 생성/소멸되기 때문에 상태값을 가질 수 있도록 할 수 있다.
대신 호출한 객체의 상태가 다를 수 있다!
이럴 때는 의존성을 주입해야할 구현체가 1개라면 @Primary를 써줌으로써 해결할 수 있다.
혹은, 상황에 따라 다르게 주입되게 하고 싶으면 @Qualifier을 사용해서 설정할 수 있다.
스프링 IoC 컨테이너가 특정 객체의 라이프사이클을 알아서 관리해준다.
소프트웨어공학프로그램 강의 수강시, 객체 생명주기를 그려서 확인했던 경험이 있는데..
Spring은 알아서 IoC 컨테이너가 관리해주고, 의존성 주입도 해주니까 되게 편하다라는 것을 느꼈다.
좋은내용이네요. 정말 예전에, 인터페이스 구현체가 2개여서 문제가 생긴적이 있었던 생각이 납니다.
그런데, 저 2개가 웹어플리케이션 동작시, 둘 다 사용되지는 않는 것이 맞나요 ? 코드상으론 그렇게 보이네요. 궁금하네용