๐ฏ ๋ชฉํ :ย ์์กด์ฑ ์ฃผ์
์ ์๋ฏธ์ ์ฃผ์
์ฃผ์ฒด์ ๋์์ ๋ํ ํ์ต
๐ DI(Dependency Injection)
๐ ์์กด์ฑ ์ฃผ์
์ด๋?
- IoC/DI์ ๋ํด์ ๊ธฐ์ด ๊ฐ๋
์ ์ ๋ฆฌ ํ์๋ค.
- DI์ Spring์์์ ์๋ฏธ์ ์ฃผ์
ํ ์ฃผ์ฒด, ์ฃผ์
๋ ๋์์ ๋ฌด์์ผ๊น?
๐ DI๊ฐ ํ์ํ ๊ฒฝ์ฐ
public class MemberService {
private final MemberRepository memberRepository = new MemberRepository();
public void createMember(Member member) {
memberRepository.postMember(member);
}
}
- MemberService๊ฐ์ฒด๋ MemberRepository๊ฐ์ฒด์ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
- createMember ๋ฉ์๋๋ MemberRepository ๊ฐ์ฒด์์ ๊ตฌํ๋ ๋ฉ์๋ postMember ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
- ์ด๋ด๋, MemberRepository ๊ฐ์ฒด ๋ง๊ณ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๊ต์ฒด ํด์ผ๋ ๊ฒฝ์ฐ, ๊ต์ฒด ํด์ผ๋ ๊ฐ์ฒด๊ฐ postMember ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ณ ์์ง ์๋ค๋ฉด? ๊ต์ฒด ํด์ผ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฌธ์ ์ ์ด ์๋์ง ํ์ธํด์ผ ๋ ๊ฒ์ด๋ค.
- DI๋ฅผ ํตํด ์ ๋ฌธ์ ์ ์ ๊ฐ์ ํด ๋๊ฐ๋ ๊ณผ์ ์ ์ดํด ๋ณด๋ ค๊ณ ํ๋ค.
๐ ์์กด ๊ด๊ณ ์ฃผ์
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public void createMember(Member member) {
memberRepository.postMember(member);
}
}
- ์ผ๋ฐ์ ์ผ๋ก ์์ฑ์๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ์คํ๋ง์์ ๊ณต์์ ์ผ๋ก ์ถ์ฒํ๋ ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค.
- ์ ์ฝ๋์ ๊ฐ์ด ์์ฑ์๋ฅผ ํตํด์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์๊ฐ ์์กด ๊ด๊ณ๋ฅผ ์ค์ ํ ์ ์๊ฒ ๋ง๋ค๋ฉด,
- ์ด์ ์ธ๋ถ์์ MemberRepository ๊ฐ์ฒด๋ฅผ ์ฃผ์
์ด ๊ฐ๋ฅ ํจ ์ผ๋ก์, DI๋ฅผ ๊ด๋ฆฌํ๋ ์ธ๋ถ ํ์ผ์ ๋ง๋ค์ ์๊ฒ๋๊ณ , ์ด๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ๋๋ค๋ ๋ง๊ณผ ๊ฐ๋ค.
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ์ดํด ๋ณด๊ธฐ ์ , ์์์ MemberRepository ๊ฐ์ฒด ๋ง๊ณ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๊ต์ฒด ํด์ผ ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ณ ์์๋๋ฐ ์์ฑ์์ ์์กด ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ๋ฌด์จ ์๊ด ์ผ๊น ์๋ฌธ์ด ๋ค์ ์๋ค.
- ์์ฑ์๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์
์ ๋ฐ๊ฒ ๋๋ฉด, MemberRepository ๊ฐ์ฒด๋ฅผ ์ธํฐํ์ด์ค๋ก ์ถ์ํ ํ์๋, ๋ค์ํ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด ์ด๋ค ๊ตฌํ์ฒด๊ฐ ์ฃผ์
๋๋๋ผ๋ ์ ์ฝ๋์์ ๋ฌธ์ ์ ์ด ๋ฐ์ํ ์ง ๋ชจ๋ฅด๋ ๊ฑฑ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ ์ ์์ด ์ง๋ค.
- ์ฆ, ์ธ๋ถ์์ MemberRepository ํ์
์ ๊ฐ์ฒด๋ผ๋ฉด, ๊ตฌํ์ฒด๋ ์์๋ฐ๋ ๊ฐ์ฒด๋ ์ด๋ ํ ๊ด๊ณ์ ๊ฐ์ฒด๊ฐ ์ฃผ์
๋๋๋ผ๋ postMember ๋ฉ์๋๊ฐ ๊ตฌํ๋์ด ์์ง ์์ ๊ฑฑ์ ์ ์ํด๋ ๋๋ค๋ ๋ง์ด๋ค.
๐ DI ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
public class DependencyConfig {
public MemberService memberService() {
return new MemberService(memberRepository());
}
public MemberRepository memberRepository() {
return new MemberRepository();
}
}
- ์์ ๊ฐ์ด DI๋ฅผ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌ ํ์ผ DependencyConfig๋ฅผ ๋ง๋ฆ์ผ๋ก์, MemberService ๊ฐ์ฒด ๋ด๋ถ์ DI ๊ด๋ จ ์ฝ๋์ ์ ๊ฒฝ ์ธ ํ์ ์์ด DependencyConfig ๊ฐ์ฒด ์์๋ง ๊ด๋ฆฌ ํ ์ ์๊ฒ ๋์๋ค.
- MemberService ์
์ฅ์์ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ฃผ์
๋ ์ง ์ ์ ์์ผ๋ฉฐ, ์ ํ์๋ ์๊ณ ,ย ์ด๋ค ๊ฐ์ฒด๊ฐ ์ฃผ์
๋ ์ง๋ DependencyConfig(์ธ๋ถ)์์ ๊ฒฐ์ ํ๊ฒ ๋๋ค.
- ๋ํ, MemberService๋ createMember ๋ฉ์๋๋ฅผ ์คํํ๋๋ฐ๋ง ์ง์คํ๊ฒ ๋๋ค.
๐ Spring DI
ย Spring Framework์์๋ DI๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ค์ ์๋์ง ๊ธฐ์ด์ ์ธ ๊ฐ๋
๋ง ํ์ด ๋ณด๊ธฐ ์ํ ์์ ๋ค.
@Configuration
public class DependencyConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepository();
}
}
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public void createMember(Member member){
memberRepository.postMember(member);
}
}
public class MemberRepository {
private static final Map<Long, Member> members = new HashMap<>();
public void postMember(Member member) {
members.put(member.getMemberId(), member);
}
}
- Bean์ ๋ํด์๋ ์ข๋ ์์ธํ ์ ๋ฆฌํด์ ๋ธ๋ก๊น
ํ ์์ ์ด๋ฉฐ, ํ์ฌ ์์ค์์๋ Bean์ Spring Framework์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ก ์๊ฐํ๋ฉด ๋๊ฒ ๋ค.
- @Configuration ์ด๋
ธํ
์ด์
์ ์คํ๋ง ์ปจํ
์ด๋์ ํด๋น ํด๋์ค๋ฅผ Bean์ผ๋ก ๋ฑ๋กํด์ฃผ๊ณ ํด๋น ํด๋์ค ๋ด์ @Bean ์ด๋
ธํ
์ด์
์ด ์๋ ๋ฉ์๋๋ Bean ๋ฑ๋ก์ ํด์ค๋ค.
- Bean ๋ฑ๋ก์ด ๋๋ฉด, ์๋์ผ๋ก ํ์ํ ์์ฑ์์ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์ฉํด์ฃผ๋ฉฐ ์ฑ๊ธํค์ผ๋ก ์คํ๋ง ์ปจํ
์ด๋์ ์ธ์คํด์ค๊ฐ ์กด์ฌํ๊ฒ ๋๋ค.
- ์คํ๋ง ์ปจํ
์ด๋์ ์ธ์คํด์ค๋ฅผ ์ป์ด Bean์ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋ค.
- ์ด๋
ธํ
์ด์
์ ์ ์ฉํด ์ฃผ๋ ๊ฒ ๋ง์ผ๋ก ์ถ๊ฐ์ ์ธ ์ธ์คํด์ค๋ฅผ new ํค์๋๋ฅผ ํตํด ๋ง๋ค ํ์ ์์ด ์์กด์ฑ ์ฃผ์
๊น์ง ์คํ๋ง์์ ํด๊ฒฐ ํด ์ค๋ค.
- ์ ์ฝ๋์์ ๋์ฑ ๋์๊ฐ ์คํ๋ง์ ์ด๋
ธํ
์ด์
์ผ๋ก Bean ๋ฑ๋ก์ด ํ์ํ ํด๋์ค์ ์ง์ Bean ์ค์ ์ ํ ์ ์์ผ๋ฉฐ, ์์ฑ์ ๊น์ง ์๋์ผ๋ก ์ฐพ์์ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์๋ค.
- ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํด Bean๊ณผ ์คํ๋ง ์ปจํ
์ด๋์ ๊ฐ๋
์ ์กฐ๊ธ๋ ์ฌํ์ ์ผ๋ก ๊ณต๋ถํ ํ์๊ฐ ์๋ค.