본문 바로가기
✨ Back-end/Spring-Boot

[Spring] Bean과 Bean Factory , @Configuration과 @Bean

by 환풍 2023. 8. 19.
728x90

 

Bean이란?

스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트임과 동시에
스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트

스프링을 사용하는 애플리케이션에서 만들어지는 모든 오브젝트가 다 빈은 아니다.

그 중에서 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만 빈이라고 부른다.

 

Bean Factory

빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트

보통 빈 팩토리(Bean Factory)를 바로 사용하지 않고, 이를 확장한 애플리케이션 컨텍스트(ApplicationContext)를 사용.

BeanFactory라고 붙여쓰면 빈 팩토리가 구현하고 있는 가장 기본적인 인터페이스 이름이 된다.

이 인터페이스에 getBean()과 같은 메소드가 정의되어 있다.

 

DaoFactory

DaoFactory라는 클래스를 하나 만들어 @Configuration 을 해준다.

 

@Configuration이란?

스프링 빈(Bean) 설정과 관련된 클래스를 정의할 때 사용한다.

스프링 빈은 스프링 컨테이너에 의해 관리되는 객체로, 이 어노테이션이 지정된 클래스 내에서 스프링 빈들을 정의하고 구성할 수 있다. 이렇게 설정 클래스를 통해 빈들의 생성, 초기화 및 의존성 주입을 관리할 수 있다.

 

위 코드에서 'userDao()''myDao()'라는 두 개의 메서드가 @Bean 어노테이션을 사용해 스프링 빈으로 등록되었다.

스프링은 @Configuration 어노테이션이 지정된 클래스를 스캔해 해당 클래스 내에서 정의된 빈들을 인식하고 스프링 컨테이너에 등록한다. 이렇게 하면 스프링 애플리케이션의 구성을 더욱 모듈화하고 관리하기 쉬워지며, 의존성 주입과 같은 스프링의 핵심 기능을 효율적으로 활용할 수 있다.

MyDao와 UserDao

MyDao와 UserDao 클래스를 생성해 생성자와 메소드들을 하나씩 만들어 주었다.

 

ApplicationContext를 구현한 클래스는 DaoFactory처럼 @Configuration이 붙은 자바 코드를 설정정보로 사용하기 위해 AnnotationConfigApplicationContext를 쓰면 된다. 이제 getBean을 통해 DaoFactory에 있는 Bean들을 쓸 수 있다.

 

getBean() 메소드는 ApplicationContext가 관리하는 오브젝트를 요청하는 메소드이다.

getBean()의 파라미터인 'userDao'는 ApplicationContext에 등록된 빈의 이름이다.

DaoFactory에서 @Bean을 userDao라는 이름의 메소드에 붙여, 이 메소드 이름이 bean 이름이 되는 것이다.

userDao 이름의 빈을 가져온다는 것은 DaoFactory의 userDao() 메소드를 호출해 그 결과를 가져오는 것이다.

 

위 코드를 실행 시킨 결과 이렇게 나왔다. 

 

UserDao와 MyDao가 실행된 것은 ApplicationContext를 구성하고 생성할 때, 해당 컨테이너는 지정된 DaoFactroy.class에 정의된 빈들을 초기화하고 생성자를 호출해 해당 빈들을 생성한다.

AnnotationConfigApplicationContext는 스프링의 어노테이션 기반 구성 클래스를 사용해 애플리케이션 컨텍스트를 설정하는데 사용된다. 따라서 Daofactory.class에 있는 @Bean이 붙은 메소드들은 스프링 컨테이너에 의해 빈으로 등록되며, 그에 따라 해당 빈 클래스들의 생성자도 호출된다.

 

두번째로 실행된 UserDao와 User Dao Hello는 단지 UserDao라는 객체를 만들고, 생성자 호출과 메소드를 호출한 예이다.

세번째로 실행된 UserDao 객체와 차이점을 보이기 위해 만들었다.

 

세번째로 만들어진 User Dao Hello는 ApplicationContext 객체인 context를 생성한 후, context.getBean("userDao", UserDao.class) 코드를 통해 userDao라는 이름의 빈을 가져왔다. 두 번째 인자인 UserDao.class는 가져올 빈의 타입을 지정해주는 것이다. 이렇게 하면 해당 타입의 빈 객체가 반환된다.

가져온 빈 객체인 dao에 대해 dao.getHello() 메서드를 호출했고, 이는 해당 UserDao 빈 객체의 getHello() 메소드를 실행한 것이다.

반응형

댓글