관리 메뉴

Partially Committed

[Spring] 빈 생λͺ…μ£ΌκΈ° 콜백, 빈 μŠ€μ½”ν”„ λ³Έλ¬Έ

πŸ’» Study !/Spring

[Spring] 빈 생λͺ…μ£ΌκΈ° 콜백, 빈 μŠ€μ½”ν”„

WonderJay 2023. 1. 18. 16:55
728x90
λ°˜μ‘ν˜•
SMALL

빈 생λͺ…μ£ΌκΈ° 콜백


  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‹€ν–‰ 이전에 λ°μ΄ν„°λ² μ΄μŠ€ 컀λ„₯μ…˜ ν’€μ΄λ‚˜ λ„€νŠΈμ›Œν¬ μ†ŒμΌ“κ³Ό 같이 μ‹œμž‘ 지점에 ν•„μš”ν•œ 연결을 미리 해두고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ’…λ£Œ μ‹œμ μ— μ•ˆμ „ν•˜κ²Œ μ’…λ£Œν•˜κΈ° μœ„ν•΄μ„œλŠ” 객체의 μ΄ˆκΈ°ν™” 및 μ’…λ£Œ μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€. μ΄λŠ” Spring μ—μ„œ μ–΄λ–»κ²Œ κ΅¬ν˜„ν•  수 μžˆμ„κΉŒ? 

  μŠ€ν”„λ§ λΉˆμ€ 객체λ₯Ό μƒμ„±ν•˜κ³  μ˜μ‘΄κ΄€κ³„λ₯Ό λͺ¨λ‘ λ‹€ μ£Όμž…ν•œ λ‹€μŒμ—μ„œμ•Ό 데이터λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. κ·Έλž˜μ„œ μ΄ˆκΈ°ν™” μž‘μ—…μ€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ λͺ¨λ‘ λλ‚œ λ‹€μŒμ— ν˜ΈμΆœν•΄μ•Ό 할텐데, 이 μ‹œμ μ„ μ–΄λ–»κ²Œ ν•˜λ©΄ μ •ν™•ν•˜κ²Œ μ•Œ 수 μžˆμ„κΉŒ? 이λ₯Ό μœ„ν•΄ μŠ€ν”„λ§μ€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ™„λ£Œλ˜λ©΄ μŠ€ν”„λ§ λΉˆμ—κ²Œ 콜백 λ©”μ„œλ“œλ₯Ό 톡해 μ΄ˆκΈ°ν™” μ‹œμ μ„ μ•Œλ €μ£ΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. 그리고 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜κΈ° 직전에 μ†Œλ©Έ μ½œλ°±μ„ μ£ΌκΈ° λ•Œλ¬Έμ— 이λ₯Ό μ΄μš©ν•˜μ—¬ μ•ˆμ „ν•˜κ²Œ μ’…λ£Œ μž‘μ—…μ„ 진행할 수 μžˆλ‹€.

 

  [ μŠ€ν”„λ§ 빈의 이벀트 라이프 사이클 ]

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성 β–Ά μŠ€ν”„λ§ 빈 생성 β–Ά μ˜μ‘΄κ΄€κ³„ μ£Όμž… β–Άμ΄ˆκΈ°ν™” 콜백 β–Ά μ‚¬μš© β–Ά μ†Œλ©Έμ „ 콜백 β–Ά μŠ€ν”„λ§ μ’…λ£Œ

* μ΄ˆκΈ°ν™” 콜백 : 빈이 μƒμ„±λ˜κ³  빈의 μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ™„λ£Œλœ 후에 호좜

μ†Œλ©Έμ „ 콜백 : λΉˆμ΄ μ†Œλ©Έλ˜κΈ° 직전에 호좜

 

 [μŠ€ν”„λ§μ˜ 생λͺ…μ£ΌκΈ° 콜백]

1. μΈν„°νŽ˜μ΄μŠ€ (InitializingBean, DisposableBean)

2. μ„€μ • 정보에 μ΄ˆκΈ°ν™” λ©”μ„œλ“œ, μ’…λ£Œ λ©”μ„œλ“œ 지정

3. @PostConstruct, @PreDestroy μ• λ…Έν…Œμ΄μ…˜ 지원

 

(μ°Έκ³ )

  κ°μ²΄μ˜ 생성과 μ΄ˆκΈ°ν™”λŠ” λΆ„λ¦¬ν•˜λŠ” 것이 일반적으둜 μ’‹λ‹€. μƒμ„±μžλŠ” νŒŒλΌλ―Έν„°λ₯Ό λ°›κ³  λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•΄μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ±…μž„μ„ 가지고, μ΄ˆκΈ°ν™”λŠ” μƒμ„±λœ 값을 ν™œμš©ν•˜μ—¬ μ™ΈλΆ€ 컀λ„₯μ…˜μ„ μ—°κ²°ν•˜λŠ” λ“±μ˜ 무거운 λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€. κ·ΈλŸ¬λ―€λ‘œ μ΄λŸ¬ν•œ 역할을 λΆ„λΌνžˆλŠ” 것이 μœ μ§€λ³΄μˆ˜ κ΄€μ μ—μ„œ 일반적으둜 μ’‹λ‹€.

  

  싱글톀 λΉˆμ€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ  λ•Œ 같이 μ’…λ£Œλ˜κΈ° λ•Œλ¬Έμ— μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜κΈ° 직전에 μ†Œλ©Έ μ „ 콜백이 μΌμ–΄λ‚œλ‹€. 싱글톀과 같이 μ»¨ν…Œμ΄λ„ˆμ˜ μ‹œμž‘κ³Ό μ’…λ£ŒκΉŒμ§€ μƒμ‘΄ν•˜λŠ” λΉˆλ„ μžˆμ§€λ§Œ 라이프 사이클이 짧은 λΉˆλ„ μžˆλ‹€. μ΄λŸ¬ν•œ λΉˆλ“€μ€ μ»¨ν…Œμ΄λ„ˆμ™€ λ¬΄κ΄€ν•˜κ²Œ μ†Œλ©Έμ „ 콜백이 λ°œμƒν•œλ‹€.

 

# μΈν„°νŽ˜μ΄μŠ€ (InitializingBean, DisposableBean)

  μ•„λž˜ μ½”λ“œμ™€ 같이 InitializingBean, DisposableBean μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•¨μ— λ”°λΌμ„œ 빈 생λͺ…μ£ΌκΈ° μ½œλ°±μ„ 받을 수 μžˆλ‹€.

package hello.core.lifercycle;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class NetworkClient implements InitializingBean, DisposableBean {
    private String url; // 접속해야할 μ„œλ²„ URL

    public NetworkClient() {
        System.out.println("μƒμ„±μž 호좜, url = " + url);
    }

    public void setUrl(String url) {
        this.url = url;
    }

    // μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•  λ•Œ ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œ
    public void connect() {
        System.out.println("connect:  " + url);
    }

    public void call(String message) {
        System.out.println("call: " + url + "  message = " + message);
    }

    //μ„œλΉ„μŠ€ μ’…λ£Œ μ‹œ 호좜
    public void disconnect() {
        System.out.println("close " + url);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ λλ‚˜λ©΄ ν˜ΈμΆœν•œλ‹€.
        System.out.println("NetworkClient.afterPropertiesSet");
        connect();
        call("μ΄ˆκΈ°ν™” μ—°κ²° 메세지");
    }

    @Override
    public void destroy() throws Exception {
        // μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜κΈ° 직전에 ν˜ΈμΆœν•œλ‹€.
        System.out.println("NetworkClient.destroy");
        disconnect();
    }
}

 

😒 μ΄ˆκΈ°ν™”, μ†Œλ©Έ μΈν„°νŽ˜μ΄μŠ€μ˜ 단점

- InitializingBean, DisposableBean μΈν„°νŽ˜μ΄μŠ€λŠ” μŠ€ν”„λ§ μ „μš© μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. 이λ₯Ό μ‚¬μš©ν•˜λ©΄ μŠ€ν”„λ§ μ „μš© μΈν„°νŽ˜μ΄μŠ€μ— μ½”λ“œκ°€ μ˜μ‘΄ν•˜κ²Œ λœλ‹€.

- μ΄ˆκΈ°ν™”, μ†Œλ©Έ λ©”μ„œλ“œμ˜ 이름을 λ³€κ²½ν•  수 μ—†λ‹€.

- μ½”λ“œλ₯Ό κ³ μΉ  수 μ—†λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ— μ μš©ν•  수 μ—†λ‹€.

β–Ά ν•΄λ‹Ή 방법은 μŠ€ν”„λ§ μ΄ˆμ°½κΈ°μ— 주둜 μ‚¬μš©ν•˜λ˜ 방법이고, ν˜„μž¬λŠ” λ‹€λ₯Έ 방법이 훨씬 μ’‹λ‹€.

 

# 빈 등둝 μ΄ˆκΈ°ν™”, μ†Œλ©Έ λ©”μ„œλ“œ 지정

μ„€μ • 정보에 @Bean(initMethod="init", destroyMethod="close") 와 같이 μ΄ˆκΈ°ν™”, μ†Œλ©Έ λ©”μ„œλ“œλ₯Ό 지정할 수 μžˆλ‹€.

@Configuration
static class LifeCycleConfig {
    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl("http://hello-spring.dev");
        return networkClient;
    }
}

  μœ„μ™€ 같이 함에 따라 λ©”μ„œλ“œ 이름을 자유둭게 μ„€μ •ν•  수 μžˆμœΌλ―€λ‘œ μŠ€ν”„λ§ 빈이 μŠ€ν”„λ§ μ½”λ“œμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ²Œ λœλ‹€. λ˜ν•œ μ½”λ“œκ°€ μ•„λ‹Œ μ„€μ • 정보λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ μ½”λ“œλ₯Ό κ³ μΉ  수 μ—†λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—λ„ μ΄ˆκΈ°ν™”, μ’…λ£Œ λ©”μ„œλ“œλ₯Ό μ μš©ν•  수 μžˆλ‹€.

 

  @Bean 의 destroyMethod 의 default λŠ” (inferred) 이닀. λŒ€λΆ€λΆ„μ˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ’…λ£Œ λ©”μ„œλ“œλŠ” close, shutdown μ΄λΌλŠ” μ’…λ£Œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ”λ° destroyMethod κ°€ (infferred) 이라면 close, shutdown λΌλŠ” 이름을 가진 λ©”μ†Œλ“œλ₯Ό μžλ™μœΌλ‘œ ν˜ΈμΆœν•΄μ€€λ‹€. destroyMethod="" 라고 ν•΄μ£Όλ©΄ μΆ”λ‘ ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

# μ• λ…Έν…Œμ΄μ…˜ @PostConstruct, @PreDestroy

@PostConstruct
public void init() throws Exception {
    // μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ λλ‚˜λ©΄ ν˜ΈμΆœν•œλ‹€.
    System.out.println("NetworkClient.init");
    connect();
    call("μ΄ˆκΈ°ν™” μ—°κ²° 메세지");
}

@PreDestroy
public void close() throws Exception {
    // μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜κΈ° 직전에 ν˜ΈμΆœν•œλ‹€.
    System.out.println("NetworkClient.close");
    disconnect();
}

- μœ„μ™€ 같이 μŠ€ν”„λ§μ—μ„œλŠ” @PostConstruct, @PreDestroy μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” 방법을 ꢌμž₯ν•œλ‹€.

- μŠ€ν”„λ§μ— 쒅속적인 기술이 μ•„λ‹ˆλΌ JSR-250 μ΄λΌλŠ” μžλ°” ν‘œμ€€μœΌλ‘œ μŠ€ν”„λ§μ΄ μ•„λ‹Œ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ—μ„œλ„ λ™μž‘ν•œλ‹€.(javax)

- ν•˜μ§€λ§Œ μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—λŠ” μ μš©ν•  수 μ—†λ‹€. μ™ΈλΆ€ 라이브러리λ₯Ό μ΄ˆκΈ°ν™”, μ’…λ£Œν•΄μ•Ό ν•˜λŠ” 경우 @Bean(initMethod="init", destroyMethod="close") μ„ ν™œμš©ν•˜μž.

 

  # 빈 μŠ€μ½”ν”„

  기본적으둜 μŠ€ν”„λ§ λΉˆμ€ 싱글톀 μŠ€μ½”ν”„λ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ΄ μ‹œμž‘λ˜λ©΄μ„œ μƒμ„±λ˜κ³ , μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λœλ‹€.  μŠ€ν”„λ§μ—μ„œλŠ” λ‹€μ–‘ν•œ 빈 μŠ€μ½”ν”„λ₯Ό μ§€μ›ν•˜λ©° μ•„λž˜μ™€ κ°™λ‹€.

 

1. 싱글톀 : κΈ°λ³Έ μŠ€μ½”ν”„λ‘œ, μŠ€ν”„λ§μ˜ μ»¨ν…Œμ΄λ„ˆμ˜ μ‹œμž‘~μ’…λ£ŒκΉŒμ§€ μœ μ§€λ˜λŠ” κ°€μž₯ 넓은 λ²”μœ„μ˜ μŠ€μ½”ν”„

2. ν”„λ‘œν† νƒ€μž… : ν”„λ‘œν† νƒ€μž… 빈의 생성과 μ˜μ‘΄κ΄€κ³„ μ£Όμž…κΉŒμ§€λ§Œ κ΄€μ—¬ν•˜κ³  λ”λŠ” κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” 맀우 짧은 λ²”μœ„μ˜ μŠ€μ½”ν”„

3. μ›Ή κ΄€λ ¨ μŠ€μ½”ν”„

    - request: μ›Ή μš”μ²­μ΄ λ“€μ–΄μ˜€κ³  λ‚˜κ°ˆλ•Œ κΉŒμ§€ μœ μ§€λ¨.

    - session: μ›Ή μ„Έμ…˜μ΄ μƒμ„±λ˜κ³  μ’…λ£Œλ  λ•Œ κΉŒμ§€ μœ μ§€λ¨.

    - application: μ›Ήμ˜ μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€νŠΈμ™€ 같은 λ²”μœ„λ‘œ μœ μ§€λ¨.

 

# ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„

  싱글톀 μŠ€μ½”ν”„μ™€ λΉ„κ΅ν•΄λ³΄μž. 싱글톀 μŠ€μ½”ν”„λŠ” λΉˆμ„ μ‘°νšŒν•  μ‹œμ— μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ 항상 같은 μΈμŠ€ν„΄μŠ€μ˜ μŠ€ν”„λ§ λΉˆμ„ λ°˜ν™˜ν•œλ‹€. ν•˜μ§€λ§Œ ν”„λ‘œν†  νƒ€μž… μŠ€μ½”ν”„λ₯Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ‘°νšŒν•˜λ©΄, 항상 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ„œ λ³€ν™˜ν•œλ‹€. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ ν”„λ‘œν† νƒ€μž… λΉˆμ„ 생성할 λ•Œ, ν•„μš”ν•œ μ˜μ‘΄κ΄€κ³„ λ˜ν•œ μ£Όμž…ν•΄μ£Όμ–΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜ν•œλ‹€. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” ν”„λ‘œν† νƒ€μž… λΉˆμ„ μƒμ„±ν•˜κ³ , μ˜μ‘΄κ΄€κ³„λ₯Ό μ£Όμž…ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜λŠ” 것 κΉŒμ§€λ§Œ μ²˜λ¦¬ν•˜λ©° 이후 κ΄€λ¦¬λŠ”ν΄λΌμ΄μ–ΈνŠΈκ°€ 직접 ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. κ·Έλž˜μ„œ ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„ 핀은 @PreDestroy 와 같은 μ’…λ£Œ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€.

 

  ν”„λ‘œν† νƒ€μž… 빈의 νŠΉμ§•μ„ μ •λ¦¬ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

- μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μš”μ²­ν•  λ•Œ λ§ˆλ‹€ μƒˆλ‘œ μƒμ„±λœλ‹€.

- μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” ν”„λ‘œν† νƒ€μž… 빈 생성과 μ˜μ‘΄κ΄€κ³„ μ£Όμž…, μ΄ˆκΈ°ν™”κΉŒμ§€λ§Œ κ΄€μ—¬ν•œλ‹€.

- μ’…λ£Œ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€.

- κ·Έλ ‡κΈ° λ•Œλ¬Έμ— ν”„λ‘œν† νƒ€μž… λΉˆμ€ ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ‘°νšŒν•œ ν΄λΌμ΄μ–ΈνŠΈκ°€ 직접 관리해야 ν•œλ‹€. μ’…λ£Œ λ©”μ„œλ“œμ— λŒ€ν•œ ν˜ΈμΆœλ„ ν•„μš”ν•˜λ‹€λ©΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ 직접 ν•΄μ€˜μ•Ό ν•œλ‹€λŠ” 것이닀.

 

# ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„μ™€ 싱글톀 λΉˆμ„ ν•¨κ»˜ μ‚¬μš©ν•  μ‹œ λ°œμƒν•˜λŠ” 문제점

-  μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„ λΉˆμ„ μš”μ²­ν•˜λ©΄ μš”μ²­ μ‹œ λ§ˆλ‹€ μƒˆλ‘œμš΄ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ„œ λ°˜ν™˜ν•œλ‹€. λ‹€λ§Œ 싱글톀 빈과 ν”„λ‘œν† νƒ€μž… λΉˆμ„ 같이 μ‚¬μš©ν•œ 경우 μ˜λ„ν•œ λŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•Šμ„ 수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ•Όν•œλ‹€.

-  μŠ€ν”„λ§μ€ 일반적으둜 싱글톀 λΉˆμ„ μ‚¬μš©ν•œλ‹€. κ·Έλž˜μ„œ 싱글톀 빈이 ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ‚¬μš©ν•˜λŠ”λ°, 싱글톀 λΉˆμ€ 생성 μ‹œμ μ—λ§Œ μ˜μ‘΄κ΄€κ³„λ₯Ό μ£Όμž…λ°›κΈ° λ•Œλ¬Έμ— ν”„λ‘œν†  νƒ€μž… 빈이 μƒˆλ‘œ μƒμ„±λ˜λ©΄ 싱글톀 빈과 ν•¨κ»˜ μœ μ§€λ˜λŠ” 것이 문제λ₯Ό μœ λ°œν•œλ‹€. ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ‚¬μš©ν•˜λŠ” λͺ©μ μ€ μ‚¬μš©ν•  λ•Œ λ§ˆλ‹€ μƒˆλ‘œ μƒμ„±λ˜μ–΄μ„œ μ‚¬μš©ν•˜λŠ” 것일 텐데, μ΄λ ‡κ²Œ ν•˜λ©΄ μ£Όμž… μ‹œμ μ—λ§Œ μƒˆλ‘œ μƒμ„±ν•˜κ²Œ λ˜λŠ”λ° μ΄λŠ” μ˜λ„μ— λ°˜ν•œλ‹€. 

-  이와 같이 싱글톀 빈과 ν”„λ‘œν† νƒ€μž… λΉˆμ„ ν•¨κ»˜ μ‚¬μš© μ‹œ, 싱글톀 빈이 ν”„λ‘œν† νƒ€μž…μ„ μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μƒˆλ‘œ μš”μ²­ν•˜λŠ” 것이 κ°€μž₯ κ°„λ‹¨ν•˜λ‹€. 이와 같이 ν•„μš”ν•œ μ˜μ‘΄κ΄€κ³„λ₯Ό 직접 μ°ΎλŠ” 것을 Dependency Lookup(DL) 이라고 ν•œλ‹€. 이 λ°©λ²•μœΌλ‘œ ν•΄κ²°ν•˜λŠ” 경우, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— 쒅속적인 μ½”λ“œκ°€ λ§Œλ“€μ–΄μ§ˆ 수 밖에 μ—†κ³  λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ μ–΄λ ΅λ‹€. λ”± DL κΈ°λŠ₯만 있으면 μ’‹κ² λŠ”λ°...?

- 그게 λ°”λ‘œ ObjectProvider 이닀. (κ³Όκ±°μ—λŠ” ObjectFactory μ˜€λŠ”λ°, 여기에 μ—¬λŸ¬ κΈ°λŠ₯듀이 μΆ”κ°€λ˜μ–΄ ObjectProvider κ°€ λ§Œλ“€μ–΄μ‘Œλ‹€.)

@Scope("singleton")
static class ClientBean {

    @Autowired
    private ObjectProvider<PrototypeBean> prototypeBeanProvider;

    public int logic() {
        PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
        prototypeBean.addCount();
        int count = prototypeBean.getCount();
        return count;
    }
}

prototypeBeanProvider.getObject() μ„ ν†΅ν•΄μ„œ 항상 μƒˆλ‘œμš΄ ν”„λ‘œν† νƒ€μž… 빈이 μƒμ„±λœλ‹€.

ObjectProvider 의 getObject() μ„ ν˜ΈμΆœν•˜λ©΄ λ‚΄λΆ€μ—μ„œ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό 톡해 λΉˆμ„ μ°Ύμ•„μ„œ λ°˜ν™˜ν•œλ‹€.(DL)

- ObjectFactory : κΈ°λŠ₯이 λ‹¨μˆœ, 별도 라이브러리 ν•„μš” μ—†κ³  μŠ€ν”„λ§μ— 의쑴

- ObjectProvider : ObjectFactory 상속, μ˜΅μ…˜, 슀트림 μ²˜λ¦¬μ™€ 같은 μ—¬λŸ¬ κΈ°λŠ₯이 있고 λ³„λ„μ˜ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ ν•„μš”μ—†μœΌλ©° μ—­μ‹œ μŠ€ν”„λ§μ— 의쑴.

 

JSR-330 Provider

- javax.inject.Provider μ΄λΌλŠ” μžλ°” ν‘œμ€€μ„ μ‚¬μš©ν•˜λŠ” 방법이 μžˆλ‹€.  (spring 3.0 은 jakarta.inject.Provider)

- 이λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ javax.inject:javax.inject:1 라이브러리λ₯Ό gradle 에 μΆ”κ°€ν•΄μ•Ό 함!

@Scope("singleton")
static class ClientBean {

    @Autowired
    private Provider<PrototypeBean> prototypeBeanProvider;

    public int logic() {
        PrototypeBean prototypeBean = prototypeBeanProvider.get();
        prototypeBean.addCount();
        int count = prototypeBean.getCount();
        return count;
    }
}

 

- μ΄λŠ” μžλ°” ν‘œμ€€μ΄κ³  κΈ°λŠ₯이 λ‹¨μˆœν•˜λ―€λ‘œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“œκ±°λ‚˜ mock μ½”λ“œλ₯Ό λ§Œλ“€κΈ° μˆ˜μ›”ν•˜λ‹€.

- μžλ°” ν‘œμ€€μ΄κΈ° 떄문에 μŠ€ν”„λ§μ΄ μ•„λ‹Œ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ—μ„œλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것이 νŠΉμ§•!

 

[정리]

1. ν”„λ‘œν† νƒ€μž… λΉˆμ€ μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ™„λ£Œλœ μƒˆλ‘œμš΄ 객체가 ν•„μš”ν•œ κ²½μš°μ— μ‚¬μš©ν•œλ‹€. μ‹€λ¬΄μ—μ„œλŠ” 싱글톀 빈으둜 λŒ€λΆ€λΆ„μ˜ 문제λ₯Ό ν•΄κ²°ν•  수 있기 λ•Œλ¬Έμ— ν”„λ‘œν† νƒ€μž… λΉˆμ„ μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 일은 λ“œλ¬Όλ‹€κ³  ν•œλ‹€.

2. ObjectProvider, JSR330 Provider 등은 ν”„λ‘œν† νƒ€μž… 뿐만이 μ•„λ‹ˆλΌ DL 이 ν•„μš”ν•œ κ²½μš°μ— 이λ₯Ό μ΄μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμœΌλ‹ˆ κΈ°μ–΅ν•΄λ‘μž.

3. μ½”λ“œλ₯Ό μŠ€ν”„λ§μ΄ μ•„λ‹Œ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ—μ„œλ„ μ‚¬μš©ν•  κ°€λŠ₯성이 μžˆλ‹€λ©΄ JSR-330 Provider 을 μ‚¬μš©ν•΄μ•Όλ§Œ ν•œλ‹€. 그런 κ²½μš°κ°€ 없을 것 κ°™λ‹€λ©΄ μŠ€ν”„λ§μ΄ μ œκ³΅ν•΄μ£ΌλŠ” ObjectProvider 을 μ‚¬μš©ν•˜λŠ” 것이 νŽΈν•˜λ‹€.

 

# μ›Ή μŠ€μ½”ν”„

- μ›Ή ν™˜κ²½μ—μ„œλ§Œ λ™μž‘ν•¨.

- ν”„λ‘œν† νƒ€μž…κ³ΌλŠ” 달리 μŠ€μ½”ν”„μ˜ μ’…λ£Œμ‹œμ κΉŒμ§€ 관리함.(μ’…λ£Œ λ©”μ„œλ“œκ°€ 호좜됨)

 

request : HTTP μš”μ²­μ΄ λ“€μ–΄μ˜€κ³  λ‚˜κ°ˆ λ•Œ κΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„λ‘œ, 각각의 http μš”μ²­λ§ˆλ‹€ λ³„λ„μ˜ 빈 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κ³  관리됨.

session : HTTP Session κ³Ό λ™μΌν•œ 생λͺ… μ£ΌκΈ°λ₯Ό 가짐

application : μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€νŠΈ(ServletContext) 와 λ™μΌν•œ 생λͺ…μ£ΌκΈ°λ₯Ό 가짐

websocket : μ›Ή μ†ŒμΌ“κ³Ό λ™μΌν•œ 생λͺ…μ£ΌκΈ°λ₯Ό 가짐

 

 

 

 


Reference

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

μŠ€ν”„λ§ 핡심 원리 - 기본편 - μΈν”„λŸ° | κ°•μ˜

μŠ€ν”„λ§ μž…λ¬Έμžκ°€ 예제λ₯Ό λ§Œλ“€μ–΄κ°€λ©΄μ„œ μŠ€ν”„λ§μ˜ 핡심 원리λ₯Ό μ΄ν•΄ν•˜κ³ , μŠ€ν”„λ§ κΈ°λ³ΈκΈ°λ₯Ό ν™•μ‹€νžˆ λ‹€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€., - κ°•μ˜ μ†Œκ°œ | μΈν”„λŸ°...

www.inflearn.com

 

728x90
λ°˜μ‘ν˜•
LIST
Comments