DI (Dependency Injection)
๐ฅ๏ธ DI(Dependency Injection)์ด๋?
์ํํธ์จ์ด ๊ณตํ์์ ๊ฐ์ฒด ๋๋ ํจ์๊ฐ ๋ด๋ถ์ ์ผ๋ก ์์ฑํ๋ ๋์ ํ์ํ ๋ค๋ฅธ ๊ฐ์ฒด ๋๋ ํจ์๋ฅผ ์์ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ด๋ฉฐ, ์ด๋ ๊ฐ์ฒด๊ฐ ํ์ํ ๊ฒ์ ์ค์ค๋ก ๋ง๋ค์ง ์๊ณ , ์ธ๋ถ์์ ๋ฐ์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
๐ฅ๏ธ DI์ IoC์ ๊ด๊ณ์ฑ
์ ์ด ๋ฐ์ (Inversion of Control, IoC)์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์๋ ์ธ๋ถ ์์คํ ์ด ๋งก๋ ๊ฐ๋ ์ด๋ฉฐ, DI๋ ๊ทธ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. ๋ณดํต ๊ฐ์ฒด๋ ์์ ์ด ํ์ํ ๊ฒ๋ค์ ์ค์ค๋ก ๋ง๋ค์ง๋ง, ์ ์ด ๋ฐ์ ์์๋ ๊ทธ ์ผ์ ์ธ๋ถ์์ ๋์ ํ๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ ํ์๋ก ํ๋ ๊ฒ์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋ ๋ฐฉ์์ธ DI์ IoC๋ ์๋ก ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋ค.
๐ฅ๏ธ DI์ ์ฅยท๋จ์
[์ฅ์ ]
- ๋ชจ๋์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ ๋์์ง
- ์ฝ๋๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ ๊ตฌํ์ฒด๋ฅผ ์ฝ๊ฒ ๊ต์ฒด ๊ฐ๋ฅ.
- ๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ํ ์คํธํ ์ ์์.
- ์ ์ง๋ณด์์ฑ ์ข์
- ์์กด์ฑ์ด ๋ช ์์ ์ผ๋ก ๊ด๋ฆฌ๋ผ์ ์ฝ๋ ๊ตฌ์กฐ๊ฐ ํฌ๋ช ํ๊ณ ์ดํดํ๊ธฐ ์ฌ์.
- ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ฒจ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ๋ฏธ์น๋ ์ํฅ ์ต์ํ๋จ.
- ํ
์คํธ ์ฉ์ด
- ์์กด์ฑ ์ฃผ์ ์ผ๋ก Mock์ด๋ Stub์ ์ด์ฉํ ๋จ์ ํ ์คํธ๊ฐ ์ฌ์์ง.
- ํ ์คํธ ์ ์ค์ ๊ตฌํ ๋์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ ์ฑ๋ฅ ํฅ์.
- ๊ฒฐํฉ๋ ๋ฎ์
- ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ด ์๋ ์ถ์ํ์ ์์กดํ๋ฏ๋ก ํด๋์ค ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋ฎ์.
- ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ์ํฅ์ด ์ค์ด๋ฆ.
- ํ์ฅ์ฑ ๋ฐ ์ ์ฐ์ฑ ์ข์
- ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ์ ๊ธฐ์กด ์ฝ๋ ์์ ์์ด ์๋ก์ด ์์กด์ฑ๋ง ์ฃผ์ ํ๋ฉด ๋จ.
[๋จ์ ]
- ๋ณต์ก์ฑ ์ฆ๊ฐ
- DI ์ปจํ ์ด๋๋ ํ๋ ์์ํฌ ์ฌ์ฉ ์ ์ค์ ๋ฐ ํ์ต์ด ๋ฒ๊ฑฐ๋ก์์ง.
- ์์ ํ๋ก์ ํธ์์๋ ๊ณผํ ๋ฐฉ์์ผ ์ ์์.
- ๋๋ฒ๊น
์ด๋ ค์
- ๋ฐํ์์ ์์กด์ฑ ์ฃผ์ ๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ถ์ ํ๊ธฐ ์ด๋ ค์.
- ์ฑ๋ฅ ์ ํ
- DI ์ปจํ ์ด๋ ์ฌ์ฉ ์ ์์กด์ฑ ์์ฑ๊ณผ ์ฃผ์ ์ด ๋ฐํ์์ ์ด๋ฃจ์ด์ ธ ๋ฏธ์ธํ ์ฑ๋ฅ ์ ํ ๋ฐ์ํ ์ ์์.
- ์ฝ๋ ๊ฐ๋
์ฑ ๋จ์ด์ง
- ์์กด์ฑ ์ฃผ์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์์ฑ์๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ ธ์ ์ฝ๋๊ฐ ๋ณต์กํด์ง.
- DI ์ปจํ ์ด๋ ์์ด ์๋์ผ๋ก ์ฃผ์ ํ๋ฉด ์ฝ๋๊ฐ ์ฅํฉํด์ง.
- ๊ตฌํ ์ดํด ์ด๋ ค์
- DI ํจํด์ ์ฒ์ ์ ํ๊ฑฐ๋ ๊ฒฝํ์ด ๋ถ์กฑํ ๊ฐ๋ฐ์์๊ฒ๋ ๊ฐ๋ ๊ณผ ์ ์ฉ ๋ฐฉ๋ฒ์ด ์ด๋ ค์.
์์กด์ฑ ์ฃผ์ ์ ํ์ฅ์ฑ, ํ ์คํธ ์ฉ์ด์ฑ ๋ฑ ์ฅ์ ์ด ์์ง๋ง, ์์ ํ๋ก์ ํธ์์๋ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํฌ ์ ์์. ์ํฉ์ ๋ง๊ฒ ์ ์ ํ ์ ์ฉํ๋ ๊ฒ ์ค์ํจ.
๐ฅ๏ธ DI ์์ (C#)
using System;
namespace DependencyInjection;
// ํด๋ผ์ด์ธํธ๋ ์ด ์ธํฐํ์ด์ค์ ๋ํด์๋ง ์ ์ ์์ผ๋ฉฐ, ์ด๋ค ํน์ ๊ฒ์ํจ๋๋ฅผ ์ฌ์ฉํ๋์ง๋ ์์ง ๋ชปํจ.
interface IGamepadFunctionality {
string GetGamepadName(); // ๊ฒ์ํจ๋ ์ด๋ฆ์ ๋ฐํ
void SetVibrationPower(float power); // ์ง๋ ์ธ๊ธฐ๋ฅผ ์ค์
}
// ๋ค์ ์๋น์ค๋ค์ ์์ ์ธํฐํ์ด์ค์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์ ๊ณต.
class XboxGamepad : IGamepadFunctionality {
float vibrationPower = 1.0f; // ์ง๋ ์ธ๊ธฐ ๊ธฐ๋ณธ๊ฐ
// Xbox ๊ฒ์ํจ๋์ ์ด๋ฆ ๋ฐํ
public string GetGamepadName() => "Xbox controller";
// ์ง๋ ์ธ๊ธฐ๋ฅผ ์ค์ ํ๋ฉฐ, 0.0์์ 1.0 ์ฌ์ด๋ก ํด๋จํ
public void SetVibrationPower(float power) => this.vibrationPower = Math.Clamp(power, 0.0f, 1.0f);
}
class PlaystationJoystick : IGamepadFunctionality {
float vibratingPower = 100.0f; // ์ง๋ ์ธ๊ธฐ ๊ธฐ๋ณธ๊ฐ
// PlayStation ๊ฒ์ํจ๋์ ์ด๋ฆ ๋ฐํ
public string GetGamepadName() => "PlayStation controller";
// ์ง๋ ์ธ๊ธฐ๋ฅผ ์ค์ ํ๋ฉฐ, 0.0์์ 100.0 ์ฌ์ด๋ก ํด๋จํ (์
๋ ฅ ๊ฐ์ 100์ ๊ณฑํจ)
public void SetVibrationPower(float power) => this.vibratingPower = Math.Clamp(power * 100.0f, 0.0f, 100.0f);
}
class SteamController : IGamepadFunctionality {
double vibrating = 1.0; // ์ง๋ ์ธ๊ธฐ ๊ธฐ๋ณธ๊ฐ
// Steam ๊ฒ์ํจ๋์ ์ด๋ฆ ๋ฐํ
public string GetGamepadName() => "Steam controller";
// ์ง๋ ์ธ๊ธฐ๋ฅผ ์ค์ ํ๋ฉฐ, 0.0์์ 1.0 ์ฌ์ด๋ก ํด๋จํ
public void SetVibrationPower(float power) => this.vibrating = Convert.ToDouble(Math.Clamp(power, 0.0f, 1.0f));
}
// ์ด ํด๋์ค๋ ์๋น์ค๋ฅผ ์ ๊ณต๋ฐ๋ ํด๋ผ์ด์ธํธ ์ญํ ์ ํจ.
class Gamepad {
IGamepadFunctionality gamepadFunctionality; // ์์กด์ฑ์ผ๋ก ์ ๊ณต๋ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ฅ
// ์๋น์ค๋ ์์ฑ์๋ฅผ ํตํด ์ฃผ์
๋๋ฉฐ, ์ ํ๋์ ์ ์ฅ๋จ.
public Gamepad(IGamepadFunctionality gamepadFunctionality) => this.gamepadFunctionality = gamepadFunctionality;
public void Showcase() {
// ์ฃผ์
๋ ์๋น์ค๋ฅผ ์ฌ์ฉ
var gamepadName = this.gamepadFunctionality.GetGamepadName(); // ๊ฒ์ํจ๋ ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ
var message = $"We're using the {gamepadName} right now, do you want to change the vibrating power?";
Console.WriteLine(message);
}
}
class Program {
static void Main() {
var steamController = new SteamController();
// XboxController, PlaystationJoystick ๋ฑ ๋ค๋ฅธ ๊ตฌํ์ฒด๋ ์ ๋ฌ ๊ฐ๋ฅ
// Gamepad๋ ์ด๋ค ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๋์ง ๋ชฐ๋ผ๋ ๋จ.
var gamepad = new Gamepad(steamController);
gamepad.Showcase(); // ๊ฒ์ํจ๋ ์ํ ์ถ๋ ฅ
}
}
์ถ์ฒ :
๏ผ https://en.wikipedia.org/wiki/Dependency_injection#Advantages
๏ผ https://f-lab.kr/insight/dependency-injection-and-spring-framework-20240521