์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ํ๋ IT&E
- tcp
- reflection
- uri
- ์ฑ์ฉํ์ ํ
- ์ด๋ ธํ ์ด์
- Kotlin
- fontstyle
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
- di
- Dialog
- Android Studio
- Python
- IOC
- FACTORY
- OOP
- menutab
- URN
- Factory Method Pattern
- AndroidStudio
- udp
- ๊ธฐ์ด100์
- swagger
- 2024-08-20
- 2024-08-21
- datepicker
- ์ฝ๋์
- http method
- url
- OpenAPI
dingdong coding
์ ์ด์ ์ญ์ ๊ณผ ์์กด์ฑ ์ฃผ์ ( Inversion of Control, Dependency Injection ) ๋ณธ๋ฌธ
์ ์ด์ ์ญ์ ๊ณผ ์์กด์ฑ ์ฃผ์ ( Inversion of Control, Dependency Injection )
๐ถ ๊ฐ๋ฐ๊ฐ๋ฐ ๐พ 2022. 1. 26. 05:59์ผ๋ฐ์ ์ธ ์๋ฐ ํ๋ก๊ทธ๋จ์์๋ ๊ฐ ๊ฐ์ฒด๋ค์ด ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๊ฒฐ์ ํ๊ณ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑ ๋ฐ ์กฐ์ํ๋ ์์ ์ ํ์ต๋๋ค. ( ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ฌ ๋ฉ์๋ ํธ์ถ ) ์ฆ, ๋ชจ๋ ์์ ์ ์ฌ์ฉ์๊ฐ ์ ์ดํ๋ ๊ตฌ์กฐ์ ๋๋ค.
ํ์ง๋ง ์ ์ด์ ์ญ์ ์ด ์ ์ฉ๋ ๊ฒฝ์ฐ, ๊ฐ์ฒด์ ์์ฑ์ ํน๋ณํ ๊ด๋ฆฌ ์์ ์ฃผ์ฒด์๊ฒ ๋งก๊น๋๋ค.
1. ์ ์ด์ ์ญ์ ( Ioc, Inversion of Control )
: ์ ์ด์ ์ญ์ ์ด๋, ๋ง ๊ทธ๋๋ก '์ญ์ผ๋ก ์ ์ดํ๋ ๊ฒ'์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ๋๊ฐ ์ด๋ค ๊ฒ์ ์ ์ดํ๋์ง ์์๋ด ์๋ค.
๊ธฐ์กด = ๊ตฌํ ๊ฐ์ฒด ์ค์ค๋ก, ๊ฐ๋ฐ์๊ฐ
์ญ์ ๋ ์ฃผ์ฒด = ์ธ๋ถ ์กฐ๋ฆฝ๊ธฐ (assembler)
+ Spring FrameWork์์๋ Ioc Container
๋ฌด์์ ์ ์ด = ๊ตฌํ ๊ฐ์ฒด์ ์์ฑ ๋ฐ ์ฐ๊ฒฐ, ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ, ์ ์ด ํ๋ฆ์ ๋ํ ๊ถํ
๊ธฐ์กด์๋ ๊ตฌํ๊ฐ์ฒด ์ค์ค๋ก ๊ฐ์ฒด์ ์์ฑ ๋ฐ ์คํ, ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ, ์ ์ด ๋ฑ์ ์ฃผ์ฒด๊ฐ ๋์์ต๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ , ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ปจํธ๋กค ํ๋ ์ฃผ์ฒด๋ ๋ค๋ฅธ ์ฃผ์ฒด๊ฐ ๋ฉ๋๋ค. ์ฆ, ์ด์ ๋ ์ธ๋ถ ์กฐ๋ฆฝ๊ธฐ๊ฐ ( Ioc Container ) ํด๋น ์ ์ด๊ถ์ ๊ฐ์ ธ์ ๊ด๋ฆฌํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด์ฒ๋ผ ์ฌ์ฉ์์ ์ ์ด๊ถ์ ๋ค๋ฅธ ์ฃผ์ฒด์ ๋๊ธฐ๋, ์์กด๊ด๊ณ์ ๋ฐฉํฅ์ด ๋ฌ๋ผ์ง๊ฒ ๋๋ ๊ฒ์ ์ ์ด์ ์ญ์ ( Inversion of Control )์ด๋ผ ๋ถ๋ฆ ๋๋ค,
๋ชจ๋ฐ์ผ ๊ฒฐ์ ์์คํ ์ผ๋ก ์๋ฅผ ๋ค์ด๋ณด์.
PaymentImpl์ด๋ผ๋ ๊ฒฐ์ ์๋น์ค๊ฐ ์๋ค. ํด๋น ๊ฒฐ์ ์๋น์ค๋ MobilePay interface์๋ง ์์กดํ๊ณ ์๋ค. ์๋ํ๋ฉด PaymentSystem์ด ์ง์ ๊ฒฐ์ ์๋น์ค์ ํ์ํ ๊ตฌํ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฑํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ค๋ค.
๋ํ ์ด๋ค ๊ฒฐ์ ์์คํ ์ ์ฌ์ฉํ ์ง๋ ๊ฒฐ์ ํด์ค๋ค. (์์ ๊ทธ๋ฆผ์์๋ KaKaoPay)
- ์ด์ฒ๋ผ ์ ์ด์ ์ญ์ ์ ์ฌ์ฉํ๋ฉด DIP ์์กด ๊ด๊ณ ์ญ์ ์์น๋ ๋ง์กฑํ ์ ์๊ฒ ๋๋ค.
- ๊ตฌํ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ DIP๋ฅผ ์๋ฐํ๊ฒ ๋๋ฏ๋ก ์ข์ ์ค๊ณ๊ฐ ์๋๊ธฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ญํ ์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
- ์ด๋ก์จ ๊ตฌํํด๋์ค, ๊ตฌํ ๊ฐ์ฒด๋ ์์ ์ ๋ก์ง์ ์คํํ๋ ์ญํ ๋ง์ ๋ด๋นํ ์ ์๊ฒ ๋ฉ๋๋ค.
Spring์ ์ธ๋ถ ์กฐ๋ฆฝ๊ธฐ๊ฐ ์ธํฐํ์ด์ค์๋ง ์์กดํ ์ ์๋๋ก ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๊ณ ์ฃผ์ ํด์ฃผ๋ฏ๋ก DIP ์์กด๊ด๊ณ ์ญ์ ์์น์ ๋ง์กฑํ ์ ์๋ค.
SOLID DIP ์์กด ๊ด๊ณ ์ญ์ ์์น
2022.01.24 - [Spring/OOP] - [ Object-Oriented Programming ] ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
2. ์์กด์ฑ ์ฃผ์ DI(Dependency Injection)
์์กด์ฑ ์ฃผ์ ์ด๋ ๋ง ๊ทธ๋๋ก ํด๋์ค ์ธ๋ถ์์ ์์กด๋๋ ๊ฒ์ ๋์๊ฐ์ฒด์ ์ธ์คํด์ค ๋ณ์์ ์ฃผ์ ํ๋ ๊ธฐ์ ์ด๋ค.
์ด๋ ๋์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ธ๋ถ์์ ๋์ ๊ฐ์ฒด์ ์ธ๋ถ ์์กด ๊ฐ์ฒด๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
- ์ ์ธ์, ์ฑํ์ JAVA ๊ฐ์ฒด ์งํฅ ๋์์ธ ํจํด, ํ๋น๋ฏธ๋์ด p122
= ์ ํ๋ฆฌ์ผ์ด์ ๋ฐํ์์์ ์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ๋๋ ๊ฒ
์ฆ, ๋ฐํ์ ์ ์ธ๋ถ์์ ์ค์ ๋์์ ํ์ํ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ ํด๋ผ์ด์ธํธ์์ ์ด๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ด ๋ ์์กด ๊ด๊ณ๋ ์ ์ ํด๋์ค ์์กด๊ด๊ณ, ๋์ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ๋ฅผ ๋ถ๋ฆฌํด์ ์๊ฐํด์ผ ํ๋ค.
• ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ : ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋. import๋ก ์์กด๊ด๊ณ ํ์ ๊ฐ๋ฅํ ๊ด๊ณ
• ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ : ๋ฐํ์ ์์ ์ ์ค์ ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋ ๊ด๊ณ
๋ฐ๋ผ์ ์์กด์ฑ ์ฃผ์ ์ ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ ์ฝ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ฉฐ ํด๋ผ์ด์ธํธ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ๋ ๋์์ ํ์ ์ธ์คํด์ค ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๋ชจ๋ฐ์ผ ๊ฒฐ์ ์์คํ ์ผ๋ก ์๋ฅผ ๋ค์ด๋ณด์
ํ์ฌ Client class์์๋ MobliePay ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ฝ๋๊ฐ ์ง์ฌ์ ธ ์๋ค.
public class Client{
private MobliePay mobliePay;
public void setPayment(MobliePay mobliePay){
this.mobliePay = mobliePay;
}
public void payment(){
System.out.println(mobliePay.toString());
}
}
Client class์์ setPayment ๋ฉ์๋๋ก ๊ฒฐ์ ์๋จ์ ๋ณ๊ฒฝํ ์ ์๋ค. KaKaoPay ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
public class KaKaoPay implements MobliePay {
public String toString(){
return "KaKaoPay";
}
}
public class Main {
public static void main(String[] args){
MobliePay m = new KaKaoPay();
Client c = new Client();
c.setPayment(m);
c.payment(); // KaKaoPay
}
}
๋ง์ฝ ๋ค๋ฅธ ๊ฒฐ์ ์๋จ์ ์ด์ฉํ๊ณ ์ถ๋ค๋ฉด ์คํ ํด๋์ค์ธ Main์์ NaverPay ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
์ด ๋ Client๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
public class NaverPay implements MobliePay {
public String toString(){
return "NaverPay";
}
}
public class Main {
public static void main(String[] args){
MobliePay m = new NaverPay(); //๊ฐ์ฒด ๋ณ๊ฒฝ
Client c = new Client();
c.setPayment(m);
c.payment(); // NaverPay
}
}
์ฐธ์กฐ - ์ ์ธ์, ์ฑํ์ JAVA ๊ฐ์ฒด ์งํฅ ๋์์ธ ํจํด, ํ๋น๋ฏธ๋์ด p123
์ด๋ฅผ ํตํด ์ ์ ์๋ ์์กด์ฑ ์ฃผ์ ์ ์ฅ์ ์ ์ ๋ฆฌํด๋ณด์.
์์กด์ฑ ์ฃผ์ ์ฅ์
- ๊ฐ๋ ์ฑ๊ณผ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด ํฅ์๋๋ค.
- ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค.
- ์ฝ๋๊ฐ ์ ์ฐํด์ง๊ณ ๋ณ๊ฒฝ์ด ์ฌ์์ง๋ค.
- ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ์ ์ด๋ค์ง๋ค.
Spring์์ ์์กด์ฑ ์ฃผ์
Spring Dependency Injection์ด๋, ๊ฐ ๊ฐ์ฒด ๊ฐ ์์กด ๊ด๊ณ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ฐ๋ฐ์๊ฐ ์ ์ํ Bean ๋ฑ๋ก ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๋ ์ฃผ์ ํด์ฃผ๋ ๊ธฐ๋ฅ
์ผ๋ฐ์ ์ธ ๋ค์ํ ๊ธฐ์กด ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ๋ณด๋ฉด, Controller์์ Service๋ Repository ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ ์, new ํค์๋๋ฅผ ํตํด ์ปจํธ๋กค๋ฌ์์ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ฌ ์ฌ์ฉํ์ง ์๊ณ ์์กด์ฑ ์ฃผ์ ์ ํตํด ์คํ๋ง ์ปจํ ์ด๋์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
@Component, @Service, @Repository, @Controller ๋ฑ์ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ค์ ์คํ๋ง ์คํ ์ ์ค์บ์ ํตํด ๊ฐ๋ฐ์๊ฐ ์ ์ํ ์์กด์ฑ ์ ๋ณด๋ฅผ ์๋์ผ๋ก bean ์ค์ ์ ๋ณด์ ๋ฑ๋ก์ ํ๊ฒ ๋์ด ์์กด์ฑ ์ฃผ์ ์ด ๋์ํ๊ฒ ํฉ๋๋ค.
๋ํ Spring์ DI(Dependencies Injection)์ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด์ฝ๋๋ฅผ ์ ํ์๋์ง ์๊ณ ์ค์ ๋ง์ผ๋ก ๊ตฌํํด๋์ค๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ex) Jdbc
์์กด์ฑ ์ฃผ์ 3๊ฐ์ง ๋ฐฉ๋ฒ
1 ) setter ์ฃผ์
• ์์กด์ฑ์ ์ ๋ ฅ๋ฐ๋ Setter ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์
• setter๋ผ ๋ถ๋ฆฌ๋ ํ๋์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์์ ์ ๋ฉ์๋๋ฅผ ํตํด์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ
• ์ ํ, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด๊ด๊ณ์์ ์ฌ์ฉ
@Controller
public class TestController {
private TestService testService;
@Autowired
public void setTestService(TestService testService) {
this.testService = testService;
}
}
2 ) ํ๋ ์ฃผ์
• ๋ณ์ ์ ์ธ๋ถ์ @Autowired ์ ๋ ธํ ์ด์ ์ ๋ถ์
• ์ด๋ฆ ๊ทธ๋๋ก ํ๋์ ๋ฐ๋ก ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ
• ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ์ง๋ง ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํด์ ํ ์คํธํ๊ธฐ ํ๋ค๋ค๋ ๋จ์ ์ด ์กด์ฌ
• DI ํ๋ ์ ์ํฌ๊ฐ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ ์ ์๋ค.
• ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
@Controller
public class TestController {
@Autowired
TestService testService;
}
3 ) ์์ฑ์ ์ฃผ์
• ํ์ํ ์์กด์ฑ์ ํฌํจํ๋ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์
• ์์กด๊ด๊ณ๊ฐ ์คํ ์ค ๋์ ์ผ๋ก ๋ณํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ผ๋ฏ๋ก ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅ
• ์์ฑ์ ํธ์ถ ์์ ์ ๋ฑ 1๋ฒ๋ง ํธ์ถ๋๋ ๊ฒ์ด ๋ณด์ฅ
• ๋ถ๋ณ, ํ์ ์์กด๊ด๊ณ์ ์ฌ์ฉ
@Controller
public class TestController {
// final ํค์๋๋ฅผ ํตํด ์์ฑ์์ ๊ฐ์ด ์ค์ ๋์ง ์๋ ์ค๋ฅ๋ฅผ ์ปดํ์ผ ์์ ์ ๋ง์์ค๋ค.
private final TestService testService;
@Autowired // ์์ฑ์๊ฐ 1๊ฐ๋ง ์์ ๊ฒฝ์ฐ ์๋ต ๊ฐ๋ฅ
public TestController(TestService testService) {
this.testService = testService;
}
}
Spring Framework๋ ์์กด์ฑ ์ฃผ์ ์ "์์ฑ์ ์ฃผ์ ๋ฐฉ๋ฒ"์ ๊ถ์ฅํฉ๋๋ค.
์ด์
: ๋๋ถ๋ถ ์์กด๊ด๊ณ ์ฃผ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ์์ ๊ฐ์ง ๋ณ๊ฒฝํ ์ผ์ด ์์ผ๋ฉฐ ๋ถ๋ณํด์ผํฉ๋๋ค.
: setter๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด setxx ๋ฉ์๋๋ฅผ public์ผ๋ก ์ด์ด๋์ด์ผ ํ๋๋ฐ ์ด๋ ๋๊ตฐ๊ฐ ์ค์๋ก ๋ณ๊ฒฝํ ์๋ ์๊ณ , ๋ณ๊ฒฝํ๋ฉด ์๋๋ ๋ฉ์๋๋ฅผ ์ด์ด๋๋ ๊ฒ์ ์ข์ ์ค๊ณ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
: ์์ฑ์ ์ฃผ์ ์ ์ ์ธํ ๋๋จธ์ง ์ฃผ์ ๋ฐฉ์์ ๋ชจ๋ ์์ฑ์ ์ดํ์ ํธ์ถ๋๋ฏ๋ก ํ๋์ final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
'๐Spring > Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JDBC vs JDBC Template vs JPA (0) | 2022.06.18 |
---|---|
Spring Framework, Spring Boot (0) | 2022.06.18 |
Spring Bean, Spring Container (0) | 2022.06.17 |
MVC, Spring MVC (0) | 2022.06.16 |
์ด๋ ธํ ์ด์ ์ ๋ฆฌ @ (0) | 2022.06.14 |