(Spring) DI, IoC, SOLID
Spring
05/21/2021
๐ DI (Dependency Injection)
: ์์กด์ฑ ์ฃผ์
A๋ผ๋ ํฌ๋์ค์์ B๋ผ๋ ํด๋์ค๋ฅผ ํ์๋ก ํ ๋ A๋ B์ ์์กด์ฑ์ ๊ฐ๋๋ค๊ณ ํ๋ค.
์์กด์ฑ ์ฃผ์ ์ ํ๋ฉด ํ๋ก๊ทธ๋จ ์ค๊ณ๋ฅผ ํ ๋ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด ํฅ์๋๋ค. ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ฉด์ ์ ์ฐํ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ.
๐ IoC (Inversion of Control)
์ ์ด์ ๋ฐ์ ์ด๋ผ๋ ๋ป.
๊ทผ๋ฐ why ์ ์ด์ ๋ฐ์ ?
๊ธฐ์กด ํ๋ก๊ทธ๋๋ฐ์์์ ๋ ผ๋ฆฌ ํ๋ฆ์, Aํด๋์ค์์ Bํด๋์ค๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, Aํด๋์ค๋ฅผ ์์ฑํ๊ณ , ๊ทธ ๋ค์์ผ๋ก ํธ์ถ๋๋ Bํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฌ๋ IoC ์ ํ๋ก์ธ์ค์์๋ ์ฃผ์ ๊ฐ์ฒด๋ก ์ ์๋์ด์๋ ํด๋์ค๋ค(Bํด๋์ค)์ ๋จผ์ ์์ฑํ๊ณ ๊ทธ ๋ค์์ ํธ์ถํ๋ ๋ฉ์ธ ํด๋์ค(Aํด๋์ค)๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ์ด์ ๋ฐ์ ๋๋ ์ญํ์ด๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
์คํ๋ง์์ ์ ๊ณตํ๋ IoC Container : ๋น(bean)์ ๋ง๋ค๊ณ ์์กด์ฑ์ ์ฎ์ด์ฃผ๋ ์ผ์ ํ๋ค.
ํน์ ํ ์ธํฐํ์ด์ค๋ฅผ ์์ํ๊ฑฐ๋ ๋น์ผ๋ก ๋ฑ๋กํ๋ ํน์ ์ด๋ ธํ ์ด์ ์ด ์ ์๋์ด์๊ฑฐ๋(ex. @Controller), ์๋๋ฉด ๋น์ผ๋ก ์ง์ ๋ฑ๋กํ๊ฑฐ๋์ ๊ฒฝ์ฐ์๋ง ์คํ๋ง IoC ์ปจํ ์ด๋์ ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
์ด๋ ๊ฒ ๋น์ผ๋ก ๋ฑ๋ก๋ ๊ฐ์ฒด๋ค์ IoC์ปจํ ์ด๋๊ฐ ์์กด์ฑ์ผ๋ก ์ฎ์ด์ค๋ค. (๊ธฐ๋ณธ์ ์ผ๋ก ์์กด์ฑ ์ฃผ์ ์ IoC์ปจํ ์ด๋ ์์์ ๋น์ผ๋ก ๋ฑ๋ก๋ ๊ฐ์ฒด๋ค๋ง ๊ฐ๋ฅํ๋ค. )
๐ Spring ์์กด์ฑ ์ฃผ์ ๋ฐฉ๋ฒ 3๊ฐ์ง
- ์์ฑ์ ์ฃผ์
- ์ธํฐ ์ฃผ์
- ํ๋ ์ฃผ์
๋จผ์ DI์ ์์กด์ฑ ์ฃผ์
์ Setter ์ฃผ์
, ์์ฑ์ ์ฃผ์
๋๊ฐ์ง๊ฐ ์๋ค.
โ๏ธ setter ์ฃผ์
public class Library { private Novel novel;
public cvoid setNovel(Novel novel){ this.novel = novel }
public void readNovel(){ novel.subject(); }}
public interface novel{ void subject();}
public class NovelImple implements Novel { @Override public void subject() { System.out.println("This Subject is Comics"); }}
public class Main { public static void main(String[] args) { Library library = new Library();
//1. library.setNevel(new NovelImple());
//2. library.setNovel(new Novel(){ @Override public void subject(){ System.out.println("This Subject is Romans"); } }); // ๊ตฌํ์ฒด ์ฃผ์
ํ ํธ์ถ library.readNovel(); }}
- setter ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ๊ตฌํ์ฒด์ ๋ด๋ถ ๋์์ ์์ง ๋ชปํ๊ณ ์ ํ์๋ ์๊ฒ ๋๋ค.
- Library ํด๋์ค์ readNovel() ๋ฉ์๋๋ Novel ํ์ ์ ๊ฐ์ฒด์ ์์กดํ๊ณ ์๋ค. But, setter์ ์ฃผ์ ์ด ํ์ํ ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋์ง ์์๋ ๊ฐ์ฒด๋ ์ผ๋ง๋ ์ง ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ์์กด์ฑ ์ฃผ์ ์์ด readNovel() ๋ฉ์๋์ ์ ๊ทผํ๊ฒ ๋๋ฉด NullPointerExceoption ์ด ๋ฐํ ์ ์๋ค.
โ๏ธ ์์ฑ์ ์ฃผ์
์์ฑ์ ์ฃผ์ ์ ํ๊ฒ ๋๋ค๋ฉด Library ํด๋์ค์ setter๋ฅผ ์์ ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ์๋ก ์ฃผ์ ์ ํ๊ฒ๋๋ค.
public class Library { private Novel novel;
public Library(Novel novel){ this.novel = novel; }
public void readNovel(){ novel.subject(); }}
- ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ์ง ์์ ์์ Library ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ NullPointException์ด ๋ฐ์ํ ์ผ์ด ์๋ค. ์ปดํ์ผ ํ์์ ์ค๋ฅ๋ฅผ ์ก์๋ผ ์ ์์.
Spring์ ์์กด์ฑ์ฃผ์
์ ์์ ๋๊ฐ์ง์ ๋ํด์ ํ๋์ฃผ์
๊น์ง ์ธ ๊ฐ์ง์ ๋ฐฉ๋ฒ์ด ์์.
โ๏ธ ํ๋ ์ฃผ์
public class A implements B {
@Autowired private B b ;
@Override public void testMethod(){ b.bMethod(); }
}
ํ๋ ์ฃผ์ ์ ๋จ์
: ์ํ์ฐธ์กฐ์ StackOverflowError ๋ฐ์์ํด <- ์ด๋ ๊ฐ์ฒด๊ฐ ๋ชจ๋ ์์ฑ์ด ๋ ํ ๋ก์ง์์์ ์ํ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ก์ง์ด ๊ตฌ๋๋๊ธฐ ์ ๊น์ง ์ํ์ฐธ์กฐ์ธ์ง ๋ชจ๋ฅธ๋ค.
but ์์ฑ์ ์ฃผ์ ์ผ๋ก ์ด๋ฃจ์ฌ์ง ๊ฒฝ์ฐ, ๋น ์์ฑ ์ ๊ฐ์ฒด๊ฐ ์ํ์ฐธ์กฐ๋ฅผ ํ๊ณ ์๋ ๊ฒฝ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๋ฉ์ธ์ง์ ํจ๊ป ์คํ๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ด ๊ตฌ๋๋์ง ์๋๋ค.
Description : The dependencies of some of the beans in the application context form a cycle
why? Aclass์ Bclass๊ฐ ์๋ก ์ํ์ฐธ์กฐ ํ๊ณ ์๋ค๊ณ ๊ฐ์ ในํ ๊ฒฝ์ฐ์, ์์ฑ์ ์ฃผ์ ์ ๋ค์๊ณผ ๊ฐ์ ๋ก์ง์ด ์ํ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
new Aclass(new Bclass(new Aclass(new ... )))
-> ์ปจํ ์ด๋๊ฐ ๋น์ ์์ฑํ๋ ์์ ์์ ๊ฐ์ฒด์์ฑ์ ์ฌ์ดํด ๊ด๊ณ๊ฐ ์๊ธด๋ค.
Intro to Inversion of Control and Dependency Injection with Spring
์คํ๋ง - ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ , ํ๋์ธ์ ์ ์ด ์ข์ง ์์ ์ด์
Spring โ ์ ์ด ๋ฐ์ vs ์ข ์์ฑ ์ฃผ์
๐ SOLID
SOLID๋? ํด๋ฆฐ์ฝ๋๋ก ์ ๋ช ํ ๋ก๋ฒํธ ๋งํด์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น(SRP, OCP, LSP, ISP, DIP)์ ์ ๊ธ์๋ฅผ ๋ฐ์ ๋ง๋ ์ฉ์ด
SRP(Single Responsibility Principle) ๋จ์ผ ์ฑ ์์ ์์น
: ๊ฐ์ฒด๋ ๋จ ํ๋์ ์ฑ ์๋ง ๊ฐ์ง ์ ์๋ค. ๊ฐ์ฒด๊ฐ์ ์์ง๋๋ ๋์ผ๋ฉฐ ๊ฒฐํฉ๋๋ ๋ฎ์ ํ๋ก๊ทธ๋จ์ ์ค๊ณํ๊ธฐ ์ํ ์์น. ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฃจ๋ ๊ธฐ๋ฅ ์ด์ธ์ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐํ๊ฒ ๋๋ค๋ฉด ์์ง๋๊ฐ ๋ฎ์์ง๊ณ ๋ฉ์๋๊ฐ์ ๊ฒฐํฉ์ด ๊ฐํด์ง ์๋ฐ์ ์๋ค.
OCP(Open/Clodes Principle) ๊ฐ๋ฐฉ ํ์ ์์น
: ๋คํ์ฑ์ ํตํ ๊ธฐ๋ฅ์ ํ์ฅ. ์์ ์ ํ์ฅ์๋ ์ด๋ ค์์ด์ผ ํ๊ณ ์ฃผ๋ณ์ ๋ณํ์์๋ ๋ซํ์์ด์ผ ํ๋ค.
๊ฐ๋ฐฉ ํ์ ์์น(OCP) ์์
LSP(Liskov Substitution Principle) ๋ฆฌ์ค์ฝํ ์นํ ์์น
: ํด๋์ค๋ฅผ ์์ํ๋ ์์ ํด๋์ค๋ค์ ๋ถ๋ชจ ํด๋์ค์ ๊ท์ฝ์ ์ง์ณ์ผ ํ๋ค.
ISP(Interface Segregation Principle) ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
: ํด๋ผ์ด์ธํธ๊ฐ ์์ ์ด ์ด์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กดํ๋ฉด ์๋๋ค๋ ์์น. ์ธํฐํ์ด์ค ๋ถ๋ฆฌ๋ฅผ ํตํด ๋ค์ค์์์ ์ด๋ฃฌ๋ค.
DIP(Dependency Inversion Principle) ์์กด๊ด๊ณ ์ญ์ ์์น
: ๊ตฌํ์ฒด๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ ์์กดํ๋ ๊ฒ์ด ์ข๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.