빈 등록, 자동? 수동? 선택 기준은?
- Spring/Spring
- 2021. 11. 12.
빈 등록, 자동? 수동? 선택 기준은 무엇일까?
앞서 정리된 게시글들은 모두 스프링 빈을 자동, 수동으로 등록하는 것들에 대한 정리였다. 이번 정리글에서는 이런 수동, 자동등록들 중 어떤 것들을 주로 사용해야 될지에 대해 정리한다. 결론부터 말하면 자동을 위주로 사용하는 것이 좋다고 한다.
자동등록은 코드가 간결해지는 장점이 있으나, 의존관계 같은 것들이 명확하지 않다는 단점이 있다. 수동 등록은 의존관계를 명확하게 파악할 수 있으나, 등록해야 할 것들이 많아지면 매우 부담스럽게 작용한다.
최근 스프링에는 @Component 뿐만 아니라 @Controller, @Service @Repository 등의 어노테이션이 추가되면서 점점 자동등록에 힘을 싣고 있다. 개발이 복잡해질수록 등록해야 할 스프링 빈이 많을텐데, 자동으로 등록하는 것이 좋다. 무엇보다 중요한 것은 자동 등록을 했을 때, DIP와 OCP가 깨지지 않는다는 점이다.
간략히 먼저 정리부터 하면 아래와 같다.
- 자동등록을 우선으로 쓴다
- 광범위한 분야에 영향을 끼치는 로직들은 수동으로 등록해서 빈 의존관계를 명확히 드러낸다
- 정형적인 패턴을 가진 비즈니스 로직이라고 하더라도, 다형성을 활용한다면 수동 빈 등록 혹은 적어도 한 설정 정보에 몰아넣어서 의존관계가 명확히 드러나게 해주는 것이 좋다.
그럼에도 불구하고 수동은?
어플리케이션은 크게 업무 로직, 기술 지원 로직이 있다고 한다.
- 업무 로직 : 웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는 서비스 등을 업무 로직이라고 한다. 보통 비즈니스 요구사항을 개발할 때 추가, 변경된다.
- 기술 지원 로직 : 기술적인 문제나 공통 관심사(AOP) 등을 처리할 때 주로 사용된다. 데이터 베이스 연결이나 공통 로그등을 볼 때 사용한다.
업무 로직은 구현해야 할 것들의 수가 많고, 결정적으로 어느 정도의 정해진 패턴이 있다. 따라서, 문제가 발생했을 때 어떤 곳에서 문제가 발생했는지 명확하게 파악하기 편리하다고 한다. 반면 기술 지원 로직은 공통 관심사등을 처리하기 때문에 광범위한 곳에 작용한다. 즉, 문제가 발생했을 때 파악하기가 어렵다. 따라서 이런 기술 지원 로직은 수동 등록을 해서, 의존관계를 명확하게 해서 한번에 드러날 수 있도록 설정하는 것이 좋다고 한다.
비즈니스 로직, 다형성 적극 활용 시 수동 빈 등록
앞서 List, Map 예제에서 빈 객체를 하나 만들고 그곳에 다른 빈 객체들을 넣어서 동적으로 다형성을 적극 활용했던 것이 있다. 이런 경우에는 등록될 객체를 수동으로 빈 등록하거나, 하다 못해 한 설정 정보로 모아주는 것이 좋다. 왜냐하면 앞서 말했듯이, 어떤 객체들이 등록될지 한 눈에 드러나지 않기 때문이다.
@Configuration
public class DiscountPolicyConfig {
@Bean
public FixDiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
@Bean
public RateDiscountPolicy rateDiscountPolicy(){
return new RateDiscountPolicy();
}
}
위 코드처럼 DiscountPolicyConfig라는 클래스를 하나 만들어주고, 여기에 주입할 빈 객체들을 등록해준다. 그리고 실제로 List, Map에 주입할 때 DiscountPolicyConfig.class 빈 객체를 등록해주면 어떤 빈이 List에 등록될지 DiscountPolicyConfig를 보면 한 눈에 알 수 있다.
'Spring > Spring' 카테고리의 다른 글
빈 스코프, Provider (0) | 2021.11.12 |
---|---|
빈 생명주기 콜백 (0) | 2021.11.12 |
조회한 빈이 모두 필요할 때, List, Map (0) | 2021.11.12 |
어노테이션 만들기 with @Qualifier (0) | 2021.11.12 |
@Autowired에서 조회되는 빈이 2개 이상일 경우 (1) | 2021.11.12 |