Home > Spring > πŸƒ[Spring] μ–Έμ œ `@Configuration`와 `@Bean`을 ν•¨κ»˜ μ‚¬μš©ν• κΉŒ?

πŸƒ[Spring] μ–Έμ œ `@Configuration`와 `@Bean`을 ν•¨κ»˜ μ‚¬μš©ν• κΉŒ?
Spring Framework

πŸƒ[Spring] μ–Έμ œ @Configuration와 @Bean을 ν•¨κ»˜ μ‚¬μš©ν• κΉŒ?

  • @Configurationκ³Ό @Bean을 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” μžλ°” 기반의 μ„€μ • 클래슀 λ₯Ό μ •μ˜ν•  λ•Œμž…λ‹ˆλ‹€.
  • 이 방식은 μˆ˜λ™μœΌλ‘œ λΉˆμ„ μ •μ˜ν•˜κ³  μ„€μ • 과정을 μ„Έλ°€ν•˜κ²Œ μ œμ–΄ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 특히 μ™ΈλΆ€λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” 객체듀을 빈으둜 λ“±λ‘ν•˜κ±°λ‚˜, 빈의 생성과 μ΄ˆκΈ°ν™” 과정을 μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•΄μ•Ό ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

1️⃣ @Configurationκ³Ό @Bean을 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” μ£Όμš” 이유.

1. μ™ΈλΆ€ 라이브러리 클래슀의 빈 등둝.

  • @Configurationκ³Ό @Bean을 μ‚¬μš©ν•˜λ©΄ μ™ΈλΆ€ 라이브러리의 ν΄λž˜μŠ€λ‚˜, Spring이 직접 κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” 객체듀을 빈으둜 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • Spring의 μžλ™ μŠ€μΊ” κΈ°λŠ₯은 κ°œλ°œμžκ°€ μž‘μ„±ν•œ 클래슀만 λŒ€μƒμœΌλ‘œ ν•˜κΈ° λ•Œλ¬Έμ—, μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” κ°μ²΄λŠ” μˆ˜λ™μœΌλ‘œ 빈으둜 등둝해야 ν•©λ‹ˆλ‹€.

2. μ»€μŠ€ν…€ 빈 μ΄ˆκΈ°ν™” 및 μ„€μ •.

  • @Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 빈이 μƒμ„±λ˜λŠ” 방식을 μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μƒμ„±μž νŒŒλΌλ―Έν„°, μ΄ˆκΈ°ν™” κ³Όμ •, μ˜μ‘΄μ„± μ£Όμž… 방식 등을 μ„ΈλΆ€μ μœΌλ‘œ μ„€μ •ν•  수 있으며, 이 섀정을 Java μ½”λ“œλ‘œ μž‘μ„±ν•¨μœΌλ‘œμ¨ XML 기반 섀정을 λŒ€μ²΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. λ³΅μž‘ν•œ 빈 생성 둜직 처리.

  • 빈 생성 과정이 λ³΅μž‘ν•˜κ±°λ‚˜ μ—¬λŸ¬ μ˜μ‘΄μ„±μ„ ν•„μš”λ‘œ ν•  경우, @Configuration ν΄λž˜μŠ€μ—μ„œ 이λ₯Ό μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 빈 κ°„μ˜ μ˜μ‘΄μ„±, νŠΉμ • 상황에 λ”°λ₯Έ 빈 생성 둜직 등을 μžλ°” μ½”λ“œλ‘œ λͺ…ν™•ν•˜κ²Œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

4. XML μ„€μ •μ˜ λŒ€μ²΄.

  • Spring은 과거에 XML 기반 섀정을 주둜 μ‚¬μš©ν–ˆμ§€λ§Œ, @Configurationκ³Ό @Bean을 μ‚¬μš©ν•˜λ©΄ μ΄λŸ¬ν•œ 섀정을 μžλ°” μ½”λ“œλ‘œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μžλ°” 기반 섀정은 νƒ€μž… μ•ˆμ •μ„±μ„ μ œκ³΅ν•˜λ©°, μ½”λ“œμ™€ 섀정이 ν•˜λ‚˜μ˜ 파일 내에 ν†΅ν•©λ˜μ–΄ μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

2️⃣ μ˜ˆμ‹œ

1. μ™ΈλΆ€ 라이브러리 빈 등둝

  • 예λ₯Ό λ“€μ–΄, μ™ΈλΆ€ 라이브러리의 λ°μ΄ν„°λ² μ΄μŠ€ 컀λ„₯μ…˜ ν’€(HikariDataSource)을 빈으둜 λ“±λ‘ν•˜κ³ , 이λ₯Ό μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.
@Configuration
public class DataSourceConfig {
    
    @Bean
    public DataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        dataSource.setMaximumPoolSize(10);
        return dataSource;
    }
}
  • @Configuration
    • 이 ν΄λž˜μŠ€κ°€ Spring의 μ„€μ • 파일둜 μ‚¬μš©λ˜λ©°, λΉˆμ„ μ •μ˜ν•˜λŠ” ν΄λž˜μŠ€μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • @Bean
    • 이 λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•˜λŠ” HikariDataSource κ°μ²΄λŠ” μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— 빈으둜 λ“±λ‘λ©λ‹ˆλ‹€.
    • μ™ΈλΆ€ 라이브러리 κ°μ²΄μ΄λ―€λ‘œ μžλ™ μŠ€μΊ”μ΄ λΆˆκ°€λŠ₯ν•˜λ©°, 이λ₯Ό μˆ˜λ™μœΌλ‘œ λ“±λ‘ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

2. λ³΅μž‘ν•œ 빈 μ΄ˆκΈ°ν™”

  • λ‹€μŒμ€ μ„œλΉ„μŠ€ 빈이 μ—¬λŸ¬ κ°€μ§€ μ˜μ‘΄μ„±μ„ ν•„μš”λ‘œ ν•˜κ³ , 빈 μ΄ˆκΈ°ν™” κ³Όμ •μ—μ„œ νŠΉμ • 섀정이 ν•„μš”ν•œ κ²½μš°μž…λ‹ˆλ‹€.
@Configuration
public class AppConfig {
    
    @Bean
    public UserService userService(UserRepository userRepository, NotificationService notificationService) {
        UserService userService = new UserService(userRepository);
        userService.setNotificationService(notificationService); // μΆ”κ°€ μ„€μ •
        return userService;
    }
    
    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }
    
    @Bean
    public NotificationService notificationService() {
        return new EmailNotificationService();
    }
}
  • 이 μ˜ˆμ—μ„œλŠ” UserServiceκ°€ μ—¬λŸ¬ μ˜μ‘΄μ„±μ„ ν•„μš”λ‘œ ν•˜κ³ , νŠΉμ • μΆ”κ°€ 섀정이 ν•„μš”ν•œ 상황을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • Configuration : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„€μ • ν΄λž˜μŠ€μž„μ„ λͺ…μ‹œν•©λ‹ˆλ‹€.
    • @Bean : UserService, UserRepository, NotificationServiceλ₯Ό 빈으둜 λ“±λ‘ν•˜κ³ , μ˜μ‘΄μ„±μ„ μˆ˜λ™μœΌλ‘œ μ£Όμž…ν•˜κ³  μΆ”κ°€ 섀정을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. 빈 κ°„ μ˜μ‘΄μ„± 관리.

  • @Configuration ν΄λž˜μŠ€μ—μ„œ 빈 κ°„μ˜ μ˜μ‘΄μ„±μ„ λͺ…ν™•ν•˜κ²Œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‹€μŒμ€ μ—¬λŸ¬ 빈 κ°„μ˜ μ˜μ‘΄μ„±μ„ μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.
    @Configuration
    public class ServiceConfig {
        
      @Bean
      public UserService userService() {
          return new UserService(userRepository());
      }
        
      @Bean
      public UserRepository userRepository() {
          return new UserRepository();
      }
    }
    
  • μ—¬κΈ°μ„œ UserServiceλŠ” UserRepository에 μ˜μ‘΄ν•˜λ©°, @Bean λ©”μ„œλ“œλ₯Ό 톡해 UserRepository λΉˆμ„ μ°Έμ‘°ν•©λ‹ˆλ‹€.
    • μŠ€ν”„λ§μ€ μ΄λŸ¬ν•œ μ˜μ‘΄μ„±μ„ μžλ™μœΌλ‘œ ν•΄κ²°ν•˜μ—¬ λΉˆμ„ λ“±λ‘ν•©λ‹ˆλ‹€.

3️⃣ μ–Έμ œ @Configurationκ³Ό @Bean을 μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

1. μ™ΈλΆ€ 라이브러리 λ˜λŠ” μŠ€ν”„λ§μ΄ μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” 클래슀 등둝

  • μ™ΈλΆ€ 라이브러리의 ν΄λž˜μŠ€λ‚˜ λ‹€λ₯Έ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” 객체듀을 빈으둜 등둝해야 ν•  λ•Œ @Configurationκ³Ό @Bean을 ν•¨κ»˜ μ‚¬μš©ν•©λ‹ˆλ‹€.

2. λ³΅μž‘ν•œ 빈 생성 둜직이 ν•„μš”ν•  λ•Œ

  • 빈 생성 μ‹œ μ˜μ‘΄μ„± μ£Όμž… 외에 좔가적인 섀정이 ν•„μš”ν•œ 경우(νŠΉμ • λ©”μ„œλ“œ 호좜, 객체 μ΄ˆκΈ°ν™”, μΆ”κ°€ μ„€μ • λ“±) @Bean을 μ‚¬μš©ν•˜μ—¬ μˆ˜λ™μœΌλ‘œ λΉˆμ„ μƒμ„±ν•˜κ³ , 이λ₯Ό μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. 빈 κ°„μ˜ λͺ…μ‹œμ  μ˜μ‘΄μ„± 관리

  • μ„œλ‘œ μ˜μ‘΄ν•˜λŠ” λΉˆλ“€μ΄ μžˆμ„ λ•Œ, @Configuration ν΄λž˜μŠ€μ—μ„œ 빈의 생성 μˆœμ„œμ™€ μ˜μ‘΄μ„±μ„ λͺ…μ‹œμ μœΌλ‘œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

4. μœ μ—°ν•œ 섀정이 ν•„μš”ν•  λ•Œ

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀정을 μžλ°” μ½”λ“œλ‘œ κ΄€λ¦¬ν•˜λ©΄μ„œ, 쑰건뢀 빈 생성, ν”„λ‘œνŒŒμΌ 기반 빈 관리 λ“±κ³Ό 같이 더 λ³΅μž‘ν•˜κ³  μœ μ—°ν•œ 섀정이 ν•„μš”ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

4️⃣ κ²°λ‘ 

  • @Configurationκ³Ό @Bean은 μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λΉˆμ„ μˆ˜λ™μœΌλ‘œ λ“±λ‘ν•˜κ³  μ„€μ •ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 이 두 μ–΄λ…Έν…Œμ΄μ…˜μ„ ν•¨κ»˜ μ‚¬μš©ν•¨μœΌλ‘œμ¨ μŠ€ν”„λ§μ€ μžλ°” 기반으둜 λΉˆμ„ μƒμ„±ν•˜κ³  관리할 수 있게 되며, μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ μŠ€ν”„λ§μ΄ μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” 객체듀도 빈으둜 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ 방식은 특히 더 λ³΅μž‘ν•œ 빈 생성 λ‘œμ§μ„ ν•„μš”λ‘œ ν•˜κ±°λ‚˜ μ™ΈλΆ€ λ¦¬μ†ŒμŠ€μ™€μ˜ 톡합이 ν•„μš”ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.