Home > Spring > πŸƒ[Spring] Spring 빈(Bean).

πŸƒ[Spring] Spring 빈(Bean).
Spring Framework

πŸƒ[Spring] Spring 빈(Bean).

Springμ—μ„œ 빈(Bean) 은 Spring IoC μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” 객체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

κ°„λ‹¨νžˆ 말해, λΉˆμ€ μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 ꡬ성 μš”μ†Œλ‘œ, κ°œλ°œμžκ°€ μ •μ˜ν•œ 객체(클래슀 μΈμŠ€ν„΄μŠ€)κ°€ Spring의 관리 ν•˜μ— λ™μž‘ν•˜λŠ” 것을 λœ»ν•©λ‹ˆλ‹€.

1️⃣ Spring 빈의 μ£Όμš” κ°œλ….

1. 빈 μ •μ˜(Bean Definition)

  • μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λΉˆμ€ κ°œλ°œμžκ°€ μ •μ˜ν•œ κ°μ²΄μž…λ‹ˆλ‹€.
  • λΉˆμ€ 일반적으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ€‘μš”ν•œ μ„œλΉ„μŠ€, λ ˆν¬μ§€ν† λ¦¬, 컨트둀러 같은 κ°μ²΄λ“€λ‘œ, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ 생λͺ…μ£ΌκΈ°κ°€ κ΄€λ¦¬λ©λ‹ˆλ‹€.

2. μŠ€ν”„λ§ IoC(Inversion of Control) μ»¨ν…Œμ΄λ„ˆ.

  • Spring IoC μ»¨ν…Œμ΄λ„ˆλŠ” 빈의 생성, μ΄ˆκΈ°ν™”, μ„€μ •, μ†Œλ©Έ λ“±μ˜ 생λͺ…μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • κ°œλ°œμžλŠ” 직접 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ μ†Œλ©Έμ‹œν‚€μ§€ μ•Šκ³ , IoC μ»¨ν…Œμ΄λ„ˆμ— κ·Έ 역할을 λ§‘κΉλ‹ˆλ‹€.
  • IoC μ»¨ν…Œμ΄λ„ˆλŠ” λΉˆμ„ ν•„μš”μ— 따라 μžλ™μœΌλ‘œ μ£Όμž…ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€.

3. 빈 등둝.

  • λΉˆμ€ XML μ„€μ • 파일, μžλ°” μ„€μ • 클래슀, λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜ 기반으둜 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ–΄λ…Έν…Œμ΄μ…˜ 기반으둜 λΉˆμ„ λ“±λ‘ν•˜λŠ” 방식이 Spring Bootμ—μ„œλŠ” 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

2️⃣ 빈의 μ •μ˜μ™€ 생성 방식.

1. μ–΄λ…Έν…Œμ΄μ…˜ 기반 빈 등둝(Spring Bootμ—μ„œ 자주 μ‚¬μš©)

λΉˆμ„ μƒμ„±ν•˜λŠ” κ°€μž₯ 일반적인 방법은 ν΄λž˜μŠ€μ— μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬ 빈으둜 λ“±λ‘ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

  • @Component
    • 일반적인 빈으둜 등둝할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • @Sevice, @Repository, @Controller
    • 각각 μ„œλΉ„μŠ€, λ ˆν¬μ§€ν† λ¦¬, 컨트둀러 역할을 ν•˜λŠ” λΉˆμ„ 등둝할 λ•Œ μ‚¬μš©λ˜λŠ” 더 ꡬ체적인 μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.

μ˜ˆμ‹œ

@Component
public class MyService {
    // 이 ν΄λž˜μŠ€λŠ” μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” 빈이 λ©λ‹ˆλ‹€.
}

@Service
public class UserService {
    // 이 ν΄λž˜μŠ€λ„ @Service둜 빈으둜 λ“±λ‘λ©λ‹ˆλ‹€.
}

2. μžλ°” μ„€μ • ν΄λž˜μŠ€μ—μ„œ 빈 등둝

μžλ°” μ„€μ • νŒŒμΌμ„ μ‚¬μš©ν•΄ λͺ…μ‹œμ μœΌλ‘œ λΉˆμ„ 등둝할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
이 λ°©μ‹μ—μ„œλŠ” @Configuration κ³Ό @Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

@Configuration
public class AppConfig {
    
    @Bean
    public MyService myService() {
        return new MyService();
    }
}
  • @Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•˜λŠ” 객체λ₯Ό 빈으둜 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€.

3. XML 기반 μ„€μ •(ν˜„μž¬λŠ” 잘 μ‚¬μš©λ˜μ§€ μ•ŠμŒ)

κ³Όκ±°μ—λŠ” XML νŒŒμΌμ„ μ‚¬μš©ν•΄ λΉˆμ„ μ„€μ •ν–ˆμœΌλ‚˜, ν˜„μž¬λŠ” 주둜 μžλ°” μ„€μ •κ³Ό μ–΄λ…Έν…Œμ΄μ…˜ 기반 섀정을 μ‚¬μš©ν•©λ‹ˆλ‹€.

3️⃣ 빈의 생λͺ…μ£ΌκΈ°

μŠ€ν”„λ§ IoC μ»¨ν…Œμ΄λ„ˆλŠ” 빈의 생λͺ…μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
빈의 생λͺ…μ£ΌκΈ°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1. 생성.

  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ λΉˆμ„ μƒμ„±ν•©λ‹ˆλ‹€.

2. μ˜μ‘΄μ„± μ£Όμž….

  • μƒμ„±λœ λΉˆμ— ν•„μš”ν•œ μ˜μ‘΄μ„±(λ‹€λ₯Έ 빈)이 μ£Όμž…λ©λ‹ˆλ‹€.

3. μ΄ˆκΈ°ν™”.

  • 빈이 ν•„μš”ν•œ μ„€μ • 및 μ΄ˆκΈ°ν™” μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. μ‚¬μš©.

  • 빈이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

5. μ†Œλ©Έ.

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ’…λ£Œ μ‹œ 빈이 μ†Œλ©Έλ©λ‹ˆλ‹€.

3️⃣ 빈 μŠ€μ½”ν”„

μŠ€ν”„λ§ λΉˆμ€ μ—¬λŸ¬ 가지 μŠ€μ½”ν”„λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€μ½”ν”„λŠ” 빈이 μƒμ„±λ˜κ³  μ‚¬μš©λ˜λŠ” λ²”μœ„λ₯Ό μ§€μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

1. 싱글톀(Singleton)

  • μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ κΈ°λ³Έ μŠ€μ½”ν”„λ‘œ, μ»¨ν…Œμ΄λ„ˆμ— ν•œ 번만 μƒμ„±λ©λ‹ˆλ‹€.
  • 이후 같은 λΉˆμ— λŒ€ν•œ μš”μ²­μ΄ μžˆμ„ 경우, λ™μΌν•œ 객체 μΈμŠ€ν„΄μŠ€κ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.
  • 거의 λŒ€λΆ€λΆ„μ˜ μŠ€ν”„λ§ λΉˆμ€ μ‹±κΈ€ν†€μœΌλ‘œ κ΄€λ¦¬λ©λ‹ˆλ‹€.

2. ν”„λ‘œν† νƒ€μž…(Prototype)

  • 빈이 μš”μ²­λ  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ©λ‹ˆλ‹€.
  • 즉, 맀번 λ‹€λ₯Έ 객체가 λ°˜ν™˜λ©λ‹ˆλ‹€.

3. Request, Session, Application

  • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©λ˜λŠ” μŠ€μ½”ν”„λ‘œ, 각각 HTTP μš”μ²­λ‹Ή, μ„Έμ…˜λ‹Ή, λ˜λŠ” μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€νŠΈλ‹Ή μƒˆλ‘œμš΄ λΉˆμ„ μƒμ„±ν•©λ‹ˆλ‹€.

4️⃣ μ˜ˆμ‹œ: 싱글톀 빈

@Service
public class UserService {
    // 이 ν΄λž˜μŠ€λŠ” 싱글톀 빈으둜 κ΄€λ¦¬λ©λ‹ˆλ‹€.
}
  • μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ UserService λΉˆμ€ ν•œ 번만 μƒμ„±λ˜κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ²΄μ—μ„œ λ™μΌν•œ 객체둜 μ‚¬μš©λ©λ‹ˆλ‹€.

5️⃣ κ²°λ‘ 

μŠ€ν”„λ§ λΉˆμ€ μŠ€ν”„λ§ IoC μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” 객체둜, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ£Όμš” ꡬ성 μš”μ†Œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
λΉˆμ€ μ–΄λ…Έν…Œμ΄μ…˜ λ˜λŠ” μžλ°” μ„€μ • νŒŒμΌμ„ 톡해 등둝할 수 있으며, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 빈의 생λͺ…μ£ΌκΈ°λ₯Ό μžλ™μœΌλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
이λ₯Ό 톡해 μ˜μ‘΄μ„± μ£Όμž…, 객체 관리, 그리고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ˜ μœ μ—°μ„±μ„ 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.