끄적이는 메모장

[Spring] Bean이란 본문

웹기술 개발자 되기/Spring

[Spring] Bean이란

밥보92 2020. 4. 6. 22:17
반응형

서버 개발자에서 웹 기술 개발자가 되기 위한 스텝. Spring 이해하기 (2) 

 

: Spring의 구조에서 Spring Core의 영역

 

Bean : 스프링 컨테이너에 의해 생성되는 자바의 "객체"

- 설정 메타데이터(XML)에 의해 생성이 됨

 

Bean의 속성 : 속성에 설정된 정보를 토대로 객체가 생성이 됨

- class : 자바의 클래스 명

- id : Bean의 식별자

- scope : 객체의 범위 (기본은 singleton)

- constructor-arg : 객체 생성시 생성자에 전달할 인수 (constructor injection)

- property : 생성시 bean setter에 전달할 인수 (setter injection)

- init-method : 객체 생성시 실행되는 함수

- destory-method : 객체 소멸시 호출되는 함수

예시 )

<bean id = "TEST" class = "com.kor.test">

  <constructor-arg>

    <value type = "long> 1000 </value>

  </constructor-arg>

</bean>

-> com.kor.test 클래스의 id는 TEST, singleton객체가 생성 시 생성자에 long type의 인수에 값 1000이 전달됨

 

Bean의 Scope : 기본적으로 Singleton객체가 됨 - 한 번 생성되어 모든 객체가 동일한 객체를 참조하는 방식

- 다른 Scope를 지정 할 수 있음

prototype 요청마다 새로운 객체를 생성
request http request 하나에 대한 생명 주기
session http session과 동일한 생명 주기

# 생각해보기 

Singleton 객체에서 prototype객체를 주입 받는다면?

- prototype의 주입은 한 번만 받게 될 것 (즉, 요청마다 새로운 객체를 생성하겠다는 의미가 제대로 작동되지 않음)

- scope에 대한 개념을 잘 이해해야함

 

Springboot에서의 Bean 

 

@Component annotation을 이용하여 스프링 빈 객체로 등록

 

@Component를 확장한

1. @Controller : MVC의 Controller 객체임을 명시

2. @Service : 로직이 수행되는 Servcie 객체임을 명시

3. @Reposotory :DAO 객체임을 명시

 

@Autowired annotation : Bean을 자동으로 주입시켜줌 

예시 )

@Component

public class BeanExample1 {

    

    @Autowired

    BeanExample2 beanExample2;

 

    ....

}

-> BeanExample1 클래스에서 BeanExample2 bean을 주입받아 사용할 수 있음 

 

@Component를 사용하는 것 외에도 @Bean & @Configuration을 이용하여 Bean을 설정 할 수도 있음

- @Bean은 @Configuration이 설정된 클래스의 메서드에서 사용이 가능

- 메서드의 반환객체가 스프링의 bean 객체임을 선언하는 구조

- @Scope를 통해 객체의 Scope를 조절 가능 (기본은 singleton)

예시 )

@Configuration

public class ConfigExample {

    

    @Bean

    public FirstBean firstBean() {

        retrun new FirstBean();

    }

 

    @Bean

    public SecondBean secondBean() {

        SecondBean second = new SecondBean();

        second.setGreetings("HI"); //setter injection

        return second;

    }

}

-> 객체를 바로 반환하는 Bean 설정도 가능하고 객체 생성시 setter injection이 가능하도록 만들 수 도 있음 

 

동일한 이름의 Bean이 생성되는 경우 @Primary와 @Qualifier를 이용하여 객체를 선택

- @Primary : 객체의 생성에 우선권을 부여 (@Bean과 @Component에서 함께 사용이 됨)

- @Qualifier : 객체를 주입 받을 때 주어진 Bean의 이름과 동일한 객체를 찾음 (@Autowired와 함께 사용이 됨)

예시) - SuperBean interface를 구현한 FirstBean과 SecondBean 

@Configuration

public class ConfigExample {

    

    @Bean(name="fisrt")

    @Primay

    public SuperBean firstBean() {

        FirstBean first = new FirstBean();

        return first;

    }

 

    @Bean(name="second")

    public SuperBean secondBean() {

        SecondBean second = new SecondBean();

        return second;

    }

}

--------------------

@Autowired

SuperBean superbean; // @Primary annotation에 의해 FirstBean이 만들어짐 

--------------------

@Autowired

@Qulifier("second")

SuperBean superbean; // @Qulifier annotaion에 의해 SecondBean이 만들어짐

-> @Primary와 @Qualifier의 우선순위는 @Qualifier가 더 높음

 

BeanFactory vs ApplicationContext 차이, 특징

- BeanFactory :

Bean을 등록, 생성, 반환에 대항 관리를 함. 정의는 즉시 로딩하지만 객체는 필요시 생성

- ApplicationContext :

기본적으로 BeanFactory의 기능을 수행

Bean을 미리 생성 후 즉시 제공(Singleton scope 객체만)

글로벌 Text Message를 관리가능

이미지 등의 파일 로드를 지원함

리스너로 등록된 bean에 이벤트 전달을 지원 

트랜잭션과 AOP의 상당한 지원

반응형

'웹기술 개발자 되기 > Spring' 카테고리의 다른 글

[Spring] AOP란  (0) 2020.04.10
[Spring] Spring Framework란  (0) 2020.04.06