DevLog ๐ถ
[Spring] ์คํ๋ง๊ณผ ๊ฐ์ฒด์งํฅ์ ์๊ด๊ด๊ณ - DI๋ ๋ฌด์์ผ๊น? ๋ณธ๋ฌธ
[Spring] ์คํ๋ง๊ณผ ๊ฐ์ฒด์งํฅ์ ์๊ด๊ด๊ณ - DI๋ ๋ฌด์์ผ๊น?
dolmeng2 2023. 4. 18. 17:38๋ ๋ฒจ 2 ์์ ์๊ฐ์ ์์กด์ฑ ์ฃผ์ ๊ด๋ จ ๋ด์ฉ์ ๋ค์ผ๋ฉด์ ์กฐ๊ธ ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ณ ์ถ์ด์ ๊ฐ๋จํ๊ฒ ๊ธ์ ์์ฑํด๋ณด๊ณ ์ ํ๋ค.
๊ทธ๋์ ์คํ๋ง์ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์์ฑํ๊ธฐ ์ข์ ํ๋ ์์ํฌ๋ผ๊ณ ๋ง์ ๋ค์ด๋ดค์ง๋ง, ์ ํํ๊ฒ ์์ธ์ง๋ ์ดํดํ ์ ์ด ์์๋ค.
์ ๋ฆฌ๋ฅผ ํตํด์ ์กฐ๊ธ ๋ ๋จธ๋ฆฌ์... ๋ด์๋๊ณ ์ ํ๋ค!
โ๏ธ ๊ฐ์ฒด์งํฅ์ ์ค๊ณ๊ณผ ๋์์ธ ํจํด
์ฐ์ , ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น์ผ๋ก ๋ง์ด๋ค ์ธ๊ธํ๋ SOLID์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์๊ฐํด๋ณด์.
- SRP (๋จ์ผ ์ฑ ์ ์์น): ์ด๋ค ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๋ ์ด์ ๋ ์ค์ง ํ๋๋ฟ์ด์ด์ผ ํ๋ค.
- OCP (๊ฐ๋ฐฉ ํ์ ์์น): ์์ ์ ํ์ฅ์๋ ์ด๋ ค์๊ณ , ์ฃผ๋ณ์ ๋ณํ์๋ ๋ซํ์์ด์ผ ํ๋ค.
- LSP (๋ฆฌ์ค์ฝํ ์นํ ์์น): ์๋ธ ํ์ ์ ํญ์ ์์ ์ ๊ธฐ๋ฐ ํ์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ด์ผ ํ๋ค.
- ISP (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น): ํด๋ผ์ด์ธํธ๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กด ๊ด๊ณ๋ฅผ ๋งบ์ง ์์์ผ ํ๋ค.
- DIP (์์กด ์ญ์ ์์น): ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ์ง ์๊ณ , ์ถ์ํ๋ ํด๋์ค์ ์์กดํด์ผ ํ๋ค.
Spring์๋ ์ด๋ฌํ SOLID๋ฅผ ์งํค๊ธฐ ์ํด์ ๋ค์ํ ๋์์ธ ํจํด์ ์ฌ์ฉํ๊ณ ์๋ค.
๊ฐ ๋์์ธ ํจํด์ ๋ํด์ ๋ค๋ฃจ๋ฉด ๋๋ฌด ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋ตํ๊ฒ๋ง ์ค๋ช ํ๊ฒ ๋ค.
1. ์ด๋ํฐ ํจํด : ํธ์ถ๋นํ๋ ์ชฝ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ชฝ์ ์ฝ๋์ ๋์ํ๋๋ก, ์ค๊ฐ์ ๋ณํ๊ธฐ๋ฅผ ํตํด ํธ์ถํ๋ ํจํด
์ด๋ํฐ ํจํด์ ์๋ก ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ํจํด์ด๋ค.
์คํ๋ง์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ค.
- JDBC ์ฌ์ฉ ์ DB ์ฐ๋์ ์ํด DataSource ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๋ง๋ค dataSource ๊ตฌํ์ฒด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์คํ๋ง์์๋ ๊ฐ๊ฐ์ ๋ํด DataSource ์ธํฐํ์ด์ค์ ๋ง๋๋ก ๋ณํํด์ฃผ๋ ์ด๋ํฐ ํจํด์ ์ฌ์ฉํ๋ค.
- JMS (Java Message Service) API ํ์ฉ ์ JMS Adapter๋ฅผ ํ์ฉํ์ฌ ๋ ์ด์์ ํด๋ผ์ด์ธํธ ๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ธฐ ์ํ ํ์ค Java ๋ฉ์์ง API๋ฅผ ์ ๊ณตํ๋ค.
2. ํ๋ก์ ํจํด : ์ ์ด ํ๋ฆ์ ์กฐ์ ํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก, ์ค๊ฐ์ ๋๋ฆฌ์๋ฅผ ๋๋ ํจํด
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ, ์ค์ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ ์๋ฆฌ์ ๋๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ํฌ์ ํ๋ ๊ฒ์ด๋ค.
ํด๋ผ์ด์ธํธ๋ ํด๋น ์์ฒญ์ ๋ฐ๋ ๊ฒ ์ค์ ๊ฐ์ฒด์ธ์ง, ๋๋ฆฌ์ ๊ฐ์ฒด์ธ์ง๋ ์ ์ ์๋ค.
์ด๋, ๋๋ฆฌ์๋ ์ค์ ์๋น์ค์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉฐ, ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ค.
์ค์ ์๋น์ค์ ๋ํ ์ฐธ์กฐ ๋ณ์๋ Composition์ ํํ๋ก ๊ฐ์ง๊ณ ์์ผ๋ฉฐ,
๋๋ฆฌ์๋ ์ค์ ์๋น์ค์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ๊ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋๋ ค์ค๋ค,
๋ํ, ์ค์ ์๋น์ค์ ๋ฉ์๋ ํธ์ถ ์ ํ์ ๋ณ๋์ ๋ก์ง์ ์ํํด์ค ์๋ ์๋ค.
-> OCP์ DIP๋ฅผ ๋ง์กฑํ๊ฒ ๋๋ค.
์คํ๋ง์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ค.
- AOP : ๋ฉ์๋ ์คํ ์ -ํ์ ๋ก๊น , ๋ณด์, ํธ๋์ญ์ ์ฒ๋ฆฌ์ ๋ถ๊ฐ ๊ธฐ๋ฅ ์ฌ์ฉ ์ ์ฒ๋ฆฌํ๋ค.
- ํธ๋์ญ์ ๊ด๋ฆฌ: ํ๋ก์ ๊ฐ์ฒด๋ ํธ๋์ญ์ ์ ์์ ๋ฐ ์ข ๋ฃํ๋ ๋ฑ์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ค.
- Lazy Loading: ๋น ๋ฑ๋ก ์ Lazyํ๊ฒ ๋ง๋ ๋ค๋ฉด, ์ค์ ๋ก ํด๋น ๋น์ด ์ฌ์ฉ๋๊ธฐ ์ ๊น์ง ์์ฑ๋์ง ์๋๋ค. ์ด๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด ๋น์ด ์ค์ ๋ก ์ฌ์ฉ๋๋ ์์ ์ด์ ๊น์ง๋ ๊ฐ์ง๊ณ ์๋ค๊ฐ, ์ฌ์ฉ ์ ์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ํ์๋ค.
3. ๋ฐ์ฝ๋ ์ดํฐ ํจํด: ๋ฉ์๋ ํธ์ถ์ ๋ฐํ๊ฐ์ ๋ณํ๋ฅผ ์ฃผ๊ธฐ ์ํด ์ค๊ฐ์ ์ฅ์์๋ฅผ ๋๋ ํจํด
ํ๋ก์ ํจํด๊ณผ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋์ผํ์ง๋ง, ํด๋ผ์ด์ธํธ์๊ฒ ์ฃผ๋ ๋ฐํ๊ฐ์ ์กฐ์ํ์ฌ ๋ฐํํ๋ ๊ฒ์ด๋ค.
4. ์ฑ๊ธํด ํจํด: ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฑ 1๊ฐ๋ง ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ํจํด
Connection pool, Thread Pool ๊ฐ์ ๊ฐ์ฒด๋ค์ ์ฌ๋ฌ ๊ฐ์ ์ธ์คํด์ค๊ฐ ์กด์ฌํ๋ค๋ฉด ๋ถํ์ํ ์์์ ์ฌ์ฉํ๊ฒ ๋๋ค.
์ฑ๊ธํด ํจํด์ ๋ง์กฑํ๊ธฐ ์ํด์๋ new๋ฅผ ์คํํ ์ ์๋๋ก private ์์ฑ์๊ฐ ํ์ํ๋ฉฐ, ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ์ํ ์ ์ ๋ฉ์๋๊ฐ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ , ํด๋น ๋ฉ์๋๋ ๋จ์ผ ๊ฐ์ฒด (private static)๋ฅผ ๋ฐํํ๋ ํํ๋ก ๋ง๋ค์ด๋ผ ์ ์๋ค.
๋จ์ผ ๊ฐ์ฒด๋ ๊ณต์ ๊ฐ์ฒด์ ๋ค๋ฆ์๊ธฐ ๋๋ฌธ์, ์์ฑ์ ๊ฐ์ ธ์๋ ์ ๋๋ค. (์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๊ด์ฐฎ๋ค)
: ์ด๋ ์ฑ๊ธํด ๋น์ด ๊ฐ์ ธ์ผ ํ๋ ์ ์ฝ ์กฐ๊ฑด์ด๊ธฐ๋ ํ๋ค.
5. ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด: ์์ ํด๋์ค์ ํ ํ๋ฆฟ ๋ฉ์๋์์ ํ์ ํด๋์ค๊ฐ ์ค๋ฒ๋ผ์ด๋ฉํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ํจํด
์์ ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค๋ฅผ ์ ์ธํด๋๊ณ , ํด๋น ํด๋์ค์ ๊ตฌํ์ฒด๋ค์ด ๊ณต๋์ผ๋ก ํ ํ์์ ๋ํด ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค.
ํด๋น ํ ํ๋ฆฟ ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ๋ง๋ค์ด์ ํด๋น ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ํ์ ํด๋์ค๊ฐ (๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ฉํด์ผ ํจ) ๊ฐ๋ณ ํน์ฑ์ ๋ง๋ ๋์์ ํ๋๋ก ํด์, ๊ณตํต์ ์ธ ๋์ + ๊ฐ๋ณ์ ์ธ ๋์์ ํ๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค. (DIP ๋ง์กฑ)
6. ํฉํฐ๋ฆฌ ๋ฉ์๋ ํจํด: ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฉ์๋๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจํด
์คํ๋ง์์๋ ๋น ์์ฑ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋ ํจํด์ ์ฌ์ฉํ๋ค.
BeanFactory์ ์ด๋ฅผ ์์๋ฐ์ ApplicationContext๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ฌ๊ธฐ์ ๊ฐ์ฒด ์์ฑ ๋ฐ ์ด๊ธฐํ๋ ๋น ํฉํฐ๋ฆฌ๊ฐ ํธ์ถํ๊ฒ ๋๋ค.
7. ์ ๋ต ํจํด: ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ต์ ์์ฑํด, ์ ๋ต์ ์คํํ ์ปจํ ์คํธ์ ์ฃผ์ ํ๋ ํจํด
์ ๋ต ํจํด์์๋ ์ ๋ต ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์, ์ ๋ต ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ปจํ ์คํธ, ๊ทธ๋ฆฌ๊ณ ์ ๋ต ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ปจํ ์คํธ์ ์ฃผ์ ํ๋ ํด๋ผ์ด์ธํธ๋ก ๋๋์ด์ ธ ์์ผ๋ฉฐ, ์ ๋ต์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ์ ํ๋๋๋ก ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๋ฐฉ์์ด๋ค.
8. ํ ํ๋ฆฟ ์ฝ๋ฐฑ ํจํด: ์ ๋ต์ ์ต๋ช ๋ด๋ถ ํด๋์ค๋ก ๊ตฌํํ ์ ๋ต ํจํด
DI์์ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ ์ค ํ๋๋ก, ์ ๋ต ํจํด๊ณผ ๋์ผํ์ง๋ง ์ ๋ต์ ์ต๋ช ๋ด๋ถ ํด๋์ค๋ก ์ ์ํด์ ์ฌ์ฉํ๋ ํจํด์ด๋ค.
์คํ๋ง์์๋ ์์ ๊ฐ์ ๋์์ธ ํจํด + SOLID ์ ์ฉ์ ํตํด ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ค๊ณํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ด๋ค.
โ๏ธ IoC์ DI
์ด์ ๋ํด์ ์ ๋ฆฌํ๊ธฐ ์ํด์๋, ์ ํ๋ฆฌ์ผ์ด์ ์ '์์กด๋' ์ ๋ํด์ ๋จผ์ ์๊ฐํด์ผ ํ๋ค.
์์กด์ฑ์ ๋งบ๋๋ค๋ ๊ฒ์ ๋ฌด์์ ๋งํ๋ ๊ฒ์ผ๊น?
ํ๋์ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์์ฑํ๊ฑฐ๋, ํน์ ํธ์ถํ๋ค๋ฉด ์์กด์ฑ์ ๋งบ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ ํด๋์ค์ ์์ฑ๊ณผ ์ฌ์ฉ์ ๊ด์ ์ ์ฃผ๋ชฉํด๋ณด์.
์์๋ฅผ ์ํด ๊ฐ๋จํ ํด๋์ค๋ฅผ ์์ฑํ์๋ค.
public interface Animal {
String sayHi();
}
๋๋ฌผ์ ๋ํ๋ด๋ ์ธํฐํ์ด์ค์ ์ธ์ฌํ๋ ํ์๋ฅผ ์ ์ํ ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค.
public class Cat implements Animal {
@Override
public String sayHi() {
return "๋ฅ๋ฅ";
}
}
public class Dog implements Animal {
@Override
public String sayHi() {
return "๋ฉ๋ฉ";
}
}
๊ทธ๋ฆฌ๊ณ , ๊ทธ์ ๋ํ ๊ตฌํ์ฒด๋ก ๊ณ ์์ด์ ๊ฐ์์ง ๊ฐ์ฒด๊ฐ ์๋ค.
public class Zoo {
private final Animal animal;
public Zoo() {
this.animal = new Cat();
}
public void sayHello() {
System.out.println(animal.sayHi());
}
}
๊ทธ ๋ค์, ๋๋ฌผ์ ๊ฐ์ฒด์์ ๋๋ฌผ์ ์์ฑํด์ ์ธ์ฌ๋ฅผ ํ๋๋ก ์์ผฐ๋ค.
์์ ํด๋์ค๋ฅผ ๋ณด๋ฉด, Zoo ํด๋์ค๋ Cat ํด๋์ค์ ์์ฑ ๋ฐ ์ฌ์ฉ๊น์ง ๋ด๋นํ๊ณ ์๋ค.
์ด๋ฐ ์์ผ๋ก ์ฌ์ฉ๊ณผ ์์ฑ์ ํ๋์ ํด๋์ค์ ํ ๋ฒ์ ํ๋ค๋ฉด ๋ฌด์จ ์ผ์ด ์์๊น?
1. ๊ฒฐํฉ๋๊ฐ ๊ฐํด ์๋ก์ ๋ณํ์ ๋ฏผ๊ฐํด์ง๋ค (OCP ์๋ฐ)
๋ง์ฝ Cat์ sayHi๋ผ๋ ๋ฉ์๋๊ฐ ์์ด์ง๋ค๋ฉด?
ํน์, sayHi๋ผ๋ ๋ฉ์๋์ ๋ฐํํ์ด String ๋์ void๊ฐ ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
= Cat์ ๋ณํ๊ฐ Zoo๊น์ง ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ฉด์ ๋ณ๊ฒฝ์ ์ด๋ ค์๊ฒ ๋๋ค. (+ ์ ์ง-๋ณด์ ๊ด์ ์์๋ ์ข์ง ์๋ค)
์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น - SOLID์์ OCP๋ฅผ ์๋ฐํ๋ ํํ๊ฐ ๋๋ ๊ฒ์ด๋ค.
2. SRP๋ฅผ ์๋ฐํ๊ณ ์๋ค
Zoo๋ Cat์ ๋ํด ์์ฑํ๋ ์ฑ ์ ๋ฐ ์ฌ์ฉํ๋ ์ฑ ์๊น์ง, ์ด 2๊ฐ์ง์ ์ฑ ์์ ๊ฐ์ง๊ณ ์๊ฒ ๋๋ค.
์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น - SOLID์์ SRP๋ฅผ ์๋ฐํ๋ ํํ๊ฐ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ถ๋ฆฌํ ์ ์์๊น?
๐ฑ ์์ฑ์๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์ ํด์ฃผ๊ธฐ
Zoo ํด๋์ค์์ Animal์ ๋ํด์ ์์ฑํ์ง ์๊ณ , ์์ฑ์ ๋ํ ์ฑ ์์ ์ธ๋ถ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
public class Zoo {
private final Animal animal;
public Zoo(final Animal animal) {
this.animal = animal;
}
public void sayHello() {
System.out.println(animal.sayHi());
}
}
์ธ๋ถ์์ Animal์ ๋ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก, ์ฃผ์ ํ๋ ํ์์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค.
public class Driver {
public static void main(String[] args) {
Animal cat = new Cat();
Zoo zoo = new Zoo(cat);
System.out.println(zoo.sayHi());
}
}
์์กด์ฑ ์ฃผ์ ์ ์ ์ฉํ๋ฉด, Zoo๋ ๊ทธ๋ฅ Animal ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๊ฐ ๋ค์ด์ค๊ธฐ๋ง ํ๋ฉด ์ ์์ ์ผ๋ก ์๋ํ๋ค.
๋ง์ฝ Cat์ด ์ ๊ฑฐ๋๊ณ , Duck์ด ๋ค์ด์ค๋๋ผ๋ Zoo์๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ผ์น์ง ์๋๋ค.
์ด๋ ๊ฒ ์ธ๋ถ์ ๋ณํ๋ ์ํฅ์ ๋ฐ์ง ์์ ๋ณ๊ฒฝ์๋ ๋ซํ์์ง๋ง, ์๋ก์ด ๊ฐ์ฒด๊ฐ ์ถ๊ฐ๋๋๋ผ๋ ์๊ด ์์ด์ ํ์ฅ์ ์ด๋ ค์๊ฒ ๋๋ค.
๊ทธ์ , Animal์์ ๊ตฌํํ ๊ฐ์ฒด๊ฐ ๋ค์ด์ค๊ธฐ๋ง ํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
๋์์ธ ํจํด์ ๊ด์ ์์ ๋ณด์์ ๋๋ ์ ๋ต ํจํด์ ์ฌ์ฉํ๋ค๊ณ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ ์ ๋ต์ Animal์ ๊ตฌํํ Cat, Dog์ด๋ผ๊ณ ํ ์ ์๊ณ , ์ปจํ ์คํธ๋ Cat์ sayHi๊ฐ ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ Driver์ main ๋ฉ์๋๊ฐ ๋๋ค.
๐ฑ setter๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์ ํ๊ธฐ
๋๋ฌผ์์ ์กด์ฌํ๋ ๋๋ฌผ์ ๊ต์ฒด(ใ ใ )ํ๋ค๋ ๋๋์ผ๋ก, ์์ ์๋ฅผ ํตํด์ ์์กด์ฑ ์ฃผ์ ์ ํด์ค ์ ์๋ค.
public class Zoo {
private Animal animal;
public void setAnimal(final Animal animal) {
this.animal = animal;
}
public void sayHello() {
System.out.println(animal.sayHi());
}
}
public class Driver {
public static void main(String[] args) {
Animal cat = new Cat();
Zoo zoo = new Zoo();
zoo.setAnimal(cat);
zoo.sayHello();
}
}
๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋์ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐ฑ Spring - @Autowired ํ์ฉํ๊ธฐ
์ด์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ฃผ์ ์ ์์ ํ ์ธ๋ถ์๊ฒ ๋๊ธฐ๊ณ ์ถ๋ค. ์คํ๋ง์ IoC - ์ ์ด์ ์ญ์ ์ ์ฌ์ฉํ ์ ์๋ค.
@Component
public class Cat implements Animal {
@Override
public String sayHi() {
return "๋ฅ๋ฅ";
}
}
@Component
@Primary
public class Dog implements Animal {
@Override
public String sayHi() {
return "๋ฉ๋ฉ";
}
}
@Autowired๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ ์ผ๋ก ์กฐํํ๊ธฐ ๋๋ฌธ์, ๋์ผํ ํ์ ์ ๊ฒฝ์ฐ @Qualifier๋ก ๊ตฌ๋ถํ ์ ์๋ ์กฐ๊ฑด์ ์ฃผ๊ฑฐ๋, @Primary๋ก ์ฐ์ ์์๋ฅผ ์ง์ ํด์ผ ํ๋ค. ์ฌ๊ธฐ์๋ Dog์ Primary๋ฅผ ๊ฑธ์๋ค.
@Component
public class Zoo {
private final Animal animal;
@Autowired
public Zoo(final Animal animal) {
this.animal = animal;
}
public String sayHello() {
return animal.sayHi();
}
}
์ด๋ ๊ฒ ๋๋ฉด Zoo์ ๋ํด์ ์ ์ธํ ๋ Animal ํ์ ์ ๋ํด์ ์๋์ผ๋ก Dog ํ์ ์ด ์ฃผ์ ๋ ๊ฒ์ด๋ค.
ํ ์คํธ ์ฝ๋๋ฅผ ๋๋ ค๋ณด์.
@SpringBootTest
class ZooTest {
@Autowired
private Zoo zoo;
@Test
void test() {
String expected = zoo.sayHello();
assertThat(expected)
.isEqualTo("๋ฉ๋ฉ");
}
}
ํ ์คํธ ๊ฒฐ๊ณผ, ์ฑ๊ณต์ผ๋ก ๋์จ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฐ ์์ผ๋ก ๊ฐ์ฒด์ ์์ฑ ๋ฐ ์ฃผ์ ์์ฒด๋ฅผ ์คํ๋ง์๊ฒ ์ฑ ์์ ๋๊ฒจ์ ๊ฐ๋ฐ์๊ฐ ์ ๊ฒฝ์ฐ์ง ์๋๋ก ํ๋ ๊ฒ์ด ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค!
๋ํ, ์์กด ๊ด๊ณ์ ์ํ ์ฐธ์กฐ ๋ฑ์ ์๋ฒ ๊ตฌ๋ ์์ ์ ๋ง์์ค ์ ์๋ ๊ฒ๋ ํ๋์ ๊ธฐ์ ์ ์ฅ์ ์ด๊ธฐ๋ ํ๋ค :D
๋ง์ง๋ง์ผ๋ก ๋ค์ํ ์์กด์ฑ ์ฃผ์ ๋ฐฉ์์ ๋ํด์ ํน์ง์ ์ ๋ฆฌํ๋ฉฐ ๊ธ์ ๋ง๋ฌด๋ฆฌํ๊ณ ์ ํ๋ค.
1. ์์ฑ์ ์ฃผ์
- ํธ์ถ ์์ ์ 1ํ ํธ์ถ๋๋ ๊ฒ์ด ๋ณด์ฅ๋๋ฉฐ, ์์ฑ์๊ฐ ํ ๊ฐ๋ผ๋ฉด @Autowired ์๋ต ๊ฐ๋ฅ
2. ์์ ์ ์ฃผ์ (setter)
- ์ฃผ์ ๋ฐ๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ
3. ํ๋ ์ฃผ์
- ์ธ๋ถ์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ ์ฝ์ง ์๋ค. (DI ํ๋ ์์ํฌ๊ฐ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ค)
๐ฑ ์์ฑ์ ์ฃผ์ ์ ์ฅ์
1. ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ (final๋ก ์ ์ธ - ๊ฐ์ฒด ์์ฑ ์์ ์ด๊ธฐํ๋๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์์ค๋ค)
+ ๋กฌ๋ณต์ ์ฌ์ฉํ๋ฉด @RequiredArgsConsturctor๋ฅผ ํตํด ๋ ๊ฐ๊ฒฐํ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
2. ํ ์คํธ ์ฝ๋ ์์ฑ์ด ์ฉ์ดํจ (์์ฑ์๋ฅผ ํตํด ๋ค๋ฅธ mock ๊ฐ์ฒด ์ฃผ์ ์ด ์ฉ์ดํจ)
์ฌ์ค ๋ถ๋ณ์ฑ์ด ๊ฐ์ฅ ํฐ ๊ฒ ๊ฐ๋ค!
2.6 ์ดํ ๋ฒ์ ์์๋ ํ๋ ์ฃผ์ ๊ณผ ๋ค๋ฅด๊ฒ ์์ฑ์ ์ฃผ์ ์์๋ ์ํ ์ฐธ์กฐ๊ฐ ์๋ฒ ๊ตฌ๋ ์ ๋ฐ์ํ์๋๋ฐ, 2.6๋ถํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฐธ์กฐ๋ฅผ ๋ง์๊ธฐ ๋๋ฌธ์ ์ค์ง ์์ฑ์ ์ฃผ์ ๋ง์ ์ฅ์ ์ด๋ผ๊ณ ๋ณด๊ธฐ๋ ์ด๋ ค์์ก๋ค. (๊ธฐ์กด์๋ ํ๋ ์ฃผ์ ์์๋ ํธ์ถ์ด ๋์ด์ผ๋ง ์ก์ ์ ์์์)
'Back-end > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ์๋ฐ์ inner class๋ ์คํ๋ง ๋น์ด ๋ ์ ์์๊น? (2) | 2023.04.24 |
---|---|
[Spring] Jackson annotation - Deserialization ์์๋ณด๊ธฐ (0) | 2023.04.20 |
[Spring] Jackson annotation - Serialization ์์๋ณด๊ธฐ (0) | 2023.04.16 |
[Spring] Database Initialization : schema.sql๊ณผ data.sql (3) | 2023.04.15 |
[ReactiveProgramming] Iterable, Iterator์ Observer Pattern (0) | 2022.10.24 |