Spring boot Bean

About Bean

Posted by Damin on March 28, 2020

환경

  • Spring Boot 2.2.5

Spring & Bean

Bean을 설명하기에 앞서 Spring에 대해 알아보자.

Spring은 경량 컨테이너로서 자바 객체를 직접 관리한다.

객체의 생성, 소멸과 같은 Life Cycle을 관리하며 Spring Container에서 필요한 객체를 얻을 수 있다.

처음에 무슨 말인지 몰랐다. 그냥 “아.. 그렇구나~” 하고 넘어갔다.

요즘 Spring framework를 계속 사용하면서 Spring framework가 무엇인지 조금씩 알아가는 느낌이 든다.

잡소리는 그만하고, 이게 무슨 말인지 잘 모르겠는 사람들을 위해 예를 들어 보자.

  • 일반적인 JAVA
1
2
3
4
5
6
public class Calculator{

  public int sum(int x,int y){
    return x+y;
  }
}

1
2
3
4
5
6
7
8
9
public class Shop(){
  private int apple = 500;
  private int banana = 600;
  
  public int total(){
    Calculator calculator = new Calculator();
    return calculator.sum(apple,banana);
  }
}

보통의 경우 다른 클래스에서 Calculator를 사용하기 위해서는 해당 클래스에서 직접 new 생성자를 통해 만들어 줘야 한다.

Calculator라는 객체는 new 를 통하여 만들어지지 않는다면, 없는 것과 마찬가지다.

  • Spring-boot
1
2
3
4
5
6
7
@Component
public class Calculator{

  public int sum(int x,int y){
    return x+y;
  }
}

1
2
3
4
5
6
7
8
9
10
11
public class Shop(){
  private int apple = 500;
  private int banana = 600;
  
  @Autowired
  Calculator calculator
  
  public int total(){
    return calculator.sum(apple,banana);
  }
}

딱 봐도 다르다.

의아할 수 있다. “어떻게 calculator를 생성하지도 않고 calculator 객체를 사용하지?”

Spring Container에서 Annotation(@Component)를 확인하고 자동으로 Bean 객체를 생성해서 Spring Bean으로 등록 된다.

Shop Class 내부에 있는 calculator는 Spring Container에 등록된 Calculator 객체를 가져와 주입을 한 것이다.

이렇기에, 위의 코드가 가능한 것이다.

Bean과 Java 일반 객체와 차이점은 없다. Spring Container에 의해 만들어진 객체를 그냥 Spring Bean이라고 부를 뿐이다.

Bean Annotaion 종류

Spring-boot의 경우 @Component, @Service, @Controller, @Repository, @Bean, @Configuration 등등으로 필요한 Bean을 등록한다.

Bean으로 등록하고, 다른 Class에서 @Autowired 어노테이션을 통해 주입하는 것이 일반적이다.

Spring 2.x 버전 이상부터는 생성자 parameter가 Bean객체로 등록되어 있으면 @Autowired를 사용하지 않고도 의존성 주입을 해준다고 한다.