스프링의 핵심원리 이해와 스프링 기본기를 다지기 위한 프로젝트 객체지향 특성 기반과 예제 및 테스트 코드로 스프링 프레임워크에 대해 학습
- 자바 기반의 프레임워크
- 자바의 가장 큰 특징인 객체지향언어
- 스프링은 객체지향언어 특성을 잘 살려낸 프레임워크
- 그렇기에 좋은 객체 지향 애플리케이션을 개발할 수 있도록 도와준다
- 스프링 컨터이너가 프로그램의 제어 흐름을 담당하여 의존관계 주입
- 확장에는 열리고 변경에는 닫힌 OCP(Open/Closed principle) 만족. 인터페이스를 구현하면 컨테이너에 등록하면 확장이 용이하다. 그리고 컨테이너가 직접 빈을 등록시키기 때문에 클라이언트 코드는 변경에 닫혀있다.
- 추상화에 의존하는 DIP(Dependency inversion principle) 만족. 클라이언트 코드는 추상화(인터페이스)에만 의존하여도 구현 클래스의 수정 및 변경에 영향을 받지 않는다.
- 스프링 빈은 이름, 타입, 부모 타입으로도 조회가 가능하다.
- 어노테이션 기반으로 빈, 설정 등록
- ApplicationContext 컨테이너는 빈을 관리하는 BeanFactory와 부가기능을 제공하는 다양한 인터페이스를 상속받는다.
- ApplicationContext 인터페이스를 구현하는 방법에 따라 다양하게 스프링을 구현할 수 있다. 그렇기 때문에 XML 기반으로 빈 등록, 어노테이션 기반 빈 등록 등 여러 방법으로 빈을 등록할 수 있다.
- 스프링 빈을 기본적으로 싱글톤으로 관리한다. 그렇기 때문에 stateless 무상태로 설계해야 한다. 공유 값을 설정하면 큰 장애가 발생할 수 있다.
- 스프링 빈 등록 대상을 스캔한다.
- 컴포넌트스캔은 기본적으로 @ComponentScan이 적용된 클래스 패키지에서 스캔한다. 관습적으로 프로젝트 시작 루트에 위치한다.
- @Controller, @Service, @Repository, @Configuration도 빈 등록 대상으로 타고 들어가면 @Component이 등록되어 있다.
- 스프링 컨테이너가 의존관계를 자동으로 주입하는 방식으로 생성자, setter, 필드, 일반 메서드 주입 4가지가 있다.
- 생성자 주입 방식을 권장한다. 이유는 누락방지와 final 키워드로 중간 변경을 방지할 수 있다. 또한 순수 자바 기반의 테스트 코드를 작성할 때 프레임워크없이 코드 작성이 가능하다.
- 조회 빈이 둘 이상일 때 @Qualifier, @Primary를 이용하여 오류를 해결할 수 있다.
- 자동 등록 빈은 @Component(@Service, @Controller, @Repository) 으로 자동으로 스캔하는 것으로 업로 로직에서 주로 사용한다. 자동 등록은 설정에서 하나하나 등록하지 않아도 되는 장점이 있다.
- 수동 등록 빈은 @Configuration 설정 정보에서 @Bean 으로 등록하는 것을 말한다. 수동 등록은 한 곳에서 등록된 빈들을 모두 관리할 수 있는 장점이 있다. 주로 기술적인 문제나 공통 관심사 AO를 처리할 때 사용된다.
- 빈은 라이프사이클에 따라 초기화 콜백과 소멸 전 콜백 두 가지 콜백을 제공한다.
- @PostContruct, @PreDestroy 적용하여 콜백함수를 구현할 수 있으며, 이 방법이 현재 스프링에서 권장하는 방법이다.
- 빈 스코프는 빈이 유지되는 범위를 의미한다. @Scope(”종류”)
- 싱글톤, 프로토타입, 웹 관련 스코프로 크게 3가지 있다.
- 싱글톤은 기본 스코프로 컨테이너 시작과 종료까지 가장 넓은 범위 스코프다.
- 프로토타입은 빈의 생성과 초기화까지만 컨테이너가 관리하는 스코프다. 그렇기 때문에 소멸 전 콜백은 호출되지 않는다.
- 웹 관련 스코프로는 핵심적으로 request 스코프가 있으며, 웹 요청이 들어오고 나갈 때까지만 유지된다. 객체 조회를 정말 필요한 시점까지 지연처리가 가능하다는 장점이 있다. 적용 예시로 웹 요청 별 로그를 기록할 수 있다.