자바 개발자를 위한 온라인 리소스 및 교육 플랫폼 중 "Baeldung" 내에서 제공하는 Spring 관련 Tutorial에 대해 학습해보는 시간을 갖겠습니다.
해당 내용은 전적으로 Baeldung에 기재된 내용을 바탕으로 서술되어 있으며, 관련 내용 중 필자가 부족한 개념은 추가로 포스팅할 예정입니다.
Bean은 Spring 프레임워크의 핵심 개념입니다. 하지만, 해당 개념에 대해 물어본다면 명확하게 떠오르는 답은 없습니다. 이를 조금 더 명확하게 이해하고자 공식 문서 및 관련 내용들에 대해서 알아보겠습니다.
📜 참고 포스팅
Spring 프레임워크 공식문서에서 Bean을 다음과 같이 정의합니다.
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans.
Bean은 Spring IoC 컨테이너에 의해 인스턴스화, 어셈블링, 관리되는 객체를 의미합니다.
명확하게 의미를 파악하기 위해서는 IoC라는 것에 대해서 우선 학습해야 합니다.
IoC는 간단하게 말해서 개발자가 종속성을 생성하지 않고 정의하는 과정을 말합니다. 종속성의 구성 및 관리는 IoC 컨테이너에게 위임하게 됩니다.
다음과 같은 클래스가 있다고 가정하겠습니다.
public class Company {
private Address address;
public Company(Address address) {
this.address = address;
}
// getter, setter and other properties
}
위 클래스에는 회사 주소(Address) 타입의 협력자를 필요로 합니다.
public class Address {
private String street;
private int number;
public Address(String street, int number) {
this.street = street;
this.number = number;
}
// getters and setters
}
일반적으로 클래스의 생성자식을 사용하여 클래스 내 직접 객체를 만듭니다.
Address address = new Address("High Street", 1000);
Company company = new Company(address);
위처럼 간단한 구조의 클래스에서는 문제가 없어 보이지만, 실제 서비스되는 애플리케이션 내부를 확인해보면, 수십 또는 수백개 타입의 클래스 협력자가 존재한다라고 생각해보면, 매우 복잡한 구조를 갖게 됩니다. 이처럼 많은 객체를 관리하게 될 경우 유지 보수가 어려워지게 됩니다.
이로 인해서, IoC 컨테이너에 의한 종속성 관리가 필요하게 되고, 개발자는 컨테이너에게 전달할 configuration 메타 데이터를 제공해주기만 하면 됩니다.
우선, Company 클래스 상단에 @Component 어노테이션을 추가해줍니다.
@Component
public class Company {
// this body is the same as before
}
다음으로 IoC 컨테이너에 등록할 Bean 관련 설정 메타데이터를 제공하는 Configuration 클래스입니다.
@Configuration
@ComponentScan(basePackageClasses = Company.class)
public class Config {
@Bean
public Address getAddress() {
return new Address("High Street", 1000);
}
}
위 클래스에서는 Address 타입의 Bean을 생성합니다.
추가로, Company 클래스가 포함된 패키지 내에서 Bean을 찾아 자동으로 등록해주기 위한 @ComponentScan 주석을 추가해줍니다.
위와 같은 형식으로 생성된 모든 객체는 IoC 컨테이너에 의해 관리되며, 이를 Spring Bean이라고 합니다.
Configuration 클래스에서 Bean을 정의했고, 이를 IoC 컨테이너에 빌드하기 위해서 AnnotationConfigApplicationContext 클래스의 인스턴스가 필요합니다.
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
빠른 테스트를 통해 Bean의 존재 여부와 속성 값을 확인합니다.
Company company = context.getBean("company", Company.class);
assertEquals("High Street", company.getAddress().getStreet());
assertEquals(1000, company.getAddress().getNumber());
단위 테스트 결과 정상 마무리되었습니다. 이를 통해 IoC 컨테이너에서 Bean을 올바르게 생성하고 초기화 하는 것을 증명했습니다.
해당 포스팅에서는 Spring Bean과 함께 IoC와 컨테이너에 대해서 간략하지만 핵심적인 내용들에 대해서 알아봤습니다.