자바/이론 공부

[JAVA/ Spring] Bean과 관련하여

2가 2023. 2. 23. 17:38

*스프링은 객체를 생성하고 초기화하는 기능을 제공함. 스프링이 생성하는 객체를 빈(Bean)객체라고 함.

 - 스프링컨테이너가 관리하는 객체 => 빈 객체

 

 

*@Bean 애노테이션을 메서드 위에 붙이면 해당 메서드가 생성한 객체를 스프링이 관리하는 빈 객체로 등록한다.

//Greeter 클래스
public class Greeter{

    private String format;
    
    public String greet(String guest) {
        return String.format(format, guest);
    }
    
    public void setFormat(String format) {
        this.format=fotmat;
    }
}
//AppContext 클래스
@Configuration // 스프링 설정 클래스로 지정
public class AppContext{
    
    @Bean
    public Greeter greeter(){
        Greeter g = new Greeter(); // 객체 생성
        g.setFormat("%s, 안녕하세요"); // 초기화
        return g;
    }
}

 

 - greeter 라는 이 메서드의 이름이 빈 객체를 구분할 때 사용된다. 빈 객체의 이름이 되는것이다.

 - @Bean 애노테이션이 붙은 메서드는 객체를 생성하고 초기화해야한다.

 

 

*스프링이 제공하는 클래스를 이용해서 AppContext 클래스를 읽어와 사용하기

AnnotationConfigApplicationContext ctx= 
	new AnnotationConfigApplicationContext(AppContext.class); // @Bean 찾아가서 객체 생성, 초기화
Greeter g=ctx.getBean("greeter", Greeter.class); // 생성된 빈 객체 검색.
ctx.close();

 - AnnotationConfigApplicationContext 클래스는 자바 설정에서 정보를 읽어아 빈 객체를 생성하고 관리한다. ( 생성자로 전달된 클래스안에 @Bean 설정된 메소드를 가져와 객체 생성하고 초기화함.)

 - getBean 메소드는 생성한 빈 객체를 검색하는 메소드이다. getBean(빈 객체의 이름, 검색할 빈 객체의 타입); 타입이라는건 리턴타입을 말한다.

 

 

* 스프링의 핵심 기능은 객체를 생성하고 초기화하는 것인데 이와 관련된 기능이 ApplicationContext라는 인터페이스에 정의되어있다.

 

 

*위에서 쓰였던 AnnotationConfigApplicationContext 클래스는 ApplicationContext 인터페이스의 구현클래스이다.

 

 

* ApplicationContext 인터페이스의 상위 인터페이스인 BeanFactory 인터페이스는 객체 생성과 검색에 대한 기능을 정의한다. getBean() 메서드도 여기 정의되어있다. 싱글톤 빈인지 프로토타입 빈인지 확인하는 기능도 가지고 있다.

 

 

*ApplicationContext 구현클래스

1. AnnotationConfigApplicationContext : 자바 애노테이션을 이용하여 클래스로부터 객체 설정 정보를 가져온다.

2. GenericXmlApplicationContext : XML로부터 객체 설정 정보를 가져온다.

3. GenericGroovyApplicationContext : 그루비 코드를 이용해 설정 정보를 가져온다.

 

 - 각 구현클래스는 설정 정보로부터 빈 객체를 생성하고 그 객체를 내부에 보관한다. 그리고 getBean() 메소드 실행시 해당 빈 객체를 제공한다.

 

 

* 컨테이너, 스프링 컨테이너

 - 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하는 ApplicationContext 또는 BeanFactory를 말한다.

 - 스프링 컨테이너는 빈 객체와 빈 이름을 연결하는 정보를 갖는다.

 

 

*싱글톤 객체

Greeter g1 = ctx.getBean("greeter", Greeter.class);
Greeter g2 = ctx.getBean("greeter", Greeter.class);
System.out.println((g1==g2)); //true

 - g1과 g2는 같은 객체이다.

 - 별도 설정을 하지않을 경우 스프링은 한 개의 빈 객체만을 생성한다. (빈 객체는 '싱글톤 범위를 갖는다')

 - 스프링은 기본적으로 한 개의 @Bean 애노테이션에 대해 한 개의 빈 객체를 생성한다.

 

 

 

 

참고

 - 초보 웹 개발자를 위한 스프링5 프로그래밍 입문