Spring 🌱

[Spring] μ˜μ‘΄μ„± μ£Όμž…(DI)μ΄λž€?

z.zzz 2023. 7. 13. 12:26
1. μ˜μ‘΄μ„± μ£Όμž…μ΄λž€?
2. μ˜μ‘΄μ„± μ£Όμž…μ˜ ν•„μš”μ„±
3. μ˜μ‘΄μ„± μ£Όμž… 예
4. μ˜μ‘΄μ„± μ£Όμž…μ˜ μž₯점
5. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ™€ μŠ€ν”„λ§ 빈
6. μŠ€ν”„λ§ λΉˆμ„ λ“±λ‘ν•˜λŠ” 방법

 

μ˜μ‘΄μ„± μ£Όμž…μ΄λž€?

- 객체 κ°„ μ˜μ‘΄κ΄€κ³„λ₯Ό μ™ΈλΆ€μ—μ„œ λ„£μ–΄μ£ΌλŠ” 것

- μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ(=IoC μ»¨ν…Œμ΄λ„ˆ)에 μ •μ˜λœ μŠ€ν”„λ§ 빈 등둝 정보λ₯Ό λ°”νƒ•μœΌλ‘œ, μ˜μ‘΄κ΄€κ³„λ₯Ό μžλ™μœΌλ‘œ μ£Όμž…ν•΄μ€€λ‹€.

- 객체의 λŒ€ν•œ μ œμ–΄ κΆŒν•œμ€ λͺ¨λ‘ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μœ„μž„λ˜λ©°, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€λ“€μ„ λΆˆν•„μš”ν•˜κ²Œ μ—¬λŸ¬κ°œ λ§Œλ“€μ§€ μ•Šκ³ , 단 ν•˜λ‚˜λ§Œ μƒμ„±ν•˜λŠ” 싱글톀 λ°©μ‹μœΌλ‘œ κ΄€λ¦¬ν•˜μ—¬, λ©”λͺ¨λ¦¬ κ΄€λ¦¬μ˜ νš¨μœ¨μ„±μ„ μ œκ³΅ν•œλ‹€.

 

 

μ˜μ‘΄μ„± μ£Όμž…μ˜ ν•„μš”μ„±

1. ν΄λž˜μŠ€κ°„ 결합도가 λŠμŠ¨ν•΄μ§„λ‹€. ( = ν•œ ν΄λž˜μŠ€κ°€ 변경될 경우, λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ 변경될 ν•„μš”μ„±μ΄ 적어진닀)

2. μ‹±κΈ€ν†€μ˜ 객체 곡용으둜 μ‚¬μš© → λΆˆν•„μš”ν•œ 객체의 생성을 쀄이고, λ©”λͺ¨λ¦¬ νš¨μœ¨μ„± ν–₯상

 

 

μ˜μ‘΄μ„± μ£Όμž… 예

public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    ...
}

μ˜μ‘΄μ„± μ£Όμž…μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ„ 땐 new둜 MemoryMemberRepository 객체λ₯Ό μƒμ„±ν•˜μ˜€λ‹€. κ·ΈλŸ°λ° νšŒμ› μ„œλΉ„μŠ€(MemberService) 외에도 결제 μ„œλΉ„μŠ€, 배솑 μ„œλΉ„μŠ€ 등이 μžˆλ‹€λ©΄, μ„œλΉ„μŠ€λ§ˆλ‹€ 맀번 repository 객체λ₯Ό 생성할 ν•„μš”κ°€ μ—†λ‹€. ν•˜λ‚˜μ˜ repositoryλ₯Ό 생성해놓고 곡용으둜 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

이λ₯Ό μ‹€ν˜„ν•  수 μžˆλŠ” 방법이 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— 객체λ₯Ό λ“±λ‘ν•˜κ³  μ‚¬μš©ν•˜λŠ” μ˜μ‘΄μ„± μ£Όμž…μ΄λ‹€.

 

public class MemberService {

    private final MemberRepository memberRepository;
    
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    ...
}

μ˜μ‘΄μ„± μ£Όμž… 방법에선 new 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€. λŒ€μ‹  μƒμ„±μžμ— @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ΄ 있으면 μŠ€ν”„λ§μ΄ μ»¨ν…Œμ΄λ„ˆμ— λ“±λ‘λœ μ—°κ΄€λœ 객체λ₯Ό μ°Ύμ•„μ„œ λ„£μ–΄μ€€λ‹€. 이 κ²½μš°μ—” μŠ€ν”„λ§μ΄ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—μ„œ memberRepository와 μ—°κ΄€λœ 객체λ₯Ό μ°Ύμ•„ λ„£μ–΄μ€ŒμœΌλ‘œμ„œ μ˜μ‘΄μ„± μ£Όμž…μ„ μ‹€ν˜„ν•˜μ˜€λ‹€. 

 

 

μ˜μ‘΄μ„± μ£Όμž…μ˜ μž₯점

1. μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬μ€€λ‹€.

2. μ½”λ“œλ₯Ό λ‹¨μˆœν™” μ‹œμΌœμ€€λ‹€.

3. 가독성을 높인닀.

4. 결합도가 λŠμŠ¨ν•΄μ§€κ³  쒅속성이 κ°μ†Œν•˜λ©°, μ½”λ“œ 변경에 λ―Όκ°ν•˜μ§€ μ•Šλ‹€.

5. ν…ŒμŠ€νŠΈμ— μš©μ΄ν•˜λ‹€.

 

 

이제 μ˜μ‘΄μ„± μ£Όμž…μ„ μœ„ν•΄ 객체λ₯Ό μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•˜λŠ” 방법을 μ•Œμ•„λ³΄μž

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ™€ μŠ€ν”„λ§ 빈

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ

 - μžλ°” 객체의 생λͺ… μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•˜λŠ” 곡간

 - μŠ€ν”„링 빈의 μƒμ„±, 관리, 제거 λ“±μ˜ μ—­ν• 

 

μŠ€ν”„λ§ 빈

 - μŠ€ν”„링 μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” μžλ°” 객체

 - μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ†Œν”„νŠΈμ›¨μ–΄ μ»΄ν¬λ„ŒνŠΈ

 - new μ—°μ‚°μžλ‘œ μƒμ„±λœ κ°μ²΄λŠ” 빈이 μ•„λ‹˜

 

 

μŠ€ν”„λ§ λΉˆμ„ λ“±λ‘ν•˜λŠ” 방법

1. μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”

    ⦁ @Component μ–΄λ…Έν…Œμ΄μ…˜μ΄ 있으면 μŠ€ν”„λ§ 빈으둜 μžλ™ λ“±λ‘λœλ‹€.

    ⦁ @Componentλ₯Ό ν¬ν•¨ν•˜λŠ” @Controller, @Service, @Repository μ–΄λ…Έν…Œμ΄μ…˜λ„ μŠ€ν”„λ§ 빈으둜 μžλ™ λ“±λ‘λœλ‹€.

@Service
public class MemberService {

    private final MemberRepository memberRepository;
    
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

}

 

2. μžλ°” μ½”λ“œλ‘œ 직접 μŠ€ν”„λ§ 빈 λ“±λ‘ν•˜κΈ°

    β¦ 상황에 따라 κ΅¬ν˜„ 클래슀λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” 경우, 섀정을 톡해 μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•œλ‹€.

    β¦ μ„€μ • νŒŒμΌμ— @Configuration, μŠ€ν”„λ§ λΉˆμ„ λ“±λ‘ν•˜λŠ” μƒμ„±μžμ— @Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ 뢙인닀.

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}