Bean

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ‚¬μš©ν•˜λŠ” POJO λͺ¨λΈμ„ 기반으둜 ν•˜λ©° μ΄λŠ” IoC μ—­ν™œμ„ ν•΄μ£ΌλŠ” κΈ°λŠ₯을 ν•œλ‹€.

이 Bean 은 Bean Factory 와 λ°€μ ‘ν•œ 관련이 μžˆλ‹€.

Bean Factory λŠ” Bean 의 생λͺ…μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•˜λ©° λŒ€μ²΄λ‘œ Bean Factory 의 κΈ°λŠ₯을 ν™•μž₯ν•œ Application Context λ₯Ό μ‚¬μš©ν•œλ‹€.

Spring Bean 은 νŠΉλ³„ν•œ 경우λ₯Ό μ œμ™Έν•˜κ³ λŠ” Singleton 으둜 μƒμ„±λœλ‹€.

Bean Container (= IoC Container)

  • 객체λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ‘œμ¨ μ»¨ν…Œμ΄λ„ˆμ— 객체λ₯Ό 담아두고 ν•„μš”ν•  λ•Œμ— μ»¨ν…Œμ΄λ„ˆμ—μ„œ 객체λ₯Ό 가져와 μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•œλ‹€.
  • IoC λ°©μ‹μœΌλ‘œ Bean 을 κ΄€λ¦¬ν•œλ‹€λŠ” μ˜λ―Έμ—μ„œ Bean Factory λ‚˜ Application Context λ₯Ό κ°€λ₯΄ν‚¨λ‹€.

Bean Factory

  • μŠ€ν”„λ§μ΄ IoC λ₯Ό λ‹΄λ‹Ήν•˜λŠ” 핡심 μ»¨ν…Œμ΄λ„ˆ
  • Bean 을 등둝/생성/쑰회/λ°˜ν™˜/관리 ν•˜λŠ” κΈ°λŠ₯으둜 Bean Factory 와 κ°™μ§€λ§Œ 여기에 μŠ€ν”„λ§μ˜ 각쒅 λΆ€κ°€μ„œλΉ„μŠ€λ₯Ό μΆ”κ°€λ‘œ μ œκ³΅ν•΄μ•Ό ν•œλ‹€.

Application Context

λŒ€λΆ€λΆ„μ˜ κΈ°λŠ₯듀은 Bean Factory 와 λ™μΌν•œ μ—­ν™œκ³Ό κΈ°λŠ₯듀을 μˆ˜ν–‰ν•˜λ‚˜ λΆ€κ°€μ μœΌλ‘œ μ œκ³΅λ˜λŠ” κΈ°λŠ₯듀이 μžˆλ‹€. (Bean Factory μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•œλ‹€)

  • μΈμŠ€ν„΄μŠ€ν™” μ‹œμ μ΄ μƒμ΄ν•˜λ‹€.
    • Application Context λŠ” μ¦‰μ‹œ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” Pre-loading 을 ν•˜κ³ 
    • Bean Factory λŠ” lazy-loading 을 ν•˜μ—¬ μ‹€μ œλ‘œ μš”μ²­ λ°›λŠ” μ‹œμ μ— μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“ λ‹€.
  • Bean Factory λ₯Ό ν™•μž₯ν•œ IoC μ»¨ν…Œμ΄λ„ˆμ΄λ©° 일반적으둜 μ—”ν„°ν”„λΌμ΄μ¦ˆν•œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ Application Context λ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ λ‚«λ‹€κ³  ν•œλ‹€.
    • BeanPostProcessor ν™•μž₯ 포인트λ₯Ό μ‚¬μš©ν•  수 있고 νŠΈλžœμž­μ…˜κ³Ό AOP 와 같은 μƒλ‹Ήν•œ μ–‘μ˜ 지원을 받을 수 μžˆλ‹€κ³  ν•œλ‹€.
Feature BeanFactory ApplicationContext
Bean instantiation/wiring Yes Yes
Automatic BeanPostProcessor registration No Yes
Automatic BeanFactoryPostProcessor registration No Yes
Convenient MessageSource access (for i18n) No Yes
ApplicationEvent publication No Yes

참고자료

http://wonwoo.ml/index.php/post/1571

POJO (Plain Old Java Object)

Sun 의 Java Bean μ΄λ‚˜ EJB 의 Bean 을 λœ»ν•˜λŠ” 것이 μ•„λ‹Œ μˆœμˆ˜ν•˜κ²Œ getter, setter λ©”μ„œλ“œλ‘œλ§Œ 이루어진 Value Object μ„±μ˜ Bean 을 μ˜λ―Έν•œλ‹€.
예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό 같은 μ½”λ“œμ΄λ‹€.

public class SimpleBean {
    private String name;
    private String age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getAge() {
        return this.age;
    }
}

μŠ€ν”„λ§μ—μ„œ POJO κ°€ μ€‘μš”ν•œ νŠΉμ§•μΈ μ΄μœ λŠ” λ‹€μŒκ³Ό 같은 νŠΉμ„±μ„ 가지기 λ•Œλ¬Έμ΄λ‹€.

  • ν΄λž˜μŠ€μœ„ 상속을 κ°•μ œν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ„ κ°•μ œν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ‚¬μš©μ„ κ°•μ œν•˜μ§€ μ•ŠλŠ”λ‹€.

λ•Œλ¬Έμ— μ‚¬μš©μžλŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ μ»¨ν…Œμ΄λ„ˆμ˜ 별도 κΈ°μˆ μ— 쒅속적이지 μ•ŠλŠ” μƒνƒœλ‘œ κ°€μž₯ 일반적인 μ½”λ“œλ‘œ μž‘μ„±ν•  수 μžˆλ‹€λŠ” 것이닀.

Spring Bean Life Cycle

Spring Bean Life Cycle 은 μ΅œμ΄ˆμ— Bean Object κ°€ μƒμ„±λ˜κ³ 
DI μ˜μ‘΄μ„± μ£Όμž…ν›„ μ΄ˆκΈ°ν™” μž‘μ—…μ΄ λλ‚˜λ©΄ Bean μ„œλΉ„μŠ€κ°€ κ°€λŠ₯ν•œ μ€€λΉ„ μƒνƒœκ°€ μ™„λ£Œλœλ‹€.

이후 μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ λ•Œ ν˜ΈμΆœλ˜μ„œ μ‚¬μš©μ€‘μΈ 빈 λ¦¬μ†ŒμŠ€λ₯Ό λ°˜ν™˜ν•˜κ±°λ‚˜ μ’…λ£Œμ „μ— μ²˜λ¦¬λ˜μ•Ό ν•  μž‘μ—…λ“€λ„ 별도 지정이 κ°€λŠ₯ν•˜λ‹€.

μ΄ˆκΈ°ν™” λ©”μ„œλ“œ (initalization-method)

  1. Spring Framework λŠ” λ¨Όμ € Bean μ„€μ •νŒŒμΌμ˜ POJO λΉˆμ„ Instance ν™” ν•˜μ§€ μ•Šμ€ μƒνƒœλ‘œ Bean μ„€μ • 파일의 정보λ₯Ό μ΄ˆκΈ°ν™” ν•œλ‹€.
    1. 빈 μ„€μ • 파일의 정보λ₯Ό μ΄ˆκΈ°ν™” ν•˜λ©΄μ„œ XML DTD 에 λŒ€ν•˜μ—¬ μœ νš¨ν•œμ§€ μ²΄ν¬ν•œλ‹€.
  2. Bean Instance λ₯Ό μƒμ„±ν•˜λ©΄μ„œ 의쑴 관계에 μžˆλŠ” Bean 이 μ‘΄μž¬ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό μ²΄ν¬ν•œλ‹€.
    1. 의쑴 관계가 μ—†λŠ” Bean 인 경우 μ΄ˆκΈ°ν™”κ°€ μ‹€νŒ¨ ν•œλ‹€.
  3. 의쑴 관계가 μžˆλŠ” 빈의 체크가 μ™„λ£Œλ˜λ©΄ setter Method λ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ μƒμ„±μžμ˜ 인자둜 μ‹€μ§ˆμ μΈ 값을 μΆ”κ°€ν•˜κ±°λ‚˜ λ‹€λ₯Έ Bean 에 λŒ€ν•œ Reference 둜 μ „λ‹¬ν•œλ‹€.
  4. Application Context λ₯Ό μ΄μš©ν•˜μ—¬ μ΄ˆκΈ°ν™”λ₯Ό μ‹€ν–‰ν•œλ‹€.
    1. μƒμ„±ν•œ Bean 이 BeanNameAware Instance 이면 setBeanName() Method λ₯Ό ν˜ΈμΆœν•œλ‹€.
    2. μƒμ„±ν•œ Bean 이 BeanFactoryAware Instance 이면 setBeanFactory() Method λ₯Ό ν˜ΈμΆœν•œλ‹€.
    3. μƒμ„±ν•œ Bean 이 ApplicationContextAware Instance 이면 setApplicationContext() Method λ₯Ό ν˜ΈμΆœν•œλ‹€.
    4. μƒμ„±ν•œ Bean 이 InitalizingBean μΈμŠ€ν„΄μŠ€μ΄λ©΄ afterProperties() Method λ₯Ό ν˜ΈμΆœν•œλ‹€.
  5. μƒμ„±ν•œ Bean 의 μ„€μ •νŒŒμΌμ— init-method κ°€ μ„€μ •λ˜μ–΄ μžˆλ‹€λ©΄ init-method 에 ν•΄λ‹Ήν•˜λŠ” Method λ₯Ό ν˜ΈμΆœν•œλ‹€.

μ’…λ£Œ λ©”μ„œλ“œ (destruction-method) λ₯Ό ν˜ΈμΆœν•˜λŠ” κ³Όμ •

  1. μƒμ„±ν•œ Bean 이 DisposableBean Instance 이면 distory Method λ₯Ό ν˜ΈμΆœν•œλ‹€.
  2. μƒμ„±ν•œ Bean μ„€μ •νŒŒμΌμ— distory-method κ°€ μ„€μ •λ˜μ–΄ 있으면 destory Method 에 ν•΄λ‹Ήν•˜λŠ” λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.

Bean Life Cycle 을 μ»€μŠ€ν„°λ§ˆμ΄μ§• ν•˜μ—¬ μ œμ–΄ ν•  수 μžˆλ‹€.

Bean λ‘œλ“œ μˆœμ„œλ₯Ό κ²°μ •μ§“λŠ” 방법

Bean λ‚΄λΆ€μ μœΌλ‘œλ„ 생성 μˆœμ„œμ— 따라 μ—λŸ¬κ°€ λ‚˜μ˜¬μˆ˜ 있기 λ•Œλ¬Έμ— ν•΄λ‹Ή μƒν™©μ—μ„œλŠ” 빈 생성 μˆœμ„œλ₯Ό μ •ν•΄μ£ΌλŠ” 것이 λ‚«λ‹€

  • @DependsOn
    • μ˜μ‘΄μ„± 고리λ₯Ό μŠ€ν”„λ§μ—κ²Œ μ•Œλ €μ€€λ‹€.
  • @PostConstruct
    • ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈκ°€ μ™„μ „νžˆ μƒμ„±λœ ν›„ ν•œλ²ˆμ— μ‹€ν–‰ν•΄μ•Ό ν•  일을 μ½”λ”©ν•œ λ©”μ†Œλ“œμ— λΆ™μ΄λŠ” 것이닀.
  • @Order
    • μ£Όμž… μˆœμ„œλ₯Ό μ •ν•΄ 쀌

참고자료

https://jeong-pro.tistory.com/167

@Bean vs @Component 차이

  • @Bean
    • μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ˜ μ‚¬μš©μ„ Bean 으둜 λ“±λ‘ν•˜κ³  싢은 경우
  • @Component
    • μ‚¬μš©μžκ°€ 직접 컨트둀이 κ°€λŠ₯ν•œ Class 인 경우

μ‚¬μš©μžκ°€ μƒμ„±ν•œ ν΄λž˜μŠ€μ— @Bean 선언은 λΆˆκ°€λŠ₯ν•˜λ‹€ μ΄λŠ” 각자 μ„ μ–Έν•  수 μžˆλŠ” νƒ€μž…μ΄ μ •ν•΄μ Έ μžˆμ–΄ ν•΄λ‹Ή μš©λ„λ₯Ό λ²—μ–΄λ‚˜λ©΄ 컴파일 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

Bean Scope

eGov 및 Spring Reference (4.2.5) μ—μ„œ λ°œμ·Œν•œ Bean Scope 의 μ’…λ₯˜μ΄λ‹€.

Scope Description eGov Spring Reference
Global Session ν•˜λ‚˜μ˜ Bean μ •μ˜μ— λŒ€ν•΄μ„œ ν•˜λ‚˜μ˜ global HTTP Session의 생λͺ…μ£ΌκΈ° μ•ˆμ— 단 ν•˜λ‚˜μ˜ 객체만 μ‘΄μž¬ν•œλ‹€.
일반적으둜 portlet context μ•ˆμ—μ„œ μœ νš¨ν•˜λ‹€. Web-aware Spring ApplicationContext μ•ˆμ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.
O O
Prototype ν•˜λ‚˜μ˜ Bean μ •μ˜μ— λŒ€ν•΄μ„œ λ‹€μˆ˜μ˜ 객체가 μ‘΄μž¬ν•  수 μžˆλ‹€. O O
Request ν•˜λ‚˜μ˜ Bean μ •μ˜μ— λŒ€ν•΄μ„œ ν•˜λ‚˜μ˜ HTTP request의 생λͺ…μ£ΌκΈ° μ•ˆμ— 단 ν•˜λ‚˜μ˜ 객체만 μ‘΄μž¬ν•œλ‹€
즉, 각각의 HTTP requestλŠ” μžμ‹ λ§Œμ˜ 객체λ₯Ό 가진닀. Web-aware Spring ApplicationContext μ•ˆμ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.
O O
session ν•˜λ‚˜μ˜ Bean μ •μ˜μ— λŒ€ν•΄μ„œ ν•˜λ‚˜μ˜ HTTP Session의 생λͺ…μ£ΌκΈ° μ•ˆμ— 단 ν•˜λ‚˜μ˜ 객체만 μ‘΄μž¬ν•œλ‹€.
Web-aware Spring ApplicationContext μ•ˆμ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.
O O
singleton ν•˜λ‚˜μ˜ Bean μ •μ˜μ— λŒ€ν•΄μ„œ Spring IoC Container 내에 단 ν•˜λ‚˜μ˜ 객체만 μ‘΄μž¬ν•œλ‹€. O O
application μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€νŠΈμ˜ 라이프사이클에 μ •μ˜λœλ‹€.
Spring Application Context λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.
X O