일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- @Component
- 카카오 코테
- python
- 카카오
- 프로그래머스
- Nodejs
- nestjs typeorm
- 가상면접사례로배우는대규모시스템설계기초
- AWS
- 구조체배열
- OpenCV
- 컴포넌트스캔
- TypeORM
- 코딩테스트
- thymeleaf
- nestJS
- git
- 해시
- C언어
- 코테
- C++
- 스프링
- Spring
- @Autowired
- 카카오 알고리즘
- spring boot
- 시스템호출
- 알고리즘
- nestjs auth
- 파이썬
- Today
- Total
공부 기록장 💻
[Spring] 스프링 빈 자동, 수동 등록을 언제 각각 사용하는 것이 좋은가? 본문
[Spring] 스프링 빈 자동, 수동 등록을 언제 각각 사용하는 것이 좋은가?
dream_for 2023. 2. 13. 10:30
스프링 빈의 자동, 수동 등록 방식
그동안 스프링 컨테이너에 스프링 빈을 등록하는 방식 중, 스프링 빈을 자동적으로 등록하는 방식, 수동적으로 등록하는 방식에 대해 학습하였다.
- 수동 등록의 경우, 직접 new()를 통해 구현 객체를 생성하고, 의존 관계를 직접 주입하여 @Bean 을 이용해 스프링 컨테이너에 각 스프링 빈을 등록하는 java 코드 방식 또는 xml 방식이 있었고,
- 자동 등록의 경우, @ComponentScan을 통해 @Component 가 붙은 객체들을 스프링 빈으로 자동 등록하고, @Autowired를 통해 의존 관계를 자동적으로 주입하는 컴포넌트 스캔 방식이 있었다.
실무적으로는 어떻게 올바르게 운영하는 것이 좋은가?
편리한 자동 기능을 기본으로 사용하자
Spring이 등장한 이후로 점점 자동을 선호하는 추세이다.
- @Component 뿐 아니라, @Controller, @Service, @Repository 처럼 계층에 맞추어 애플리케이션 로직을 자동으로 스캔할 수 있도록 지원하고 있다.
- 더하여 Spring Boot는 Component Scan을 기본으로 사용하고, 스프링 빈들도 조건이 맞으면 자동으로 등록하도록 설계되었다.
설정 정보를 기반으로 애플리케이션을 구성하는 부분, 그리고 실제 동작하는 부분을 명확하게 나누는 것이 이상적이지만,
개발자 입장에서 스프링 빈을 하나 등록할 때 @Component 만 넣어주면 끝나는 일(자동 빈 등록)을,
@Configuration 설정 정보에서 @Bean 을 적고, 객체를 생성하고, 주입할 대상을 일일히 적어주는 과정(수동 빈 등록)은 상당히 번거로운 작업이다.
그리고 관리할 빈이 많아져 설정 정보가 커지면, 설정 정보를 관리하는 것 자체가 부담스러운 일이 된다.
결정적으로, 자동 빈 등록을 사용해도 OCP, DIP를 지킬 수 있다.
(@Primary, @Qualifier 등을 이용해 스프링 빈의 우선 순위를 부여하는 방법을 사용하면 된다.)
그러면 수동 빈 등록은 언제 사용할까?
수동 빈 등록의 경우, 기술 지원 빈에 대해, 그리고 비즈니스 로직 중 다형성을 적극 활용하는 빈에 대해, 수동적으로 등록하는 것이 좋다.
1. 기술 지원 빈에 사용하자.
애플리케이션의 로직은 업무 로직과 기술 지원 로직으로 나눌 수 있다.
- 업무 로직 빈 : 웹을 지원하는 Controller, 핵심 비즈니스 로직이 있는 Service, 데이터 계층의 로직을 처리하는 Repository 가 업무 로직 빈이다. 비즈니스 요구사항들을 개발할 때 추후 추가되거나 변경된다.
- 양이 매우 많다. 한번 개발할 때, 컨트롤러-서비스-리포지토리 처럼 어느 정도 유사한 패턴이 있다.
- 자동 기능을 적극 사용하는 것이 좋다. 문제가 발생해도, 어떤 곳에서 문제가 발생했는지 명확하게 파악하기 쉬운 영역이다.
- 기술 지원 빈 : 기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용된다. 데이터베이스 연결, 공통 로그 처리와 같은 업무 로직을 지원하기 위한 하부 기술이나 공통적인 기술들이다.
- 업무 로직 빈에 비해 그 수가 매우 적다. 애플리케이션 전반에 걸쳐 광범위하게 영향을 미친다.
- 그러나 문제가 발생 했을 때 문제의 위치를 파악하기 어렵고, 애플리케이션에 적용이 잘 되고 있는지 아닌지 파악하기 어려운 경우가 많다. 따라서 가급적 수동 빈 등록을 사용하여 문제들이 명확하게 드러날 수 있도록 하는 것이 좋다.
즉, 애플리케이션에 광범위하게 영향을 미치는 기술 지원 객체는, 수동 빈으로 등록하여 설정 정보에 명확히 나타나게 하는 것이 유지 보수하기에 좋다.
2. 비즈니스 로직 중 다형성을 적극 활용하는 빈에 활용하자.
수동 빈 등록과 자동 빈 등록의 경우 모두 최대한 인터페이스의 구현 빈들을 따로 모아 특정 패키지에 모아두어, 빈의 이름을 쉽게 파악할 수 있도록 하자.
지난번에 List, Map을 통해 같은 자동적으로 DiscountPolicy 타입 내 모든 빈들을 주입 받아, 클라이언트의 요청에 따라 동적으로 구현 객체를 선택하도록 만든 DiscountService 에 대하여, @Configuration을 통해 별도의 설정 정보 클래스인 DiscountPolicyConfig를 만들어 수동으로 빈을 등록하는 방식으로 변경하면 다음과 같다.
@Configuration
public class DiscountPolicyConfig{
@Bean
public DiscountPolicy ratedDiscountPolicy(){
return new RatedDiscountPolicy();
}
@Bean
public DiscountPolicy fixedDiscountPolicy(){
return new FixedDiscountPolicy();
}
}
위와 같이 DiscountPolicy의 구현 빈들만 따로 모아 특정 패키지에 모아두면, DiscountService가 의존 관계 자동 주입으로 Map<String, DiscountPolicy>에 주입을 받는 상황에서, 어떤 빈들이 조회되어 주입되는지, 각 빈들의 이름이 무엇인지 쉽게 파악할 수 있게 된다.
참고로, Spring과 Spring Boot가 자동으로 등록하는 수많은 빈들은 예외이다. 예를 들어 Spring Boot의 경우, DataSource와 같은 DB 연결에 사용하는 기술 지원 로직까지 내부에서 자동으로 등록하는데, 이런 부분은 매뉴얼을 잘 참고하여 Spring Boot가 의도한 대로 편리하게 사용하면 된다고 한다.
다만, Spring boot가 아니라 직접 기술 지원 객체를 스프링 빈으로 등록하는 경우에는 수동으로 등록하는 것이 명확성을 보장하는 방식이다.
정리
- 편리한 자동 기능을 기본으로 사용하자
- 직접 등록하는 기술 지원 객체는 수동 등록을 사용하자
- 다형성을 적극 활용하는 비즈니스 로직은, 수동 등록을 고민해보자