DIP
DIP(Dependency Inversion Principle)๋ SOLID ์์น ์ค ํ๋๋ก, ์์กด ๊ด๊ณ๋ฅผ ์ญ์ ์ํค๋ ์์น
์ด ์์น์ ๊ณ ์์ค ๋ชจ๋์ ์ ์์ค ๋ชจ๋์ ์์กดํด์๋ ์ ๋๋ฉฐ, ๋ ๋ชจ๋ ์ถ์ํ์ ์์กดํด์ผ ํ๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
์ถ์ํ๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์์กดํด์๋ ์ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์์คํ
์ด ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถ ์ ์์ต๋๋ค.
์์
```java
public class LightBulb {
public void turnOn() {
// ์ ๊ตฌ๋ฅผ ์ผ๋ ๋์
}
}
public class Switch {
private LightBulb bulb;
public Switch() {
this.bulb = new LightBulb();
}
public void operate() {
bulb.turnOn();
}
}
```
์์ ์ฝ๋์์ `Switch` ํด๋์ค๋ `LightBulb` ํด๋์ค์ ์ง์ ์์กดํ๊ณ ์์ต๋๋ค.
์ด๋ DIP๋ฅผ ์๋ฐํ ๊ฒ์
๋๋ค. ๋์ ์ ์ถ์ํ๋ฅผ ํตํด ์์กด์ฑ์ ์ญ์ ์ํฌ ์ ์์ต๋๋ค.
```java
public interface Switchable {
void turnOn();
}
public class LightBulb implements Switchable {
@Override
public void turnOn() {
// ์ ๊ตฌ๋ฅผ ์ผ๋ ๋์
}
}
public class Switch {
private Switchable device;
public Switch(Switchable device) {
this.device = device;
}
public void operate() {
device.turnOn();
}
}
```
์ด์ `Switch` ํด๋์ค๋ `Switchable` ์ธํฐํ์ด์ค์ ์์กดํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด `Switch` ํด๋์ค๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ด ์๋ ์ถ์ํ์ ์์กดํ๋ฏ๋ก, ์์คํ
์ด ๋ ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํด์ง๋๋ค.
=> ์๋ก์ด ๋๋ฐ์ด์ค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๋๋ฐ์ด์ค๋ฅผ ๋ณ๊ฒฝํด๋ `Switch` ํด๋์ค๋ ์์ ํ ํ์๊ฐ ์์ด์ง๋๋ค.
DIP๋ฅผ ์งํค๋ฉด์ ์์กด์ฑ์ ์ฃผ์
ํ๋ ๊ฒ์ด IoC (Inversion of Control) ์๋ฆฌ์๋ ๊ด๋ จ์ด ์์ต๋๋ค. ์คํ๋ง ํ๋ ์์ํฌ์์์ `@Autowired`๋ ์์ฑ์ ์ฃผ์
์ ์ด๋ฌํ ์์น์ ๋ฐ๋ฅด๋ฉฐ, ์์กด์ฑ ์ฃผ์
์ ํตํด ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ฐ์ฑ์ ๋์
๋๋ค.
์์กด์ฑ์ ์ญ์ ์ํค๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
์๋ ์์๋ Java์ Spring ํ๋ ์์ํฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ช ๋ฉ๋๋ค.
### 1. ์ธํฐํ์ด์ค๋ฅผ ํ์ฉ:
๊ตฌ์ฒด์ ์ธ ํด๋์ค ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ํ๋ฅผ ๋์
ํฉ๋๋ค.
```java
public interface Switchable {
void turnOn();
}
public class LightBulb implements Switchable {
@Override
public void turnOn() {
// ์ ๊ตฌ๋ฅผ ์ผ๋ ๋์
}
}
public class Fan implements Switchable {
@Override
public void turnOn() {
// ์ ํ๊ธฐ๋ฅผ ์ผ๋ ๋์
}
}
```
### 2. ์ถ์ํ๋ฅผ ์ฌ์ฉ:
๊ตฌ์ฒด์ ์ธ ํด๋์ค ๋์ ์ถ์ํ๋ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ์์กดํฉ๋๋ค.
```java
public class Switch {
private Switchable device;
public Switch(Switchable device) {
this.device = device;
}
public void operate() {
device.turnOn();
}
}
```
### 3. ์์กด์ฑ ์ฃผ์
(Dependency Injection) ํ์ฉ:
์์กดํ๋ ๊ฐ์ฒด๋ฅผ ์ธ๋ถ์์ ์ฃผ์
๋ฐ๋๋ก ์ค๊ณํฉ๋๋ค. Spring์์๋ ์ฃผ๋ก ์์ฑ์ ์ฃผ์
์ ์ฌ์ฉํฉ๋๋ค.
```java
@Configuration
public class AppConfig {
@Bean
public Switchable lightBulb() {
return new LightBulb();
}
@Bean
public Switchable fan() {
return new Fan();
}
@Bean
public Switch switchForLightBulb(@Qualifier("lightBulb") Switchable device) {
return new Switch(device);
}
@Bean
public Switch switchForFan(@Qualifier("fan") Switchable device) {
return new Switch(device);
}
}
```
์์ ์์ ์์ `Switch` ํด๋์ค๋ `Switchable` ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ `Switchable`์ ๊ตฌํํ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ ์ธ๋ถ์์ ์ฃผ์
๋ฐ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ฉฐ, DIP๋ฅผ ์งํค๊ฒ ๋ฉ๋๋ค.
Spring์ `@Autowired` ์ด๋
ธํ
์ด์
์ ํตํด ์์กด์ฑ์ ์ฃผ์
ํ ๋์๋ ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค. ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค์ ์์กดํ๋ฉด ๊ตฌํ์ ๊ต์ฒดํ๊ฑฐ๋ ์ถ๊ฐํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
'TIL > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring , RequestParam๊ณผ PathVariable ๊ตฌ๋ถ (1) | 2024.01.12 |
---|---|
java ์๋ฃ๊ตฌ์กฐ (1) | 2024.01.04 |
java ๊ธฐ๋ณธํ ๋ฐ์ดํฐ ํ์ , ์ฐธ์กฐํ ๋ฐ์ดํฐ ํ์ (0) | 2023.12.15 |
java BufferedReader๋ฅผ ์ด์ฉํ ์ฌ์น์ฐ์ฐ ๋ง๋ค๊ธฐ (0) | 2023.12.07 |
java StringTokenizer ๋ฌธ์์ด ๋ถ๋ฆฌํ๊ธฐ (0) | 2023.12.01 |