개발/Spring

(스프링 기본) 25 - 의존 관계 등록 올바른 실무 기준 (자동, 수동)

개발하는 인사담당자 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();
    }
}

 

그러나 다음과 같이 수동으로 등록돼서 하나의 파일에 들어가 있으면 

개발자가 다음 두 개가 빈 객체로 등록된 것을 한 번에 알 수 있다. 

 

이는 개발자 취향과 선택에 따른다.

만약 자동 등록으로 한다면 적어도 같은 패키지에 묶어 둬서 다른 개발자가 알 수 있도록 하는게 중요하다. 

 

※ 스프링과 스프링부트가 자동으로 등록하는 수 많은 빈들은 건드리지 말자

 

■ 정리

- 편리한 자동 기능 기본으로 사용

- 직접 등록하는 기술 지원 객체는 수동 등록

- 다형성 적극 활용하는 비즈니스 로직은 수동 등록도 고민해보자

 

출처 : 김영한 스프링 핵심 원리 - 기본편

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B

 

스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보

www.inflearn.com