코드를 작성할때 DI를 의식하면서 설계하는게 좋음
DI를 적용할때는 가능한 한 인터페이스를 사용하세 해야함
HashMap -> 멀티쓰레드 환경에서 동시에 수정을 시도하거나 수정과 동시에 요청하는 경우 예상치 못한 결과가 발생할 수 있음.
ConcurrentHashMap -> 동기화된 해시 데이터 조작에 최적화됨
Embedded Database -> 애플리케이션과 함께 시작되고 종료되는 DB
데이터가 메모리에 저장되기 때문에 IO로 발생하는 부하가 적음
스프링의 EmbeddedDatabaseBuilder -> DB엔진 생성 초기화 -> 스크립트 실행 -> 테이블 & 데이터 준비 -> EmbeddedDataSource(extends DataSource ) 돌려줌
테스트 클래스를 상속받은 서브클래스에서 테스트를 실행하면 수퍼클래스의 테스트들도 실행됨
TransactionManager 을 싱글톤 빈으로 등록해서 사용하는 이유
-> Transaction Proxy들이 같은 TransactionManager을 공유해야 하기 때문
Java 소스코드가 실행되는 과정
소스코드 -> 컴파일 -> .class -> JVM에 의해 메모리로 로딩돼 실행
자바 코드의 일부를 리플렉션 API등을 이용해 어떻게 만들었는지 살펴보고 그에 따라 동작하는 기능이 점점 많이 사용됨
애노테이션은 자바 코드가 실행되는데 직접 참여하지 못함.
애노테이션은 프레임워크가 참조하는 메타정보로 사용됨.
스프링 초창기때부터 XML이 프레임워크가 사용하는 관계 설정용 DI 메타정보로 적극 활용돼왔음.
애노테이션을 참고하는 코드에서는 해당 애노테이션에 대한 다양한 부가 정보를 얻어낼 수 있음.