<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SOLID on Kelly Dev</title><link>https://kelly-chui.github.io/tags/solid/</link><description>Recent content in SOLID on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 27 Mar 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/solid/index.xml" rel="self" type="application/rss+xml"/><item><title>Software Engineering. DI와 DIP</title><link>https://kelly-chui.github.io/posts/se-dependency-injection/</link><pubDate>Thu, 27 Mar 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/se-dependency-injection/</guid><description>&lt;h2 id="의존성-주입dependency-injection"&gt;의존성 주입(Dependency Injection)&lt;/h2&gt;
&lt;p&gt;의존성 주입은 객체가 필요한 의존성을 내부에서 직접 생성하지 않고 외부에서 전달받는 방식이다. 별도의 DI 프레임워크나 주입 전용 객체가 반드시 필요한 것은 아니다. 생성자를 통해 객체를 전달하는 것만으로도 의존성 주입이 된다.&lt;/p&gt;
&lt;h2 id="의존의-의미"&gt;의존의 의미&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;A → B&lt;/code&gt;: &lt;code&gt;A&lt;/code&gt;가 &lt;code&gt;B&lt;/code&gt;에 의존한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;A&lt;/code&gt;가 동작하기 위해 &lt;code&gt;B&lt;/code&gt;의 타입이나 기능을 사용한다면 &lt;code&gt;A&lt;/code&gt;는 &lt;code&gt;B&lt;/code&gt;에 의존한다. &lt;code&gt;B&lt;/code&gt;의 공개 인터페이스가 바뀌면 &lt;code&gt;A&lt;/code&gt;도 영향을 받을 수 있다.&lt;/p&gt;
&lt;p&gt;다음 코드에서 &lt;code&gt;Greeter&lt;/code&gt;는 구체 타입인 &lt;code&gt;EnglishGreetingProvider&lt;/code&gt;를 직접 생성한다.&lt;/p&gt;
&lt;img alt="Screenshot 2024-09-29 at 4.21.47\u202fPM.png" loading="lazy" src="https://kelly-chui.github.io/posts/se-dependency-injection/image-001-optimized-image.webp"&gt;&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EnglishGreetingProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Greeter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EnglishGreetingProvider&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;이 구조에서는 구현을 교체하거나 테스트 대역을 사용하려면 &lt;code&gt;Greeter&lt;/code&gt;를 직접 수정해야 한다.&lt;/p&gt;</description></item></channel></rss>