클라우드 낚시꾼

[Spring] 컴포넌트 스캔과 스프링 빈 자동 주입 본문

BE Framework/SpringBasic

[Spring] 컴포넌트 스캔과 스프링 빈 자동 주입

KanuBang 2024. 3. 16. 15:13
728x90

1.  스프링 빈 수동 주입의 불편함

스프링 빈 수동 주입

 

위 코드처럼 스프링 빈을 수동으로 주입할 때는 @Configuration 설정 정보 클래스의 메서드에 @Bean을 붙여 스프링 Bean을 등록했다. 또한, Bean들 사이의 의존관계도 개발자가 일일이 설정해주었다. 만약 등록해야 될 @Bean이 10000개이면... 개발자가 일일이 10000개의 @Bean 어노테이션을 붙여야하며 복잡한 의존관계도 직접 설정해야 한다. 이러한 불편함을 해결하기 위해 스프링은 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다. 또한, 의존관계도 자동으로 주입하는 @Autowired 에노테이션도 제공한다.


2. 스프링 빈 자동 주입 과정 1 - @ComponentScan

 

@ComponentScan을 설정 정보 클래스에 붙이기

컴포넌트 스캔을 사용하려면 @ComponentScan 애노테이션 설정 정보에 붙여야 한다.


3. 스프링 빈 자동 주입 과정 2 - @Component

@Component

 

ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);

 

AutoAppConfig는 @ComponentScan 애노테이션이 붙은 설정 정보이다. 이 설정 정보를 이용해 스프링 컨테이너를 생성하면, @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다. 이때 스프링 빈의 이름은 클래스명을 사용하되, 맨 앞글자만 소문자로 사용한다. 빈 이름을 직접 지정하고 싶다면, @Component("blabla") 이런 식으로 이름을 부여하면 된다.


4. 스프링 빈 자동 주입 과정 3 - @Autowired 

@Autowired

 

MemberServiceImpl이 스프링 Bean으로 등록될 때, memberRepository를 주입 받아야 한다. 기존 코드를 보아하니, 생성자를  통해서 memberRepository를 주입 받는 구조이다. 이때, 생성자에 @Autowired를 붙이면, 스프링 컨테이너가 자동으로 의존 관계를 주입한다.

참고로, 스프링 컨테이너가 의존관계를 맺고 있는 Bean을 찾을 때는 타입으로 Bean을 찾는다. 위 코드에서는 MemberServiceImpl의 멤버 memberRepository는 getBean(MemberRepository.class)를 해서 찾은 Bean인memoryMemberRepository를 주입 받을 것이다. 즉, MemberRepository의 자식인 memoryMemberRepository가 주입된다.


5. 자동 빈 주입 VS 수동 빈 주입

자동 빈 주입과 수동 빈 주입 중 무엇을 선택해야 할까? 기본적으로 편리한 자동 빈 주입을 선택하는 것이 권장된다. 그렇다면, 수동 빈 주입은 언제 사용될까? 먼저, 애플리케이션은 크게 업무 로직과 기술 지원 로직으로 나뉜다.

  • 업무 로직 빈: 웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는 리포지토리 등이 모두 업무 로직이다. 보통 비즈니스 요구사항을 개발할 때 추가되거나 변경된다.
  • 기술 지원 빈: 기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용된다. 데이터베이스 연결이나, 공통 로그 처리 처럼 업무 로직을 지원하기 위한 하부 기술이나 공통 기술들이다.

업무 로직은 숫자도 매우 많고, 한번 개발해야 하면 컨트롤러, 서비스, 리포지토리 처럼 어느정도 유사한 패턴이 있다. 이런 경우 자동 기능을 적극 사용하는 것이 좋다. 보통 문제가 발생해도 어떤 곳에서 문제가 발생했는지 명확하게 파악하기 쉽다. 기술 지원 로직은 업무 로직과 비교해서 그 수가 매우 적고, 보통 애플리케이션 전반에 걸쳐서 광범위하게 영향을 미친다. 그리고 업무 로직은 문제가 발생했을 때 어디가 문제인지 명확하게 잘 드러나지만, 기술 지원 로직은 적용이 잘 되고 있는지 아닌지 조차 파악하기 어려운 경우가 많다. 그래서 이런 기술 지원 로직들은 가급적 수동 빈 등록을 사용해서 명확하게 드러내는 것이 좋다.


6. 세줄 요약 (+ 출처)

1. 스프링 Bean 수동 주입은 불편하다. (특히, Bean이 많아질수록 의존 관계는 인간이 감당할 수 없을 정도로 복잡하다.)

2. @ComponentScan이 붙은 설정 정보로 스프링 컨테이너를 생성할 때, @Component가 붙은 클래스들이 자동으로 스프링 빈으로 등록된다.

3. @Autowired는 자동으로 의존 관계에 해당하는 Bean을 주입해준다.

 

스프링 핵심 원리 - 기본편 강의 - 인프런

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

www.inflearn.com

 

728x90