DDD ์ฑ ์ ์ฝ๋ค๊ฐ DIP์ ๋ํ ๋ด์ฉ์ด ๋์ ์ ๋ฆฌํด๋ณผ๋ ค๊ณ ํ๋ค.
Dependency Inversion Principle์ ์ค์๋ง๋ก ์์กด ์ญ์ ์์น์ด๋ผ๋ ๋ป์ด๋ค.
์ด ์์น์ ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํ๊ฒ ์๋๋ผ ์ ์์ค ๋ชจ๋์ด ๊ณ ์์ค ๋ชจ๋์ ์์กด ํ๊ฒ ํ๋ ์์น์ด๋ค.
๊ณ ์์ค ๋ชจ๋: ์ด๋ค ์๋ฏธ ์๋ ๋จ์ผ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ชจ๋
์ ์์ค ๋ชจ๋: ๊ณ ์์ค ๋ชจ๋์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์ ํ์ํ ๊ธฐ๋ฅ์ ๊ตฌํ
๋ฐ๋ก ๊ฐ์ฒด๊ฐ ์์กด์ฑ์ด ๋์์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํด๋๊ฐ๊ฒ ๋๋ฉด ์ ์์ค ๋ชจ๋์ ๊ต์ฒดํด์ผํ ์ํฉ์ด ์ ์ ์์ค ๋ชจ๋์ ๋ณ๊ฒฝ ํ๋๋ฐ ๊ณ ์์ค ๋ชจ๋๊น์ง ๊ตฌํ์ ๋ฐ๊ฟ์ผ ํ ์ํฉ์ด ์ค๊ธฐ ๋๋ฌธ์ด๋ค.
@Service
class SendMoneyService(
private val samsungPayService: SamsungPayService
) {
fun execute(account: String) {
samsungPayService.execute(account, "korea")
}
}
์์ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด (๋๋ฝ๊ฒ ๋ชป์ป๋ค..) SendMoneyService ๊ณ ์์ค ๋ชจ๋์ด SamsungPayService
์ ์์ค ๋ชจ๋ ํด๋์ค์ ์์กดํ๊ณ ์๋ค.
์ด๋ ํ์๊ฐ ์์์ ๋งํ ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํ๊ณ ์๋๊ฒ์ด๋ค.
SamsungPayService
๋ฅผ KakaoPayService
๋ก ๋ฐ๊ฟ๋ณด์. ๊ทธ๋ ๊ฒ ๋๋ค๋ฉด SendPayService
์ ์ฝ๋๋ฅผ ๋ชจ๋ ์์ ํด์ผํ ์ํฉ์ด ์๊ธฐ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๊ฐ์ฒด์ ์ ์ฐ์ฑ๋ ๋จ์ด์ง ๋ฟ๋ง ์๋๋ผ SRP๋ ์๋ฐํ๊ฒ ๋๋๊ฒ์ด๋ค.
์์์ ๋ฐ์ํ ์ํฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ์ถ์ํ ํ๋ฉด ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
@Service
class SendMoneyService(
private val payService: PayService
) {
fun execute(account: String) {
payService.execute(account, "korea")
}
}
interface PayService {
fun execute(account: String, world: String)
}
@Service
class PayServiceImpl(
private val samsungPay: SamsungPay
): PayService {
fun execute(account: String, world: String) {
~~~ ์ด์ฉ๊ณ ์ ์ฉ๊ณ
}
}
์ด๋ ๊ฒ ๋๋ฉด PayService
์ธํฐํ์ด์ค๋ ์๋ฏธ ์๋ ๋จ์ผ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ณ ์์ค ๋ชจ๋์ด ๋๋ค. SendMoneyService(๊ณ ์์ค)
์ด PayService(๊ณ ์์ค)
์ ์์กดํ๊ณ , PayServiceImpl(์ ์์ค)
์ด PayService(๊ณ ์์ค)
์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด DIP ์์น์ ์ ์ฉํ ์ ์๋ค!
๋ฟ๋ง ์๋๋ผ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ชจํนํด์ ๋จ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ ํธ๋ฆฌํด์ง๋ค
์ธํฐํ์ด์ค๋ฅผ ์ฐ๋ฉด ๋ค DIP๊ฐ ์ ์ฉ ๋๋๊ฑด ์๋๋ค.
@Service
class SendMoneyService(
private val samsungPayService: SamsungPayService
) {
fun execute(account: String) {
samsungPayService.execute(account, "korea")
}
}
interface SamsungPayService {
fun execute(account: String, world: String)
}
@Service
class SamsungPayServiceImpl(
private val samsungPay: SamsungPay
): SamsungPayService {
fun execute(account: String, world: String) {
~~~ ์ด์ฉ๊ณ ์ ์ฉ๊ณ
}
}
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์์ง๋ง SendMoneyService๊ฐ SamsungPayService๋ฅผ ์์กดํ๊ณ ์๋ค. ์ฆ ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ฅฐ ๋ชจ๋์ ์์กดํ๊ณ ์๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์ธํฐํ์ด์ค๋ฅผ ์ฐ๋ฉด DIP๊ฐ ๋ค ์ ์ฉ๋๋๊ฒ์ ์๋๋ค. ์ด๋ฅผ ์ ์ํ์
์ ํ ๋ฒ์ ์ดํด๋์ด์!!