-
(스프링 기본) 25 - 의존 관계 등록 올바른 실무 기준 (자동, 수동)개발/Spring 2024. 10. 28. 16:46
기본으로는 ComponentScan 자동 등록을 사용하자!! (추천)
@Controller, @Service, @Repository 처럼 계층 맞추어
일반적인 애플리케이션 로직 자동으로 스캔할 수 있도록 스프링이 지원한다.
더불어 현재 스프링 부트의 경우, 컴포넌트 스캔을 기본으로 사용하고,
다양한 스프링 빈들도 조건이 맞으면 자동 등록 되도록 설계되었다.
자동으로 빈 등록을 사용해도 OCP, DIP 지킬 수 있다.
■ 수동 빈 등록은 언제 하는가?
애플리케이션은 크게 업무로직과 기술 지원 로직으로 나뉜다.
1. 업무로직 빈 (자동 등록 추천)
웹을 지원하는 컨트롤러, 핵심 비즈니스 로직 있는 서비스, 데이터 계층 로직 처리하는 리포지토리 등
보통 비즈니스 요구사항 개발할 때 추가되거나 변경된다.
2. 기술 지원 빈 (수동 등록 추천)
기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용한다.
데이터베이스 연결이나, 공통 로그 처리 등 업무 로직을 지원하기 위한 하부 기술이나 공통 기술
업무 로직은 숫자 많고 유사한 패턴이 있다. -> 자동 기능 적극 사용
발생해도 어디서 문제 발생했는지 명확하게 파악 쉽다
기술 지원 로직은 숫자가 적고 애플리케이션 전반에 걸쳐 영향을 미친다.
발생 문제 확인이 어려워 수동 빈 등록을 사용해 명확히 들어내는 것이 좋다.
- 비즈니스 로직 중 다형성 적극 활용할 때 (수동 등록 고민!)
static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); } }
이렇게 돼 있으면 다른 개발자가 DiscountPolicy 가 어떤걸 구현했는지 다 들어가서 봐야 한다.
@Configuration public class DiscountPolicyConfig { @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy(); } @Bean public DiscountPolicy fixDiscountPolicy() { return new FixDiscountPolicy(); } }
그러나 다음과 같이 수동으로 등록돼서 하나의 파일에 들어가 있으면
개발자가 다음 두 개가 빈 객체로 등록된 것을 한 번에 알 수 있다.
이는 개발자 취향과 선택에 따른다.
만약 자동 등록으로 한다면 적어도 같은 패키지에 묶어 둬서 다른 개발자가 알 수 있도록 하는게 중요하다.
※ 스프링과 스프링부트가 자동으로 등록하는 수 많은 빈들은 건드리지 말자
■ 정리
- 편리한 자동 기능 기본으로 사용
- 직접 등록하는 기술 지원 객체는 수동 등록
- 다형성 적극 활용하는 비즈니스 로직은 수동 등록도 고민해보자
출처 : 김영한 스프링 핵심 원리 - 기본편
'개발 > Spring' 카테고리의 다른 글
(스프링 기본) 27 - 인터페이스 InitializingBean, DisposableBean (0) 2024.10.29 (스프링 기본) 26 - 빈 생명주기 콜백 (0) 2024.10.29 (스프링 기본) 24 - 조회된 빈이 모두 필요할 때 (List, Map) (0) 2024.10.28 (스프링 기본) 23 - 어노테이션 만들기 (0) 2024.10.28 (스프링 기본) 22 - 조회된 빈이 2개 이상 문제 (@Qualifier, @Primary) (0) 2024.10.28