@Component
- 이 클래스는 "커스텀 빈이다."
@CompontentScan
-> base package에서부터 모든 @Componet
검색
- 인스턴스화 : 필요한 의존성을 모두 주입
- 스프링 컨테이너에 등록 : 필요한 곳에 주입
빈을 만드는 방법
@Compontent
@Bean
(in @Configuration)
@Bean
(in @Component) : Lite Mode
@Component vs @Bean
@Component
- class-level annotation
- 등록하려는 빈의 클래스 소스가 편집 가능한 경우 사용
- auto-detection에 걸림
@Bean
- method-level annotation
- 좀 더 읽기 쉬움
- 인스턴스화 하는 코드가 수동으로 작성됨
- 빈의 인스턴스 코드와 클래스 정의가 분리된 구조
- 따라서 외부 라이브러리, 써드 파티 클래스도 빈으로 등록 가능
-> 개발자가 직접 컨트롤이 가능한 Class들의 경우 : @Component
-> 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 : @Bean
컴포턴트에 해당하는 스테레오 타입 애노테이션들
@Controller
@Service
@Repository
"컴포넌트는 빈이다."
@Configuration
"이 클래스는 각종 빈 설정을 담고 있다."
1. @SpringBootApplication
이 컴포넌트 스캔을 통해 @Configuration
을 찾아냄
2. 안의 빈 설정(메소드)을 읽어서 스프링 컨테이너에 등록
3. 필요한 곳에 주입
4. 또는 각종 스프링 인터페이스의 구현에 함께 활용
"애노테이션이 의도에 맞게 사용되었는지 잘 봐주자"
- 빈 설정은
@Configuration
, 클래스 빈 등록은 @Component
@Value
- SpEL로 프로퍼티명을 표현
- type-safe 하지 않음
- 필드 주입 방식을 사용할 경우,
- 인스턴스화 이후에 주입하므로, final 쓸 수 없음
- 생성자 안에서 보이지 않음(대안 : @PostConstruct)
- 생성자 주입 방식이 가능
- 프로퍼티 Releaxed binding 지원(SpEL 표현 : kebab-case only)
- meta-data 없음
@ConfigurationProperaties
- 자바 클래스로 매핑하므로 type-safe
- 각 프로퍼티에 대응하는 meta-data 작성 가능
- Relaxed binding 지원
- 작성 방법
- 기본
- @Configuration 생략
- @Bean 메소드
- @ConstructorBinding
Spring Cache Abstraction
- 애플리케이션에 "투명하게"캐시를 넣어주는 기능
- 메소드, 클래스에 적용 가능
- 캐시 인프라는 스프링 부트 자동 설정으로 세팅되고, 프로퍼티로 관리 가능
캐시가 시스템, 애플리케이션에 투명하게 자리잡는다는 말은..
- 데이터를 통신하는 시스템 쌍방이 캐시의 존재를 모른다는 의미
- 캐시가 있건 없건, 시스템의 기대 동작은 동일해야 한다.
캐시를 쓸 때
- 잘 바뀌지 않는 정보를 외부 저장소에서 반복적으로 읽어올 때
- 기대값이 어차피 같을 때
- 캐싱해서 성능 향상, I/O 감소
주요 기능들
- @EnableCaching : 캐시 활성화
- @Cacheable : 캐시 등록
- @CacheEvict : 캐시 삭제
- @CachePut : 캐시 갱신