Home > Spring > ๐Ÿƒ[Spring] Spring์—์„œ ๋นˆ(Bean)์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•๋“ค.

๐Ÿƒ[Spring] Spring์—์„œ ๋นˆ(Bean)์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•๋“ค.
Spring Framework

๐Ÿƒ[Spring] Spring์—์„œ ๋นˆ(Bean)์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•๋“ค.

  • Spring์—์„œ ๋นˆ(Bean) ์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI) ์ด๋ผ๋Š” ๊ฐœ๋…์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • Spring IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•œ ๊ณณ์— ์ž๋™์œผ๋กœ ๋นˆ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๋นˆ์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…, ์„ธํ„ฐ ์ฃผ์ž…, ํ•„๋“œ ์ฃผ์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ™‹โ€โ™‚๏ธ ์˜์กด์„ฑ(Dependency)
๐Ÿ™‹โ€โ™‚๏ธ Spring ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
๐Ÿ™‹โ€โ™‚๏ธ Spring ์ปจํ…Œ์ด๋„ˆ
๐Ÿ™‹โ€โ™‚๏ธ Spring ๋นˆ(Bean)

1๏ธโƒฃ ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection)

  • ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ๋•Œ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ, ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๊ณ  ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์šฉ์ดํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ

@Service
public class UserService {
    
    private final UserRepository userRepository;
    
    @Autowired // Spring 4.3+ ์—์„œ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    public void process() {
        userRepository.save();
    }
}

์„ค๋ช….

  • UserService๋Š” UserRepository ๋นˆ์„ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…๋ฐ›์Šต๋‹ˆ๋‹ค.
  • @Autowired๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง์ด UserRepository ๋นˆ์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • @Autowired๋Š” Spring 4.3 ์ดํ›„ ์ƒ์„ฑ์ž ์ฃผ์ž…์—์„œ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ช…์‹œ์ ์œผ๋กœ ์ ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์„ธํ„ฐ ์ฃผ์ž…(Setter Injection)

  • ์„ธํ„ฐ ์ฃผ์ž…์€ ์„ธํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์„ ํƒ์ ์ธ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ์ฃผ์ž…๋ฐ›์€ ๋นˆ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

@Service
public class UserService {
    
    private UserRepository userRepository;
    
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRespository = userRepository;
    }
    
    public void process() {
        userRepository.sava();
    }
}

์„ค๋ช….

  • UserSevice๋Š” setUserRepository๋ผ๋Š” ์„ธํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด UserRepository ๋นˆ์„ ์ฃผ์ž…๋ฐ›์Šต๋‹ˆ๋‹ค.
    • @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์Šคํ”„๋ง์ด ์ ์ ˆํ•œ ๋นˆ์„ ์ฃผ์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ํ•„๋“œ ์ฃผ์ž…(Field Injection)

  • ํ•„๋“œ ์ฃผ์ž…์€ ์ง์ ‘ ํ•„๋“œ์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ๋นˆ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์ด์ง€๋งŒ, ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ฃผ์ž…๋œ ํ•„๋“œ๊ฐ€ โ€˜finalโ€™๋กœ ์„ค์ •๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— โ€˜๋ถˆ๋ณ€์„ฑโ€™์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ง€์–‘ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ

@Servicee
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    public void process() {
        userRepository.save();
    }
}

์„ค๋ช….

  • UserService๋Š” UserRepository ๋นˆ์„ ํ•„๋“œ์— ์ง์ ‘ ์ฃผ์ž…๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ํ•„๋“œ ์ฃผ์ž… ๋ฐฉ์‹์€ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๋ถˆ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ๊ฐ ์ฃผ์ž… ๋ฐฉ์‹์˜ ๋น„๊ต.

1. ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection)

  • ์žฅ์ 
    • ์˜์กด์„ฑ์ด ํ•„์ˆ˜์ ์ž„์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๊ณ , ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
    • ์˜์กด์„ฑ์ด ์ฃผ์ž…๋˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ 
    • ํด๋ž˜์Šค๊ฐ€ ๋งŽ์€ ์˜์กด์„ฑ์„ ๊ฐ€์งˆ ๊ฒฝ์šฐ, ์ƒ์„ฑ ์ธ์ž๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์„ธํ„ฐ ์ฃผ์ž…(Setter Injection)

  • ์žฅ์ 
    • ์„ ํƒ์ ์ธ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐ์ฒด ์ƒ์„ฑ ํ›„์— ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์–ด ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ 
    • ์˜์กด์„ฑ์ด ์ฃผ์ž…๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์‚ฌ์šฉ๋  ์œ„ํ—˜์ด ์กด์žฌํ•˜๋ฉฐ, ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ํ•„๋“œ ์ฃผ์ž…(Field Injection)

  • ์žฅ์ 
    • ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ 
    • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต๊ณ , ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋˜ํ•œ, ํ•„๋“œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— SRP(Single Responsibility Principle)๋ฅผ ์œ„๋ฐ˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๐Ÿ™‹โ€โ™‚๏ธ SOLID ์›์น™

5๏ธโƒฃ ๊ฒฐ๋ก 

  • ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection) : ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection) ์€ ์˜์กด์„ฑ ๊ฐ•์ œ, ๋ถˆ๋ณ€์„ฑ ๋ณด์žฅ, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ์ธก๋ฉด์—์„œ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์„ธํ„ฐ ์ฃผ์ž…(Setter Injection) : ์„ ํƒ์  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ, ์„ธํ„ฐ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ณต์šฉ์œผ๋กœ ๋…ธ์ถœ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•„๋“œ ์ฃผ์ž…(Field Injection) : ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์ด์ง€๋งŒ, ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๊ณ  ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ง€์–‘ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.