Bean 개념 정리

Ki Tae Park·2021년 8월 28일

관련해 좋은 글들이 많지만 이 글은 개인의 뻘(쭘한) 글이라 생각해주시고 읽거나, 지나가시거나 편하게 생각해주시면 좋겠다.

헷갈렸던 것은 Java Bean 과 Spring Bean 간의 차이였다. 아마도 Java Bean 에서 Spring Bean 이 유래되지 않았을까? 자, 자세히 알아보자.

Java Beans

(Java Beans) ← s가 붙는 게 정식 명칭이었다

개념

자바로 작성된 소프트웨어 컴포넌트이다.

빌더 형식의 개발도구에서 가시적으로 조작이 가능하고 또한 재사용이 가능한 소프트웨어 컴포넌트이다. - 썬 마이크로시스템즈

관례

자바빈즈 클래스로 작동하기 위해 따라야 하는 관례가 있는데 다음과 같다.

  • 클래스는 직렬화되어야 한다.(클래스의 상태를 지속적으로 저장 혹은 복원 시키기 위해)
  • 클래스는 기본 생성자를 가지고 있어야 한다.
  • 클래스의 속성들은 get,set  혹은 표준 명명법을 따르는 메서드들을 사용해 접근할 수 있어야 한다.
  • 클래스는 필요한 이벤트 처리 메서드들을 포함하고 있어야 한다.

Spring Bean

Spring Bean 정의

Spring 애플리케이션의 백본을 형성하고 Spring IoC 컨테이너에 의해 관리되는 객체를 빈이라고 한다. 빈은 Spring IoC 컨테이너에 의해 인스턴스화 되고 조립, 관리되는 객체다.

여기서 IoC(Inversion of Control) 은 객체가 종속성을 만들지 않고 정의하는 프로세스를 의미한다.

(너무 추상적인 말들이 많아 이해가 조금 어렵지만 예제를 통해 이해해보자)

3.1 Domain Classes

public class Company {
    private Address address;

    public Company(Address address) {
        this.address = address;
    }

    // getter, setter and other properties
}
public class Address {
    private String street;
    private int number;

    public Address(String street, int number) {
        this.street = street;
        this.number = number;
    }

    // getters and setters
}

3.2 전통적인 접근방식

Address address = new Address("High Street", 1000);
Company company = new Company(address);

일반적으로 우린 생성자를 통해 객체를 생성한다. 이 방식에 문제는 전혀 없지만 종속성을 좀 더 나은 방법으로 관리할 수 있다면 좋지 않을까?

수십, 수백 개의 클래스가 있는 애플리케이션이 있다고 상상해보자~! 해당 어플리케이션에서 딱 하나의 클래스 인스턴스만 사용할 때가 있기도 하고 때로는 각 사용처에 따른 개별 객체가 필요할 때도 있다.

수많은 객체를 직접 관리한다는 건 쉣이고 이때 필요한 개념이 IoC다. 종속성들을 직접 구성하는 대신 IoC 컨테이너에서 특정 객체를 찾을 수 있다.

우리가 하면 되는 건 컨테이너에게 적절한 configuration metadata를 제공하면 된다.

3.3 Bean 설정

먼저 Company 클래스를 @Component 어노테이션으로 장식해보자

@Component
public class Company {
    // this body is the same as before
}

아래는 IoC 컨테이너에 텅빈 metadata를 제공하는 configuration 클래스다.

@Configuration
@ComponentScan(basePackageClasses = Company.class)
public class Config {
    @Bean
    public Address getAddress() {
        return new Address("High Street", 1000);
    }
}

configuration 클래스는 Address 타입의 빈을 제공하고 @ComponentScan 어노테이션 또한 지정하는데 이는 컨테이너에게 Company 클래스가 포함된 패키지에서 빈을 찾도록 지시하는 것이다.

Spring IoC 컨테이너가 이러한 유형의 객체들을 구성하고나면 IoC 컨테이너를 통해 관리되는 모든 객체를 Spring Bean 이라고 부른다.

IoC in Action

configuration 클래스에 bean들을 정의했으므로 하나의 컨테이너를 만들어줄 AnnotationConfigApplicationContext 클래스 인스턴스가 필요하다

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

테스트를 통해 실제로 Spring bean의 값과 존재 여부를 파악해보자

Company company = context.getBean("company", Company.class);
assertEquals("High Street", company.getAddress().getStreet());
assertEquals(1000, company.getAddress().getNumber());

결과를 통해 IoC 컨테이너가 생성되고 bean들이 문제없이 초기화되었다는 것을 알 수 있다

출처

https://ko.wikipedia.org/wiki/자바빈즈

https://www.baeldung.com/spring-bean

profile
#Coder Became Developer

0개의 댓글