spring 기본 개념
너무 복잡한 표준, 배보다 배꼽이 더 큰 객체지향으로 인해 스프링 프레임워크가 탄생했다.
solid원칙중 ocp와 dip를 지켜주는 di(dependency injection)컨테이너가 스프링의 핵심이다.
di컨테이너가 있으므로 스프링을 이용하는 개발자는 사용 영역을 수정하지 않고 확장할 수 있다.
또한 di컨테이너가 적절한 인스턴스를 생성자에 주입해줌으로서 구현 클래스에 의존하지 않는다.
di컨테이너에 빈을 등록하는 방법은 1. @Configuration클래스에 @Bean메소드들을 만들어 싱글톤으로 등록할 수 있고 2. @Component 어노테이션을 클래스에 붙여 스프링이 컴포넌트 스캔을 할 때 등록하게 한다.
@Component 어노테이션을 사용해 빈을 등록할 때, 의존관계 주입은 생성자 주입을 보통 사용하고 Lombok라이브러리를 사용하면 @RequiredArgsConstructor를 사용할 수도 있다. 같은 타입의 빈이 2개 이상이면 @Primary를 사용해 우선순위를 줄 수 있다.
빈 생성과 소멸에 호출해야하는 메소드가 있다면 @PostConstruct, @PreDestroy 어노테이션을 사용한다.
빈 스코프는 singleton, prototype, 웹(request 등)이 있다. singleton은 스프링 컨테이너 시작과 종료까지 유지한다. prototype는 요청마다 새로운 인스턴스가 생성된다 잘 사용되지 않는다. request는 웹 요청이 들어가고 나갈때까지 유지되는 스코프. 스코프 때문에 생성자 주입에 문제가 생긴다면 @Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)를 추가해 해결하면 된다. 그러면 CGLIB가 가짜를 만들어 주입해준다.