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์€ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋นˆ์„ ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋‘ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์Šคํ”„๋ง์€ ์ž๋ฐ” ๊ธฐ๋ฐ˜์œผ๋กœ ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉฐ, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค๋„ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ํŠนํžˆ ๋” ๋ณต์žกํ•œ ๋นˆ ์ƒ์„ฑ ๋กœ์ง์„ ํ•„์š”๋กœ ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์™€์˜ ํ†ตํ•ฉ์ด ํ•„์š”ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.