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) : κ°€μž₯ κ°„λ‹¨ν•œ λ°©μ‹μ΄μ§€λ§Œ, ν…ŒμŠ€νŠΈκ°€ μ–΄λ ΅κ³  λΆˆλ³€μ„±μ„ 보μž₯ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ§€μ–‘ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.