본문 바로가기

Blog/Spring

스프링 프레임워크 입문 - Bean

 

  • Bean

스프링 IoC 컨테이너가 관리하는 객체

 

OwnerController ownerController = new OwnerController();

=> 이건 빈이 아니다. 일반적인 객체이다.

 

OwnerController bean = applicationContext.getBean(OwnerController.class);

=> 이건 빈이다.

 

왜? 아래는 어플리케이션 컨텍스트(Ioc 컨테이너의 일종)이 관리하는 객체를 꺼내온 거니까.

위에는 직접 만들어준거고

 

빈들만 의존성 주입이 되는 것, 자동적으로

 

어떻게 특정한 인스턴스를 가지고 빈으로 만들어주느냐?

1. Component Scanning

@Controller 는 사실상 컴포넌트라는 메타 애노테이션을 사용하는 애노테이션이다. 그래서 이것도 사실상 컴포넌트 애노테이션이라고 볼 수 있다. 

애노테이션 프로세서 중에 스프링 Ioc 컨테이너가 사용하는 (ioc 컨테이너를 만들고 그 안에 빈을 등록할 때 사용하는) 여러 가지 인터페이스들이 있는데 그런 인터페이스들을 라이프사이클 콜백이라고 부르는데, 그 라이프사이클 콜백 중에는 이런 컴포넌트라는 애노테이션을 찾아서 모든 클래스의 인스턴스를 만들어서 빈으로 등록하는 일을 하는 애노테이션 처리기가 등록되어 있다. (현재 우리는 예제로 스프링부트 프로젝트를 사용하고 있기 때문에 @SpringBootApplication 이 안에 컴포넌트 스캔이라는 애노테이션이 있는데, 이 컴포넌트 스캔 에노테이션은 어디부터 컴포넌트를 찾아보라고 알려주는 것) 

 

@Component

    • @Repository

    • @Service

    • Controller

    • Configuration

이 외에 더 있음

위의 애노테이션들을 찾아서 빈으로 등록해주는게  컴포넌트 스캔의 기능

그래서 우리가 직접 빈으로 등록하지 않아도 스프링이 알아서 찾아서 Ioc컨테이너가 만들어질 때, 빈으로 등록해준다.

 

@Repository는 조금 특이한 형태로 빈으로 등록이 된다. 얘는 스프링 데이터 JPA가 제공해주는 기능에 의해서 빈으로 등록된다. 이 경우에는 특정한 애노테이션이 없더라도 특정한 인터페이스를 상속받은 경우에 이 인터페이스를 상속받고 있는 클래스를 찾아서 그 클래스의 사실상 인터페이스인 것의 구현체를 안에서 내부적으로 만든다. 만들고 빈으로 등록해준다.

 

2. 직접 빈으로 등록하는 방법

빈 설정파일이 뭐냐에 따라 그것을 설정해줘야 함

xml, 자바 설정파일이냐에 따라 달라짐, 최근은 자바 설정파일이 추세임

 

= >Java 설정파일 예제

SampleConfig.java

@Configuration

public class SampleConfig{

    @Bean
    public class SmapleConfig{

        @Bean // 빈 직접 정의 
        public SampleController sampleController(){

            return new SampleController();

            // 이 메소드에서 리턴하는 객체 자체가 빈으로 등록이 된다. ioc 컨테이너 안에
            // 그러므로 @Controller 라는 애노테이션을 떼도 무방하다. 

        }
    }
}

 

꺼내서 쓰는 방법?

전에까지는 애플리케이션 컨텍스트에서 직접 꺼내서 쓰는 방법만을 봄

사실상 @AutoWired라는 애노테이션을 사용해서도 꺼내쓸 수 있다. 

생성자를 통해 직접 주입하는 방법이 아니라 오토 와이어드의 애노테이션을 사용하면 ioc 컨테이너 안에 있는 빈을 주입받아 사용할 수 있다.

생성자를 통해서 Repository를 직접 주입받은 객체를 사용하는 것인데, 오토 와이어드는 Repository를 선언만 해도 자동으로 빈을 주입받을 수 있다.

 

애플리케이션 컨텍스트로 직접 꺼내는 방법보다는 스프링 ioc 컨테이너가 제공하는 디펜던시 인젝션 방법(디펜던시를 주입하는 방법 = @AutoWired)가 더 많을 것이다.