Bean
은 프로그래밍에서 재사용이 가능한 구성요소를 의미한다. 흔히 Java
에는 클래스 객체가 있고, JavaScript
에는 Object
, Python
에는 dictionary
가 있다.
Java
역시 Bean
이 존재하며, Java Bean
은 다음과 같은 특징을 지닌다.
POJO
에 포함되는 개념이며, 임의의 서비스나 프로젝트를 수행하기 위해 특화된 Java
객체라고 할 수 있다. 다음의 규약을 지키는 Java
객체의 경우, Java Bean
이라 표현한다.
getter
, setter
가 정의되어 있어야 한다.Serializable
이 가능한 클래스여야 한다.
POJO
:Plain Old Java Object
의 요약어로, 특정 프레임워크나 규약에 종속되지 않은 순수한Java
객체를 의미한다. 코드의 의존성을 없애는 것과Java Bean
과의 명확한 차이를 두기 위해 사용되는 용어이다.
Serializable
:Java
에서 객체를 직렬화하거나, 역직렬화를 가능하게 하는 인터페이스이다. 객체의 상태를 바이트 스트림으로 변환하고, 이를 다시 객체로 되돌리는 것이 가능해진다.
흔히 Java
진영에서 논하는 Bean
은 Spring Bean
에 해당한다. Spring Bean
은 Spring IoC 컨테이너
에 의해 관리되는 Java
객체로서, Java Bean
의 특수한 형태라고 볼 수 있다. Spring Bean
은 Spring IoC 컨테이너
에 등록시키면 런타임 과정동안 관리되며, 이를 통해 의존성 주입 및 AOP
등 Spring
의 다양한 기능을 사용하는 것이 가능하다.
Spring IoC 컨테이너
:Spring Framework
는 다양한 유형의 컨테이너를 가지고 있으며, 그중 객체의 생성, 관리, 의존성 주입을 담당하는 컨테이너 인터페이스가 바로IoC 컨테이너
이다.IoC
컨테이너에의 구현체에는Bean
객체를 관리하는Bean Factory
가 존재한다.
XML
을 활용한 등록 방법 : 가장 전통적인 등록 방법으로, XML
파일에 각 Bean
의 구성을 명시한다. 어플리케이션 사이즈가 커지면 유지 관리가 어렵고, 런타임 시에 Bean
객체의 변경이 어렵다. 오타나 구문 오류가 일어날 가능성도 커서 현재에는 많이 사용하지 않는 방법이다.
*@*Bean
: ApplicationContext
실행 이전, 설정을 담당하는 @Configuration
클래스 내부의 객체 혹은 메서드에 대해 @Bean
을 사용하여, 해당 객체를 등록하는 것이 가능하다. 주로 서드 파티 라이브러리를 @Bean
객체로 등록할 때 자주 사용한다.
@Component
: Spring
프로젝트 내 자신이 생성한 클래스에 대하여 @Component
를 사용하는 것으로, ApplicationContext
실행 시, 자동으로 해당 객체를 Spring IoC 컨테이너
에 등록하여 Spring Bean
객체로 관리한다. @Bean
과 다르게 특정 클래스에 반드시 속하는 것이 아닌, Component Scan
이 이루어지는 모든 위치에서 사용이 가능하다.
getBean()
: ApplicationContext
의 getBean()
메서드를 활용하여, 필요한 Spring Bean
객체를 불러올 수 있다. 일반적으로 등록한 메서드나 클래스의 이름을 매개변수로 넣는 것으로 불러올 수 있다. 단 해당 이름을 가진 객체가 여러개인 경우에는 에러를 반환한다. (해당 문제의 경우에는 @Primary
나 @Qualifier
로 해결할 수 있다. )
@Primary
: 우선순위 적용
@Qualifier
: 별칭 적용
Spring IoC 컨테이너
에서 관리되는 객체는키-값
형태로 관리가 이루어진다.키
에 대한 특정 설정이 없다면, 기본적으로 객체의 이름을키
로 저장이 되기 때문에, 해당 객체 이름으로Spring Bean
객체를 불러오는 것이 가능한 것이다.
@Autowired
: 해당 어노테이션을 사용하는 경우, 해당 타입에 의존성이 적합한 Spring Bean
을 찾아 1개 할당해준다. @Autowired
는 크게 3가지 유형을 가진다.생성자 기반 의존성 주입
: 생성자를 통해 Spring Bean
객체를 주입하는 방식으로 주로 필수적인 의존성을 나타내기 위한 용도로 사용한다. 클래스 생성 시 딱 한 번 호출이 되며, final
로 설정할 수 있어 Spring Bean
객체에 대한 불변성을 유지할 수 있다. 더불어 클래스 생성 시 의존성 주입이 강제 되기 때문에 런타임 환경에서 발생할 수 있는 에러를 줄인다. 생성자 기반 의존성 주입
은, @Autowired
를 생략할 수 있다. Setter 기반 의존성 주입
: 주로 선택적인 의존성을 표현하며, 주로 초기화 이후에 의존성을 변경하는 용도로 사용된다.Field 기반 의존성 주입
: 필드에 직접 의존성을 주입한다. 가장 간단한 방법이지만, 테스트에서 사용할 수 없고, 컴파일 오류를 통해 Spring Bean
객체가 누락될 가능성이 있다.생성자 기반 의존성 주입은 `Lombok` 의 `@RequiredArgsConstructor` 을 활용하여, 생성자 주입 코드를 간단하게 작성할 수 있다.
참고
[10분 테코톡] 주디의 Spring Bean
[Spring ] 빈 객체의 초기화와 소멸
[Spring] @Autowired를 통한 의존 관계 주입
[스프링 핵심기술] - @Autowired
[Spring] 스프링 빈 웹 스코프, request 타입과 프록시 모드 - 2/2
스프링 Application Scope
웹 스코프
Springboot Laze Init (Lazy Loading) 사용방법