'컴포넌트 스캔'은 왜 태어났는가

이동건·2021년 4월 8일
0

Spring

목록 보기
3/5

Config 파일의 탄생

스프링 개요에서 설명했던 EJB에 불편함을 느끼고, 로드 존슨(Rod Johnson)이 2002년 출간한 책, Expert One-on-One J2EE Design and Developement에 나온 3만줄의 예제 코드를 사용하던 시절로 돌아가보자.

그 시절 개발자들은 3만 줄의 코드를 참고하며 config 파일을 직접 만들어 사용했다.

직접 구현체를 선택하던 부분을 과감히 버리고 config파일을 통해 구현체를 지정하도록 변경해 준다.

그리고 서비스 부분에서는 구현체를 생성하는 것이 아닌, config 파일을 생성해 의존성을 주입해 주는 방식을 택했다.

이렇게 DI(Dependency Injection)이 구현되었으며 config 파일이 객체의 생성과 생명주기를 관리하게 되었고 이를 통해 IoC(Inversion of Control)가 이루어지게 되었다.

Config의 정형화, @Configuration과 @Bean

이어 스프링이 나타나면서 config 파일을 만들던 방식을 더 정형화하였다. config 파일에는 @Configuration 애노테이션이 붙게 되었고 그 안의 메소드에는 @Bean이 붙게 되었다.

스프링을 사용하면 스프링 컨테이너가 생기고 스프링 빈으로 등록되며 코드는 좀 더 간결해지고 싱글톤 패턴이 유지되면서 코드의 생산성도 높아지게 되었다.

하지만 개발자들은 이에 만족하지 못하였다.

config 파일의 불편한 점들을 발견하였는데, 예를 들면 config파일로 빈을 일일이 등록하려면 힘들고, 설정 정보도 커지며 누락의 문제도 발생하는 것 등이었다.

이에 개발자들은 자동으로 빈을 등록해주고, 찾아서 쓸 수 있게 하는 기능을 개발하게 되었다.

그것이 컴포넌트 스캔이다.

컴포넌트 스캔의 탄생 @ConponentScan

설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 개발했다.

컴포넌트 스캔은 빈을 모아서 자동으로 끌어올려야 한다.

그래서 필요한 것이 @ComponentScan이다.

컴포넌트 스캔을 쓰려면 @ComponentScan을 config 파일에 붙여주면 된다.

기존의 config 파일과 다르게 @Bean으로 등록한 클래스가 하나도 없다.

대신 @Component라는 애노테이션이 붙은 Class를 다 찾아서 자동으로 스프링 컨테이너에 등록해 준다.

이렇게 개발된 @ComponentScan과 함께 나오게 되는 기능이 @Autowired이다.

@Autowired란 무엇인가?

ComponentScan을 할 때 문제가 하나 있다.

컴포넌트를 스프링 빈에 등록을 해 버린다면 그 안의 의존관계 주입은 어떻게 하는가?

config 파일의 @Configuration이 없는 코드는 사실상 그냥 자바 코드이기 때문에 config 파일에서 해 주던 의존관계 주입을 못 하게 되었다.

이를 해결하기 위해서 @Autowired를 사용하게 되었다.

생성자에 @Autowired를 붙여주면 자동 의존관계 주입이 되도록 한 것이다.

@Configuration을 썼을 때 그 안의 의존관계 주입을 해주어야하기 때문에 @Component를 쓰면 @Autowired를 쓸 수 밖에 없다.

@Autowired를 사용하면 맞는 구현체를 찾아서 자동으로 넣어주는 것이다.

끝으로...

이전에 config를 사용할 땐 @Bean으로 직접 설정 정보를 작성했고, 의존관계도 직접 명시했다. 이제는 이런 설정 정보 자체가 없기 때문에 의존관계 주입도 이 클래스 안에서 해결하게 되었다.

profile
코드를 통한 세계의 창조

0개의 댓글