티스토리 뷰
//앱 구성을 스프링으로 관리하기 위한 @Configuration
@Configuration
public class AppConfig {
//스프링 컨테이너에 객체들을 관리 하기 위해 @Bean으로 등록
//스프링 컨테이너에 등록된 객체들을 '스프링 빈' 이라고 한다
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
@Configuration은 비즈니스 요구사항에 따라 설계한 객체들을 스프링으로 관리하기 위해 삽입하는 어노테이션이다. 스프링 Config에는 이 어노테이션을 반드시 붙여야 스프링이 제공하는 온전한 기능을 이용할 수 있다.
앞서 스프링 컨테이너는 싱글톤 패턴을 보장한다고 했는데, 바로 @Configuration 덕분이다.
위의 코드에서 MemoryMemberRepository가 세 번 생성되지 않는 이유는, @Configuration으로 AppConfig의 자식 클래스인 AppConfig@CGLIB 클래스가 생성되고 그 클래스에서 @Bean이 붙은 메서드들의 중복 여부를 확인하여 등록되어 있으면 등록된 것을 반환하도록 로직 구현이 되어있기 때문이다. (AppConfig@CGLIB는 AppConfig를 조회하면 조회 가능하다)
@Configuration을 사용하지 않고 @Bean만으로 등록 가능하다. 하지만 싱글톤이 보장되지는 않는다. (@Autowired 를 이용해 의존 관계 자동 주입으로 해결할 수는 있다)
참고: 김영한 - 스프링 핵심 기본원리(인프런)
'Spring' 카테고리의 다른 글
| 롬북(Lombok)의 @RequiredArgsConstructor 기능 (0) | 2023.08.16 |
|---|---|
| 컴포넌트 스캔 (0) | 2023.08.15 |
| 싱글톤 패턴과 스프링 컨테이너 (0) | 2023.08.14 |
| 좋은 객체 지향 설계 5가지 원칙(SOLID) (0) | 2023.08.09 |
| 스프링과 스프링부트 (0) | 2023.08.09 |