먼저 Bean을 이해하기 위해 스프링 컨테이너(=IoC 컨테이너)에 대해 알 필요가 있다.
자바 어플리케이션은 어플리케이션 동작을 제공하는 객체들로 이루어져 있다. 이때, 객체들은 독립적으로 동작하는 것보다 서로 상호작용하여 동작하는 경우가 많다.
이렇게 상호작용하는 객체를
객체의 의존성
이라고 표현한다.
스프링에서는 스프링 컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입(DI)하는 역할을 해주며, 스프링 컨테이너에 등록한 객체들을 빈(Bean)
이라고 한다.
스프링 부트에서 사용자 클래스를 스프링 빈으로 등록하는 가장 쉬운 방법은 클래스 선언부 위에@Component
어노테이션을 사용하는 것이다.
@Controller, @Service, @Repository는 모두 @Component
를 포함하고 있으며, 해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록됩니다.
수동으로 스프링 빈을 등록하려면 자바 설정 클래스를 만들어 사용해야 한다. XML로 스프링 빈을 등록하는 방법도 있지만, 최근에는 거의 사용하지 않는다고 함
설정 클래스를 만들고 @Configuration
어노테이션을 클래스 선언부 위에 추가하면 된다.
그리고 특정 타입을 리턴하는 메소드를 만들고, @Bean
어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성된다.
MemberRepository는 인터페이스이고, MemoryMemberRepository가 구현체이기 때문에 MemoryMemberRepository를 new 해준다.
@Bean
어노테이션의 주요 내용@Configuration
설정된 클래스의 메소드에서 사용가능@Scope
를 통해 객체 생성을 조정할 수 있음@Component
어노테이션을 통해 @Configuration
없이도 빈 객체를 생성할 수도 있음@Configuration
에 등록된 @Bean만 수정해주면 되므로, 수정이 용이스프링 부트의 경우 @Component, @Service, @Controller, @Repository, @Bean, @Configuration 등으로 빈들을 등록하고 필요한 곳에서 @Autowired
를 통해 의존성 주입을 받아 사용하는 것이 일반적