Home > Backend > Spring > πŸƒ[Spring] 빈(Bean)μ΄λž€?

πŸƒ[Spring] 빈(Bean)μ΄λž€?
Spring Framework

πŸƒ[Spring] 빈(Bean)μ΄λž€?

1️⃣ 빈(Bean)μ΄λž€?

  • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ 빈(Bean) μ΄λž€, μŠ€ν”„λ§ IoC(Inversion of Control) μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” 객체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • μŠ€ν”„λ§ λΉˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ—μ„œ μ‚¬μš©λ  수 μžˆλ„λ‘ μŠ€ν”„λ§ μ»¨ν…μŠ€νŠΈμ— λ“±λ‘λœ μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€.
  • λΉˆμ€ 보톡 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 λ‘œμ§μ΄λ‚˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜λŠ” κ°μ²΄λ“€λ‘œ, μŠ€ν”„λ§μ€ μ΄λŸ¬ν•œ λΉˆλ“€μ„ 효율적으둜 κ΄€λ¦¬ν•˜κ³  μ£Όμž…ν•©λ‹ˆλ‹€.
  • 빈의 μ •μ˜μ™€ λ™μž‘μ€ μŠ€ν”„λ§μ˜ 핡심 κ°œλ…μΈ μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection, DI) κ³Ό λ°€μ ‘ν•œ 관련이 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μŠ€ν”„λ§ 빈의 μ£Όμš” νŠΉμ§•.

  • 1. 싱글톀(Singleton) μŠ€μ½”ν”„
    • 기본적으둜 μŠ€ν”„λ§ λΉˆμ€ 싱글톀 μŠ€μ½”ν”„λ‘œ κ΄€λ¦¬λ©λ‹ˆλ‹€.
      • 즉, νŠΉμ • 빈 νƒ€μž…μ— λŒ€ν•΄ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œμ„ μƒμ„±ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ μž¬μ‚¬μš©ν•©λ‹ˆλ‹€.
        • λ¬Όλ‘ , ν•„μš”μ— 따라 ν”„λ‘œν† νƒ€μž…, μš”μ²­, μ„Έμ…˜ λ“± λ‹€λ₯Έ μŠ€μ½”ν”„λ‘œ λΉˆμ„ μ •μ˜ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
  • 2. μ˜μ‘΄μ„± 관리
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 빈의 μ˜μ‘΄μ„±μ„ μžλ™μœΌλ‘œ μ£Όμž…ν•©λ‹ˆλ‹€.
      • 즉, 빈이 생성될 λ•Œ ν•„μš”ν•œ μ˜μ‘΄μ„±(λ‹€λ₯Έ λΉˆμ΄λ‚˜ λ¦¬μ†ŒμŠ€)을 μŠ€ν”„λ§μ΄ μžλ™μœΌλ‘œ μ£Όμž…ν•΄μ€λ‹ˆλ‹€.
        • 이 κ³Όμ •μ—μ„œ μƒμ„±μž μ£Όμž…, μ„Έν„° μ£Όμž…, ν•„λ“œ μ£Όμž… λ“± λ‹€μ–‘ν•œ 방법이 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. 라이프사이클 관리
    • μŠ€ν”„λ§μ€ 빈의 생성뢀터 μ†Œλ©ΈκΉŒμ§€μ˜ 라이프사이클을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.
      • 빈이 생성될 λ•Œ μ΄ˆκΈ°ν™” μž‘μ—…μ„ ν•˜κ±°λ‚˜, 빈이 μ†Œλ©Έλ  λ•Œ 클린업 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ λ‹€μ–‘ν•œ ν›…(Hook)을 μ œκ³΅ν•˜λ©°, 이 κ³Όμ •μ—μ„œ @PostConstruct, @PreDestroy 같은 μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 4. μ„€μ • 및 ꡬ성
    • λΉˆμ€ XML μ„€μ • νŒŒμΌμ΄λ‚˜ μžλ°” μ„€μ • ν΄λž˜μŠ€μ—μ„œ μ •μ˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.
      • λ˜ν•œ, @Component, @Service, @PostConstruct, @PreDestroy 같은 μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 5. λŠμŠ¨ν•œ κ²°ν•©(Loose Coupling)
    • μŠ€ν”„λ§ λΉˆμ„ μ‚¬μš©ν•˜λ©΄ 객체 κ°„μ˜ μ˜μ‘΄μ„±μ„ 직접 μ„€μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μŠ€ν”„λ§μ΄ κ΄€λ¦¬ν•˜λ―€λ‘œ μ½”λ“œκ°€ λ”μš± μœ μ—°ν•˜κ³  ν…ŒμŠ€νŠΈν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
      • μ΄λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μœ μ§€λ³΄μˆ˜μ„±κ³Ό ν™•μž₯성을 λ†’μ—¬μ€λ‹ˆλ‹€.

3️⃣ μŠ€ν”„λ§ 빈의 μ •μ˜ μ˜ˆμ‹œ.

  • λ‹€μŒμ€ 빈이 μ–΄λ–»κ²Œ μ •μ˜λ˜κ³ , μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ 이λ₯Ό κ΄€λ¦¬ν•˜λŠ”μ§€μ— λŒ€ν•œ κ°„λ‹¨ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€.
    @Component
    public class MyService {
      public void performService() {
          System.out.println("Service is being performed.")
      }
    }
    
  • μœ„ μ½”λ“œμ—μ„œ @Component μ• λ…Έν…Œμ΄μ…˜μ΄ 적용된 MyService ν΄λž˜μŠ€λŠ” μŠ€ν”„λ§ 빈으둜 λ“±λ‘λ©λ‹ˆλ‹€.
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 이 λΉˆμ„ κ΄€λ¦¬ν•˜κ³ , ν•„μš”ν•  λ•Œ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•©λ‹ˆλ‹€.
  • λΉˆμ„ μŠ€ν”„λ§ μ»¨ν…μŠ€νŠΈμ—μ„œ 가져와 μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    ```java
    @Autowired
    private MyService myService;

public void useService() {
myService.performService();
}
```

  • μ—¬κΈ°μ„œ @Autowired μ• λ…Έν…Œμ΄μ…˜μ€ MyService νƒ€μž…μ˜ λΉˆμ„ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ£Όμž…λ°›μ•„ useService λ©”μ„œλ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

결둠적으둜, μŠ€ν”„λ§ λΉˆμ€ μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 핡심적인 역할을 ν•˜λŠ” 객체둜, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ κ΄€λ¦¬ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ΄λ©°, 이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ성 μš”μ†Œλ“€μ΄ μœ μ—°ν•˜κ³  효율적으둜 λ™μž‘ν•˜λ„λ‘ λ•μŠ΅λ‹ˆλ‹€.