๐Ÿ˜ DIP ์ •๋ฆฌ

๊น€์„ฑ๊ธธยท2023๋…„ 4์›” 13์ผ
2

๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„

๋ชฉ๋ก ๋ณด๊ธฐ
6/7

DDD ์ฑ…์„ ์ฝ๋‹ค๊ฐ€ DIP์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋‚˜์™€ ์ •๋ฆฌํ•ด๋ณผ๋ ค๊ณ  ํ•œ๋‹ค.

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๊ฐ€ ๋‹ค ์ ์šฉ๋˜๋Š”๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ ์˜ํ•˜์ž

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 4์›” 22์ผ

์™€ ํ•œ ๋ฒˆ์— ์ดํ•ด๋์–ด์š”!!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ