context.getBean()은 기본적으로 Object 반환 하지만 제네릭 사용해 어떤 타입이든 상관 없음, 원래는 귀찮게 캐스팅 다해줘야됐음
Client가 UserDao 요청 -> Application Context가 getBean() 조회 -> @Configuration에서 생성 -> Client가 사용
DaoFactory vs Application Context
1. Client가 구체적인 팩토리 클래스를 몰라도된다.
2. Application Context는 종합 IoC 서비스 제공
- 오브젝트 후처리기, 인터셉터 등
3. Application Context는 빈을 검색하는 다양한 방법 제공
동일성은(==) 완전 같다 -> 오브젝트가 하나다
동등성은 equal() 비교같다 -> 메모리에 등록된 오브젝트가 두개
스프링은 싱글톤 빈을 생성 => 대부분 서버환경에서 실행, 여러 쓰레드에서 하나의 오브젝트를 공유해 동시에 사용하기 떄문에 유리
싱글톤 문제점
private 생성자 때문에 상속 X
테스트 어려움 (Mock 만들기 어렵)
서버환경에서는 싱글톤이 만들어지는 것을 보장 X
서버에서 클래스 로더를 어케 구성하느냐에 따라 달라짐
전역 상태를 만든다. 객체지향에서는 별로 안좋음
스프링이 제공하는 싱글톤 형태 기능은 싱글톤 레지시트다.
- 평범한 자바클래스를 싱글톤으로 만들어 준다.
싱글톤 사용시 주의점
상태 관리 주의 ( 무상태방식 )
파라미터와 로컬변수, 리턴값으로 극복
IoC는 애매한 용어, 스프링만의 차별화된 기능인 의존관계 주입, DI컨테이너라고도 한다.