์ด๋ณด ์น ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ๋ง 5 ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ
์ ์ : ์ต๋ฒ๊ท
CH 3. ์คํ๋ง DI
1. ์์กด์ด๋ ?
- DI Dependency Injection ์์กด ์ฃผ์
- ๊ฐ์ฒด ๊ฐ์ ์์กด
- ์์กด์ ๋ณ๊ฒฝ์ ์ํด ์ํฅ์ ๋ฐ๋ ๊ด๊ณ๋ฅผ ์๋ฏธํ๋ค.
- ์์กดํ๋ ๋์์ด ์์ผ๋ฉด ๊ทธ ๋์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
- ์์กด ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑ ( ์ด ๋ด์ฉ์ ๊ณต๋ถํด๋ณด์ )
- DI์ ์๋น์ค ๋ก์ผ์ดํฐ
2. DI๋ฅผ ํตํ ์์กด ์ฒ๋ฆฌ
- ์์กดํ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ๋ ๋ฐฉ์์ ์ด์ฉํ๋ DI
public class MemberRegisterService {
// ์ง์ ์์กด ๊ฐ์ฒด ์์ฑ
private MemberDao memberDao = new MemberDao();
//์์ฑ์๋ฅผ ํตํด์ ์์กด ๊ฐ์ฒด๋ฅผ ์ ๋ฌ ๋ฐ๋ ํ์
private MemberDao memberDao;
public MemberRegisterService(MemberDao memberDao){
this.memberDao = memberDao;
}
...
}
- ๋ง์ฝ MemberRegisterService ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์์ฑ์์ MemberDao ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
MemberDao dao = new MemberDao();
// ์์กด ๊ฐ์ฒด๋ฅผ ์์ฑ์๋ฅผ ํตํด ์ฃผ์
ํ๋ค.
MemberRegisterService svc = new MemberRegisterService(dao);
๋ณต์กํด ๋ณด์ด๋๋ฐ ์ ์์ฑ์ ํตํด์ ์์กดํ๋ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ๊น?
-> ๋ณ๊ฒฝ์ ์ ์ฐํจ์ ์ํด์!!
3. DI์ ์์กด ๊ฐ์ฒด ๋ณ๊ฒฝ์ ์ ์ฐํจ
- ์์กด ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๋ฐฉ์ = ํ๋๋ ์์ฑ์์์ new ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๊ฐ์ฒด ์์ฑ
public class MemeberRegisterService {
private MemberDao memberDao = new MemberDao();
...
}
์ด๊ฒ๊ณผ
public class ChangePasswordService {
private MemberDao memberDao = new MemberDao();
...
}
์ด๋ ๊ฒ ๋๊ฐ์ ์ฝ๋๊ฐ ์๋ ์ํฉ.
์บ์๋ฅผ ์ด์ฉํด ์กฐํ์๋๋ฅผ ํฅ์ ์ํค๊ณ ์ ํ๋ ์ํฉ์ด ๋ฐ์...!!
memberDao -> cachedMemberDao ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํจ~!~!
public class CachedMemberDao extends MemberDao {
...
}
๊ทธ๋ ๋ค๋ฉด MemberRegisterService์ ChangePasswordService ๋ชจ๋ MemberDao์์ CachedMemberDao๋ก ๋ฐ๊ฟ์ค์ผํจ... ( ๊ฐ์ฒด ์์ฑ์๋ง๋ค ํ๋ํ๋ ๋ณ๊ฒฝ ํด์ฃผ์ด์ผ ํจ... )
๋์ผ ์ํฉ์์ DI๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ฝ๋๊ฐ ์ค์ด๋ ๋ค...!!! ( ํด๋์ค๊ฐ ์ฌ๋ฌ๊ฐ์ฌ๋ ์์กด ์ฃผ์ ๋์์ด ๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋๊ฐ ํ๊ณณ์ด๋ผ, ๊ฐ์ฒด ์์ฑ ์ฝ๋์์๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค,)
public class MemberRegisterService{
private MemberDao memberDao;
public MemberRegisterService(MemberDao memberDao){
this.memberDao = memberDao;
}
...
}
public class ChangePasswordService{
private MemberDao memberDao;
public ChangePasswordService(MemberDao memberDao){
this.memberDao = memberDao;
}
...
}
// --------------------------
// ์ ๋ค ํด๋์ค์ ๊ฐ์ฒด ์์ฑ์
// MemberDao memberDao = new MemberDao;
// ๋ง ๋ฐ๊พธ๋ฉด ๋๋ค~!~!
MemberDao memberDao = new CachedMemberDao;
MemberRegisterService regSvc = new MemberRegisterService(memberDao);
ChangePasswordService pwdSvc = new ChangePasswordService(memberDao);
4. ์์ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ
|---ํ์ ๋ฐ์ดํฐ ๊ด๋ จ ํด๋์ค
| |---Member
| |---WrongPasswordException
| |---MemberDao
|
|---ํ์ ๊ฐ์ ์ฒ๋ฆฌ ๊ด๋ จ ํด๋์ค
| |---DuplicateMemberException
| |---RegisterRequest
| |---MemberRegisterService
|
|---์ํธ ๋ณ๊ฒฝ ๊ด๋ จ ํด๋์ค
| |---MemberNotFoundException
| |---ChangePasswordService
5. ๊ฐ์ฒด ์กฐ๋ฆฝ๊ธฐ
- assembler
- ์์ DI ์ค๋ช
์ ์์ฑ์ ์ฌ์ฉํ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์ , ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ๋ ์ฝ๋ ํ ๊ณณ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค๊ณ ํ๋ค.
- ์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋๋ ์ด๋์ ์์๊น???
- main ๋ฉ์๋์ ์์กด ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด ๋์์ง ์๋ค.
- ๋ ๋์ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ฃผ๋ ํด๋์ค๋ฅผ ๋ฐ๋ก ์์ฑํ๋ ๊ฒ์ด๋ค. (์กฐ๋ฆฝ)
- ์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋๋ ์ด๋์ ์์๊น???
public class Assembler {
private MemberDao memberDao;
private MemberRegisterService memberRegisterService;
private ChangePasswordService changePasswordService;
// MemberRegisterService์ ChangePasswordService ๊ฐ์ฒด์ ๋ํ ์์กด์ ์ฃผ์
ํ๋ค.
// MemberRegisterService์ memberDao ๊ฐ์ฒด๋ฅผ ์ฃผ์
๋ฐ๊ณ ,
// ChangePasswordService๋ setter๋ฅผ ํตํด ์ฃผ์
๋ฐ๋๋ค.
public Assembler(){
memberDao = new MemberDao();
// memberDao = new CachedMemberDao();
regSvc = new MemberRegisterService(memberDao);
pwdSvc = new ChangePasswordService();
pwdSvc.setMemberDao(memberDao);
}
...
}
์์ ๊ฐ์ด ์์ฑํ Assembler๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋...??
-> Assembler ๊ฐ์ฒด๋ฅผ ์์ฑ - get ๋ฉ์๋๋ฅผ ์ด์ฉํด ํ์ํ ๊ฐ์ฒด๋ฅผ ๊ตฌํจ - ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ
Assembler assembler = new Assembler();
ChangePasswordService changePwdSvc = assembler.getChangePasswordService();
changePwdSvc.changePassword("์ด๋ฉ์ผ","๋น๋ฒ","newpwd");
- Assembler ํด๋์ค์ ์์ฑ์์์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์กด์ ์ฃผ์ ํ๋ค.
- ๋ฐ๋ผ์ Assembler ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์ ์ฌ์ฉํ ๊ฐ์ฒด๊ฐ ๋ชจ๋ ์์ฑ๋๋ค.
- ๊ทธ ํ Assembler๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํ์ํ ๊ฐ์ฒด๋ฅผ ๊ตฌํ๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํ์ ํจํด์ด๋ค!
6. ์คํ๋ง์ DI ์ค์
- ์คํ๋ง์ MemberRegisterService์ MemberDao์ ๊ฐ์ ํน์ ํ์ ์ ํด๋์ค๋ง ์์ฑํ Assembler์ ๋ฌ๋ฆฌ ๋ฒ์ฉ ์กฐ๋ฆฝ๊ธฐ ์ญํ ์ ํ๋ค....!!!
- ์คํ๋ง์ ์ฌ์ฉํ๋ ค๋ฉด ์ฐ์ ์คํ๋ง์ด ์ด๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์์กด์ ์ด๋ป๊ฒ ์ฃผ์ ํ ์ง ์ ์ํ ์ค์ ์ ๋ณด ์์ฑ ํ์
- ์ค์ ์ฝ๋๋ ์ฃผ๋ก config ํจํค์ง~
// ์คํ๋ง ์ค์ ํด๋์ค๋ฅผ ์๋ฏธํ๋ ์๋
ธํ
์ด์
@Configuration
public Class AppCtx{
// ํด๋น ๋ฉ์๋๊ฐ ์์ฑํ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ด๋ผ๊ณ ์ค์ ํ๋ ์๋
ธํ
์ด์
// memberDao ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์์ฑํ ๋น ๊ฐ์ฒด๋ "memberDao"๋ ์ด๋ฆ์ผ๋ก ์คํ๋ง์ ๋ฑ๋ก
@Bean
public MemberDao memberDao(){
return new MemberDao();
}
@Bean
// MemberRegisterService ์์ฑ์๋ฅผ ํธ์ถํ ๋
// memberDao()๋ฉ์๋๋ฅผ ํธ์ถํ๋ฏ๋ก memberDao()๊ฐ ์์ฑํ ๊ฐ์ฒด๋ฅผ
// MemberRegisterService ์์ฑ์๋ฅผ ํตํด ์ฃผ์
public MemberRegisterService memberRegSvc(){
return new MemberRegisterService(memberDao);
}
@Bean
public ChangePasswordService changePwdSvc(){
ChangePasswordService pwdSvc = new ChangePasswordService();
// setMemberDao() ๋ฉ์๋๋ฅผ ์ด์ฉํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํ๋ค
pwdSvc.setMemberDao(memberDao());
return pwdSvc;
}
- ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค๊ณ ๋์ด ์๋๋ค!!!!!!!
- ์ปจํ ์ด๋๋ฅผ ์์ฑํด์ผํ๋ค. ( ์ปจํ ์ด๋ : ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ์ญํ )
-
// ์ปจํ ์ด๋ ์์ฑ ApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class); // ์ปจํ ์ด๋ ์์ฑ ํ getBean() ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ๊ตฌํ ์ ์๋ค. // ์ปจํ ์ด๋์์ ์ด๋ฆ์ด memberRegSvc์ธ ๋น ๊ฐ์ฒด๋ฅผ ๊ตฌํ๋ค. MemberRegisterService regSvc = ctx.getBean("memberRegSvc", MemberRegisterService.class);
DI ๋ฐฉ์ 1 : ์์ฑ์ ๋ฐฉ์
- ์์ฑ์๋ฅผ ํตํด ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ ํ๋(this.memberDao)์ ํ ๋นํ๋ค
private MemberDao memberDao;
// ์์ฑ์๋ฅผ ํตํด ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์
๋ฐ์
public MemberRegisterService(MemberDao memberDao){
// ์ฃผ์
๋ฐ์ ๊ฐ์ฒด๋ฅผ ํ๋์ ํ ๋น
this.memberDao = memberDao;
}
public Long regist(RegisterRequest req){
// ์ฃผ์
๋ฐ์ ์์กด ๊ฐ์ฒด์ ๋ฉ์๋ ์ฌ์ฉ
Member member = memberDao.selectByEmail(req.getEmail());
...
memberDao.insert(newMember);
...
}
- ์์ฑ์์ ์ํด ์ ๋ฌํ ์์กด ๊ฐ์ฒด๊ฐ ๋ ๊ฐ ์ด์์ด์ด๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฃผ์ ํ๋ฉด ๋๋ค.
// ์์ฑ์ ํ๋ผ๋ฏธํฐ๊ฐ ๋๊ฐ์ธ ์์ ๋ฅผ ์ดํด๋ณด์~!
public class MemberDao{
...
public Collection<Member> selectAll(){
return map.values();
}
}
// =====================================================================
// ์์ฑ์๋ก ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌ๋ฐ๋ ํด๋์ค ์์ฑ
// MemberDao, MemberPrinter ๊ฐ์ฒด๋ฅผ ์ ๋ฌ ๋ฐ๋๋ค.
public MemberListPrinter(MemberDao memberDao, MemberPrinter printer){
this.memberDao = memberDao;
this.printer = printer;
}
// ======================================================================
7. @Configuration ์ค์ ํด๋์ค์ @Bean ์ค์ ๊ณผ ์ฑ๊ธํค
8. ๋ ๊ฐ ์ด์์ ์ค์ ํ์ผ ์ฌ์ฉํ๊ธฐ
9. getBean( ) ๋ฉ์๋ ์ฌ์ฉ
10. ์ฃผ์ ๋์ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ๋น ๊ฐ์ฒด๋ก ์ค์ ํด์ผ ํ๋?
'๐ฅ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[spring] ๋น ๋ผ์ดํ ์ฌ์ดํด๊ณผ ๋ฒ์ (0) | 2021.08.31 |
---|---|
[spring] ์ปดํฌ๋ํธ ์ค์บ์ด๋ (0) | 2021.08.31 |
[Spring] DI์ ์ธ๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2021.08.18 |
[Spring] ์์กด์ฑ ์ฃผ์ (DI)์ด๋ ? (0) | 2021.08.18 |