📌 수동 빈(Bean), 자동 빈(Bean) 결정 기준
🧷 결론
- 점점 자동으로 하는 추세다.
- 스프링은 @Component, @Controller, @Service, @Repository 처럼 계층에 맞게 애플리케이션 로직을 자동으로 스캔할 수 있도록 지원한다.
- 스프링 부트는 @ComponentScan을 기본으로 사용하고 조건을 통해 다양한 스프링 빈을 자동으로 등록하게 설계했다.
🔍 자동 빈(Bean) vs 수동 빈(Bean) 사용 시기
애플리케이션은 크게 '업무 로직'과 '기술 지원 로직'으로 나눌 수 있다.
🧷 결론
업무 로직은 자동 빈(Bean)으로 등록하고 기술 지원 로직은 수동 빈(Bean)으로 등록하는 것이 좋다.
✔ 업무 로직 빈(Bean)
- 보통 비즈니스 요구사항을 개발할 대 추가되거나 변경되는 것.
- 웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는 리포지토리 등등.
✔ 기술 지원 빈(Bean)
- 기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용된다.
- 데이터베이스 연결, 공통 로그 처리 등 업무 로직을 지원하기 위한 하부 기술이나 공통 기술들.
업무 로직은 숫자도 매우 많고, 한번 개발해야 하면 컨트롤러, 서비스, 리포지토리처럼 어느정도 유사한 패턴이 있다. 이런경우 자동 기능을 적극 사용하는 것이 좋다. 보통 문제가 발생하더라도 어떤곳이 문제가 발생했는지 파악하기 쉽다.
기술 지원 로직은 업무 로직과 비교해서 수가 적다. 그러나 애플리케이션 전반에 걸쳐서 광범위하게 영향을 미친다. 업무 로직은 문제가 발생했을 때 어디가 문제인지 명확하게 파악할 수 있지만, 기술 지원 로직은 적용이 잘 되고 있는지 아닌지 조차 파악하기 어려운 경우가 많다. 그래서 이런 기술 지원 로직들은 가급적으로 수동 빈 등록을 사용해서 명확하게 파악할 수 있도록 한다.
애플리케이션에 광범위하게 영향을 미치는 기술 지원 객체는 수동 빈(Bean)으로 설정 정보에 바로 나타나게 하는 것이 유지보수하기 좋다.
💡 수동 빈 등록
@Configuration
public class DiscountPolicyConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
위 코드처럼 수등 빈으로 등록할 경우 여러 클래스 파일을 찾아보지 않아도 한 눈에 다 파악할 수 있다.
설정 정보만 봐도 한눈에 빈의 이름, 어떤 빈들이 주입될지 쉽게 보인다.
만약에 수동 빈이 아니라 자동 빈으로 사용하고 싶다면, 파악하기 쉽게 DiscountPolicy의 구현 빈들을 따로 모아서 특정 패키지에서 관리해야 한다.
참고로 스프링, 스프링부트에서 자동으로 등록하는 빈들은 예외다. 이런 부분은 스프링을 잘 이해하고 스프링의 의도대로 잘 사용하는게 중요하다. 스프링 부트 경우 DataSource 같은 데이터베이스 연결에 사용하는 기술 지원 로직까지 내부에서 자등으로 빈을 등록한다. 이런 부분은 메뉴얼을 잘 참고해서 스프링 부트가 의도한 대로 편리하게 사용하면 된다.
반면, 스프링 부트가 아니라 내가 직접 기술 지원 객체를 스프링 빈으로 등록한다면 수동으로 등록해서 명확하게 들어내는 것이 좋다.
🧷 정리
- 편리한 자동 기능을 기본으로 사용하자
- 직접 등록하는 기술 지원 객체는 수동으로 하자
- 다형성을 적극 활용하는 비즈니스 로직은 수동 등록을 고민하자
'[ Spring ] > Spring' 카테고리의 다른 글
[Spring] HttpServletRequest 객체 (0) | 2022.02.06 |
---|---|
[Spring] 빈(Bean) 스코프(scope) (0) | 2022.01.31 |
[Spring] 빈(Bean) 생명주기 콜백 시작 (0) | 2022.01.29 |
[Spring] 조회한 빈(Bean)을 List, Map에 담기 (0) | 2022.01.24 |
[Spring] DI (의존성 주입) (0) | 2022.01.22 |