본문으로 바로가기

[Spring] Spring Bean 등록과 의존관계 설정

category Java/Spring 2022. 6. 20. 15:34

Spring Bean 이란, 

: 단순히 스프링 컨테이너에서 관리하는 자바 객체를 스프링 빈이라고 칭한다. 

과거 자바에서는 개발자가 직접 new()를 사용해서 객체를 사용했지만 Spring에서는 스프링 컨테이너에 의해 객체가 생성되고 관리되어 제어의 역전(Inversion Of Control)이 일어나게 된다. 

 

 

자바로 만든 순수 객체를 스프링 컨테이너에 빈으로 등록해야 우리가 흔히 아는 controller, service, repository 등의 기능을 구현할 수 있다. 

 

 

Spring Bean 을 등록하는 방법

 

1. Component Scan

Java 에는 @Override, @Deprecated 와 같이 Annotation 기능이 있다. 

Spring 에서는 @ComponentScan 라는 Annotation 기능을 사용해서 간단하게 스프링 빈으로 등록할 수 있다. 

 

 

@ComponentScan 을 지정한 config 파일을 설정하게 되면 @Component 어노테이션이 붙은 모든 클래스를 스프링에서 자동으로 빈을 등록해준다. 

 

예시 )

 

ComponentScan을 설정한 Config파일 예시 >>

*excludeFilters = ComponentScan 시에 제외할 클래스

*basePackage = ComponentScan을 수행할 패키지 대상 (default 값이 config클래스가 속한 패키지임으로 최상단 패키지에 config파일을 생성하는게 좋다)

 

 

Controller

 

Service

MemberController 라는 컨트롤러를 생성했다. 

클래스 위에 @Controller 라는 어노테이션을 작성하면 위 클래스를 컨트롤러 빈으로 등록할 수 있다. 

 

@Controller, @Service, @Repository... 등의 어노테이션을 살펴보면 모두 상위위에 @Component 어노테이션이 붙은 것을 확인 할 수 있다. 

@Controller

 

 

MemberService의 생성자를 보면 MemberRepository를 주입받아야 하는데 ComponentScan을 사용하면

개발자가 일일이 수동으로 Bean을 등록하는 것이 아니기 때문에 @Autowired 라는 어노테이션을 통해 필요한 클래스가 자동 주입 되도록 설정해주어야 한다. 

 

 

SpringBootApplication인 경우, 이미 @SpringBootApplication 에 ComponentScan 어노테이션이 포함되어 있으므로 

componentscan을 직접 작성할 필요는 없다. 


@Autowired 에도 생성자 주입이 있고 필드 주입(비추천), setter 주입이 있다. 

생성자 주입

 

필드 주입
setter 주입

 

 

자동주입 테스트 코드 >>

테스트 코드 작성을 통해 ComponentScan을 통해 @Component를 명시한 클래스가 자동 주입되는지 확인할 수 있다. 

당연히 테스트 코드는 Pass 가 뜨고 실행 도중 로그를 살펴보면 

 

 

정상적으로 등록이 되는 것을 볼 수 있다. 


2. 코드로 직접 등록하기

HelloSpringApplication 패키지 위치에 SpringConfig Class 파일을 생성한다.

Config 파일에서 Bean 등록이나 다른 환경설정을 할 수 있다. 

 

예시 >>

SpringConfig로 Bean 등록 방법

 

@Configuration 어노테이션을 작성하고

빈으로 등록하려는 객체에 @Bean 어노테이션을 작성하면 된다. 

 

코드로 작성할 경우에는 Config 파일에서 개발자가 직접 필요한 클래스를 주입시키기 때문에 (memberRepository 등)

@Autowired 라는 어노테이션을 굳이 사용할 필요가 없다.

 

 

Component Scan 에 비해 Java 로 직접 작성할 때의 장점은, 

 

나중에 코드가 변경되어야 할 일이 있을 때, 일일이 service, repository 가 사용된 코드를 찾지 않아도 

Bean 에서 return 되는 객체만 바꾸면 코드의 변경 없이 사용 가능하다. 

 

 


그 외 XML을 통해 bean 을 등록하는 방법