Spring DI๋ฅผ ์์๋ณด๊ธฐ ์ ์ DI์ ๋ํด์ ์์๋ณด๊ณ ์ ํ๋ค.
DI๋ ์์กด์ฑ ์ฃผ์ ์ด๋ผ๊ณ ํด์ ํ ์ ์๋ค.
"์์กด์ฑ ์ฃผ์ "์ ๋ถ๋ฆฌ ํด์ "์์กด์ฑ", "์ฃผ์ "์ ๋ํด์ ์์๋ณด์
์์กด์ฑ์ ์ฌ์ ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
"๋ค๋ฅธ ๊ฒ์ ์์งํ์ฌ ์ํํ๊ฑฐ๋ ์กด์ฌํ๋ ์ฑ์ง."
๊ทธ๋ ๋ค๋ฉด ์์กด์ฑ์ด ์๋ ์ฝ๋๋ "๋ค๋ฅธ ๊ฒ์ ์์งํ์ฌ ์กด์ฌํ๋ ์ฝ๋"๋ผ๊ณ ๋งํ ์ ์๋ค.
์ฌ๊ธฐ์ "๋ค๋ฅธ ๊ฒ"์ ๊ฐ์ฒด๋ฅผ ์๋ฏธ ํ๋๋ฐ ์ฝ๋๋ฅผ ํตํด์ ๋ณด์
public class SomeService {
public SomeRepository someRepository = new SomeRepository();
public SomeEntity findById(Long id) {
return someRepository.findById(id).orElseThrow(IllegalArgumentException::new);
}
...// ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค
}
SomeService ํด๋์ค๋ฅผ ๋ณด๋ฉด ๋ด๋ถ์์ SomeRepository ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ, ํ์ํ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ๋ค.
์์์ ์์กด์ฑ์ด ์๋ ์ฝ๋๋ฅผ " ๋ค๋ฅธ ๊ฒ์ ์์งํ์ฌ ์กด์ฌํ๋ ์ฝ๋ "๋ผ๊ณ ๋งํ๋๋ฐ, SomeService ์ํฉ์ ๋์
ํด๋ณด๋ฉด
" SomeRepository ๊ฐ์ฒด์ ์์กดํ์ฌ ์กด์ฌํ๋ ์ฝ๋ "๋ผ๊ณ ๋ง ํ ์ ์๋ค.
์ค์ ๋ก ์ฝ๋๋ฅผ ๋ณด๋ฉด SomeService๋ SomeRepository๊ฐ ์์ด์ผ์ง๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ "SomeService๋ SomeRepository์ ์์กดํ๋ค." ๋ผ๊ณ ๋งํ ์ ์๋ค.
์ฃผ์
์ ์ฌ์ ์ ์๋ฏธ๋ฅผ ๋ณด๋ฉด " ํ๋ฌ ๋ค์ด๊ฐ๋๋ก ๋ถ์ด ๋ฃ์. "์ด๋ผ๊ณ ๋์จ๋ค.
ํ๋ฌ ๋ค์ด๊ฐ๋๋ก ๋ถ์ด ๋ฃ๋๋ค๋ ์๋ฏธ๋ ๊ฒฐ๊ตญ ์ธ๋ถ์์ ๋ฃ๋๋ค๊ณ ์๊ฐ ํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์์กด์ฑ๊ณผ ํฉ์ณ์ ๋ง์ ํด๋ณด๋ฉด "์์กดํ๋ ๊ฐ์ฒด์ ์ธ๋ถ์์ ์์กด ๊ฐ์ฒด๋ฅผ ๋ฃ๋๋ค"๋ผ๊ณ ํด์ ํ ์ ์๋๋ฐ ๋ค์ ์ฝ๋๋ฅผ ๋ณด์
public class SomeService {
private SomeRepository someRepository;
public SomeService(SomeRepository someRepository) {
this.someRepository = someRepository;
}
public SomeEntity findById(Long id) {
return someRepository.findById(id).orElseThrow(IllegalArgumentException::new);
}
...// ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด SomeService๊ฐ ์์กดํ๋ ๊ฐ์ฒด, SomeRepository๊ฐ ์์กด ๊ฐ์ฒด ์ด๋ค.
SomeSerivce์ ํ๋์ SomeRepository๊ฐ ์๊ณ ์ด๋ฅผ ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด SomeService๊ฐ์ฒด์ ์ธ๋ถ์์ ์์กด ๊ฐ์ฒด๋ฅผ ๋ฐ๊ณ ์๋ค.
์ ๋ฆฌ ํ์๋ฉด DI(์์กด์ฑ ์ฃผ์ )์ "์์กด๊ฐ์ฒด(SomeRepository)๋ฅผ ์์กดํ๋ ๊ฐ์ฒด(SomeService)์ ๋ด๋ถ์์ ์์ฑํ๋ ๊ฒ์ด ์๋ ์ธ๋ถ์์ ์ ๋ฌ ๋ฐ๋ ๋ฐฉ์"์ ๋งํ๋ค
DI์ ์ด์ ์ ํ๊ฐ์ง ์์๋ฅผ ํตํด ์ค๋ช ํ๊ณ ์ ํ๋ค.
public class RegisterService {
private SomeDao someDao = new SomeDao();
...
}
public class PasswordService{
private SomeDao someDao = new SomeDao();
...
}
๋ค์๊ณผ ๊ฐ์ 2๊ฐ์ ํด๋์ค๊ฐ ์๊ณ ๊ทธ ์์ ์์กด ๊ฐ์ฒด๊ฐ ์๋ค๊ณ ์๊ฐํด๋ณด์ ๊ทธ๋ฐ๋ฐ SomeDao์์ ์บ์ ๊ธฐ๋ฅ์ ์ ์ฉํ SomeDao๋ฅผ ์์๋ฐ์ CachedSomeDao๊ฐ์ฒด๋ฅผ ๋ง๋ค์๊ณ , ์ด ๊ฐ์ฒด๋ฅผ ์ฐ๊ณ ์ ํ๋ค๋ฉด
public class RegisterService {
private CachedSomeDao cachedSomeDao = new CachedSomeDao();
...
}
public class PasswordService{
private CachedSomeDao cachedSomeDao = new CachedSomeDao();
...
}
์ด๋ ๊ฒ ๋ณ๊ฒฝ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ์๋ 10๊ณณ์ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด ๊ท์ฐฎ๊ณ , ๋์น๋ ๋ถ๋ถ๋ ์์๊ฒ์ด๋ค.
ํ์ง๋ง DI ๋ฐฉ์์ ์ด์ฉํ๋ค๋ฉด
SomeDao someDao = new SomeDao();
RegisterService registerService = new RegisterService(someDao)
PasswordService passwordService = new PasswordService(someDao)
์ด๋ฐ ์ํฉ์ผ๋ SomeDao๋ฅผ ์์๋ฐ์ CachedSomeDao๋ก ๋ณ๊ฒฝํ๋ค๋ฉด
SomeDao someDao = new CachedSomeDao();
RegisterService registerService = new RegisterService(someDao)
PasswordService passwordService = new PasswordService(someDao)
์ด๋ ๊ฒ ์์กด ๊ฐ์ฒด ์์ฑ๋ง ๋ณ๊ฒฝ ์์ผ ์ฃผ๋ฉด๋๋ค
์ด์ฒ๋ผ DI ๋ฐฉ์์ ์ ์ฐํ ์์กด ๊ฐ์ฒด ๋ณ๊ฒฝ์ ์ด์ ์ด ์๋ค.
DI๋ฅผ ์ค๋ช
ํ ๋ ์์กด ๊ฐ์ฒด๋ฅผ ์ธ๋ถ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ธ๋ถ์์ ์ ๋ฌํ๋ค๊ณ ์ด์ผ๊ธฐ ํ๋ค.
์ฝ๊ฒ ์๊ฐํ๋ฉด ์์กด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณณ์ main๋ฉ์๋๋ผ๊ณ ํ๋ค๋ฉด
public class Main {
public static void main(String[] args) {
SomeDao someDao = new SomeDao();
RegisterService registerService = new RegisterService(someDao);
PasswordService passwordService = new PasswordService(someDao);
...
}
}
์ด๋ฐ ํํ ์ผ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์์์ ์ค๋ช
ํ๋๊ฒ์ฒ๋ผ ์์กด ๊ฐ์ฒด๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ค๋ฉด ๋ฐ๊พธ๋ ์์
์ main๋ฉ์๋ ์์์ ์ด๋ฃจ์ด์ง๊ฒ์ด๋ค.
main๋ฉ์๋ ์์์ ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ ๋ณด๋ค ์ข ๋ ๋์ ๋ฐฉ๋ฒ์ ์์กดํ๋ ๊ฐ์ฒด์ ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์์ฑํ๋๊ฒ์ด๋ค.
์์กดํ๋ ๊ฐ์ฒด์ ์์กด๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฃผ์
ํ๊ธฐ ๋๋ฌธ์ ์กฐ๋ฆฝํ๋ค๊ณ ์๊ฐ ํ ์ ์๋๋ฐ, ์ด๋ฐ ์๋ฏธ์์ ์ด ํด๋์ค ์ด๋ฆ์ ์กฐ๋ฆฝ๊ธฐ ๋ผ๊ณ ํํํ๊ธฐ๋ ํ๋ค.
public class Assembler {
private SomeDao someDao;
private RegisterService registerService;
private PasswordService passwordService;
public Assembler() {
SomeDao someDao = new SomeDao();
RegisterService registerService = new RegisterService(someDao);
PasswordService passwordService = new PasswordService(someDao);
...
}
public SomeDao getSomeDao() {
return someDao;
}
public RegisterService getRegisterService() {
return registerService;
}
public PasswordService getPasswordService() {
return passwordService;
}
}
์ ์ฝ๋๊ฐ ์กฐ๋ฆฝ๊ธฐ ํด๋์ค๋ฅผ ๋ํ๋ธ ์ฝ๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์กฐ๋ฆฝ๊ธฐ๋ฅผ ํตํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๋ฉด
public class Main {
public static void main(String[] args) {
Assembler assembler = new Assembler();
RegisterService registerService = assembler.getRegisterService();
PasswordService passwordService = asserbler.getPasswordService();
...
}
}
์ฒ๋ผ ์ฌ์ฉ ํด์ฃผ๋ฉด๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์ ์์ ์ค SomeDao๋ฅผ ์์ ๋ฐ์ CachedSomeDao ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ค์ผํ๋ค๋ฉด
public class Assembler {
private SomeDao someDao;
private RegisterService registerService;
private PasswordService passwordService;
public Assembler() {
SomeDao someDao = new CachedSomeDao(); // ์ด๋ถ๋ถ๋ง ๋ณ๊ฒฝ
RegisterService registerService = new RegisterService(someDao);
PasswordService passwordService = new PasswordService(someDao);
...
}
public SomeDao getSomeDao() {
return someDao;
}
public RegisterService getRegisterService() {
return registerService;
}
public PasswordService getPasswordService() {
return passwordService;
}
}
์ด๋ ๊ฒ ๋ณ๊ฒฝ๋ง ํด์ฃผ๋ฉด๋๋ค.
Assembler๋ ์์ ์ด ์์ฑํ๊ณ ์กฐ๋ฆฝํ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
Assembler๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ํตํด ์ํ๋ ๊ฐ์ฒด๋ฅผ ์ป์ด ์ฌ์ฉํ๋๊ฒ์ด Assembler์ ์ ํ์ ์ธ ์ฌ์ฉ๋ฒ์ด๋ค.
์ง๊ธ ๊น์ง ์์กด, ์ฃผ์
, DI(์์กด์ฑ ์ฃผ์
), ๊ฐ์ฒด ์กฐ๋ฆฝ๊ธฐ ์ ๋ํด์ ์์๋ดค๋ค.
์ด๋ ๊ฒ ์ค๋ช
ํ ์ด์ ๋ ์คํ๋ง์ด DI๋ฅผ ์ง์ํ๋ ์กฐ๋ฆฝ๊ธฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ ๋ก ์คํ๋ง์ ์์์ ๊ตฌํํ ์กฐ๋ฆฝ๊ธฐ์ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Assembler ํด๋์ค์ ์์ฑ์ ์ฝ๋ ์ฒ๋ผ ํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์ฑํ ๊ฐ์ฒด์ ์์กด์ ์ฃผ์
ํ๋ค.
์คํ๋ง๊ณผ Assembler์ ์ฐจ์ด์ ์ Assembler๋ฅผ ๊ตฌํํ์๋๋ ํน์ ํ์
์ ํด๋์ค๋ง ์์ฑํ์ง๋ง ์คํ๋ง์ ๊ฒฝ์ฐ ๋ฒ์ฉ ์กฐ๋ฆฝ๊ธฐ ๋ผ๋ ์ฐจ์ด์ ์ด ์๋ค.
๋ค์๊ธ์๋ Spring DI ์ค์ ์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
์ด๋ณด ์น ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ๋ง5 ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ - ์ต๋ฒ๊ท ์