Spring DI
by ๋๋ถ๋์คํ๋ง DI
Spring DI (Dependency Injection)
์คํ๋ง์์ ์์กด์ฑ ์ฃผ์ ์, ๊ฐ ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ค์ ์๋ฏธํฉ๋๋ค.
๋ง์ฝ ์คํ๋ง DI๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์๋ฅผ ๋ค์ด A ํด๋์ค ๋ด๋ถ์์ B ํด๋์ค์ C ํด๋์ค๋ฅผ ํ์ฉํ๋ค๊ณ ํ ๋, ์๋์ ๊ฐ์ด A ํด๋์ค ๋ด๋ถ์์ B ํด๋์ค์ C ํด๋์ค๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑํ๋ค๊ณ ํฉ์๋ค.
public class A {
private B b;
private C c;
public A() {
b = new B();
c = new C();
}
}
์ด๋ ๊ฒ ์์ฑํ ๊ฒฝ์ฐ, B ํด๋์ค๋ C ํด๋์ค์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ๋ฉด, A ํด๋์ค์ ์์ ์ด ํ์ํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ฝ๋๋ฅผ ๊ฒฐํฉ๋๊ฐ ๋์ ์ฝ๋๋ผ๊ณ ํํํ๋ฉฐ, A ํด๋์ค๋ B ํด๋์ค์ C ํด๋์ค์ ์์กด์ฑ์ ๊ฐ์ง๋ค๊ณ ํํํฉ๋๋ค.
์คํ๋ง DI๋ ์ด๋ฌํ ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ์ค๋๋ค.
public class A {
@Autowired
private B b;
@Autowired
private C c;
}
Spring DI ๊ตฌํ ๋ฐฉ๋ฒ
1. ํ๋ ์ฃผ์ (Field Injection)
ํ๋ ์ฃผ์ ์ ์์กด์ฑ์ ์ฃผ์ ํ๊ณ ์ถ์ ํ๋์ @Autowired ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๋ฉด ์์กด์ฑ์ด ์ฃผ์ ๋ฉ๋๋ค.
public class A {
@Autowired
private B b;
@Autowired
private C c;
}
ํน์ง
- ์ฝ๋๊ฐ ๊ฐ๊ฒฐํฉ๋๋ค.
- ํ๋์ final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ด ๋ถ๋ณ์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค.
์ฌ๋ฌ ๋ธ๋ก๊ทธ๋ฅผ ์ฝ์ด๋ณด๋ฉด SRP ์๋ฐ์ด๋ ๋ณด์ด์ง ์๋ ์์กด์ฑ์ ๋ํด ๋์ค๋๋ฐ, ์๋ ๋งํฌ๋ฅผ ๊ฑธ์ด๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฝ์ด๋ณด๋ฉด ์ด๋ ํ๋ ์ฃผ์ ๋ง์ ๋ฌธ์ ๊ฐ ์๋ ์ ์๋ค๋ ์๊ฐ์ด ๋ค์ด ํน์ง์์ ์ ์ธํ์ต๋๋ค.
[Spring] DI(Dependency Injection) ์ ๋ฆฌ
์ฐธ๊ณ ๋ก, ์ธํ ๋ฆฌ์ ์ด์์ ํ๋ ์ฃผ์ ์ฌ์ฉ ์ ๊ฒฝ๊ณ ์ฐฝ์ด ๋์ต๋๋ค.
๋น์ ์ฃผ์ ํ๋ ์์
- ์ฃผ์ ๋ฐ์ผ๋ ค๋ ๋น์ ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ๋น์ ์ฐพ๊ฑฐ๋ ๋น ํฉํ ๋ฆฌ์ ๋ฑ๋กํฉ๋๋ค.
- ์์ฑ์ ์ธ์์ ์ฌ์ฉํ๋ ๋น์ ์ฐพ๊ฑฐ๋ ์์ฑํฉ๋๋ค.
- ํ๋์ ์ฃผ์ ํฉ๋๋ค.
ํ๋ ์ฃผ์ ๋ฐฉ์์ ๋ฐํ์์์ ์์กด์ฑ์ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ฃผ์ ํ์ง ์์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค.
public class App {
public static void main(String[] args) {
A a = new A(); // ์์กด์ฑ์ ์ฃผ์
ํ์ง ์์์ง๋ง ์ปดํ์ผ ์๋ฌ๋ ๋ฐ์ํ์ง ์์
}
}
2. ์์ ์ ์ฃผ์ (Setter Based Injection)
์์ ์ ์ฃผ์ ์ setter ๋ฉ์๋์ @Autowired ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ ์์กด์ฑ์ ์ฃผ์ ํ๋ ๋ฐฉ์์ ๋๋ค. ์ ํ, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด๊ด๊ณ์ ์ฌ์ฉํ๋ ๊ฒ ์ข์ผ๋ฉฐ, ์๋ฐ ๋น ํ๋กํผํฐ ๊ท์ฝ์ ์์ ์ ๋ฉ์๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
public class A {
private B b;
private C c;
@Autowired
public void setB(B b) {
this.b = b;
}
@Autowired
public void setC(C c) {
this.c = c;
}
}
ํน์ง
- ์ ํ, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด๊ด๊ณ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์๋ฐ๋น ํ๋กํผํฐ ๊ท์ฝ์ ์์ ์ ๋ฉ์๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. (setXxx)
- ํ๋์ final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ด ๋ถ๋ณ์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค.
- ์ ํ์ ์ผ๋ก ์ฃผ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ฝ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ, ๋๋ฝ ์ NPE ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋น์ ์ฃผ์ ํ๋ ์์
- ์ฃผ์ ๋ฐ์ผ๋ ค๋ ๋น์ ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ๋น์ ์ฐพ๊ฑฐ๋ ๋น ํฉํ ๋ฆฌ์ ๋ฑ๋กํฉ๋๋ค.
- ์์ฑ์ ์ธ์์ ์ฌ์ฉํ๋ ๋น์ ์ฐพ๊ฑฐ๋ ์์ฑํฉ๋๋ค.
- ์ฃผ์ ํ๋ ค๋ ๋น ๊ฐ์ฒด์ ์์ ์๋ฅผ ํธ์ถํ์ฌ ์ฃผ์ ํฉ๋๋ค.
ํ๋ ์ฃผ์ ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์์ ์ ์ฃผ์ ๋ฐฉ์๋ ๋ฐํ์์์ ์์กด์ฑ์ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ฃผ์ ํ์ง ์์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค.
public class App {
public static void main(String[] args) {
A a = new A(); // ์์กด์ฑ์ ์ฃผ์
ํ์ง ์์์ง๋ง ์ปดํ์ผ ์๋ฌ๋ ๋ฐ์ํ์ง ์์
}
}
3. ์์ฑ์ ์ฃผ์ (Constructor Based Injection)
์์ฑ์ ์ฃผ์ ์ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ์ฃผ์ ํ๋ ๋ฐฉ์์ ๋๋ค.
public class A {
private final B b;
private final C c;
@Autowired // ์์ฑ์๊ฐ ๋ฑ ํ๋๋ง ์กด์ฌํ๋ฉด, @Autowired ๋ฅผ ์๋ตํด๋ ์๋ ์ฃผ์
๋๋ค.
public A(B b, C c) {
this.b = b;
this.c = c;
}
}
๋ํ, Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ @RequiredArgsConstructor ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด final ์ด ๋ถ์ ํ๋๋ฅผ ๋ชจ์์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์, ํ๋ ์ฃผ์ ์ฒ๋ผ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@RequiredArgsConstructor
public class A {
private final B b;
private final C c;
}
ํน์ง
- ํ๋์ final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ด ๋ถ๋ณ์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค.(๊ฐ์ฒด ์์ฑ ์ ๋ฑ 1๋ฒ ํธ์ถ๋๋ฏ๋ก ์ดํ ๋ณ๊ฒฝ๋ ์ผ X)
- ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ๋น์ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ NPE ๋ฐ์์ ๋ง์ต๋๋ค.
๋น์ ์ฃผ์ ํ๋ ์์
- ์์ฑ์์ ์ธ์์ ์ฌ์ฉ๋๋ ๋น์ ์ฐพ๊ฑฐ๋ ๋น ํฉํ ๋ฆฌ์์ ์์ฑํฉ๋๋ค.
- ์ฐพ์ ์ธ์ ๋น์ผ๋ก ์ฃผ์ ํ๋ ค๋ ์์ฑ์๋ฅผ ํธ์ถํฉ๋๋ค.
๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ๋น์ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ฃผ์ ํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
public class App {
public static void main(String[] args) {
// AS-IS : ์์กด์ฑ์ ์ฃผ์
ํ์ง ์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํจ
A a = new A(); }
}
public class App {
public static void main(String[] args) {
// TO-BE : ์์กด์ฑ ์ฃผ์
B b = new B();
C c = new C();
A a = new A(b, c);
}
}
๐ ์ฐธ๊ณ
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring ํ๋ก์ ํธ ๋ด๋ถ์ React ์ค์ ๋ฐ Build (Gradle) (0) | 2023.01.15 |
---|---|
properties๋ก Spring Boot log๋ฅผ ์ค์ ํด๋ณด์! (0) | 2022.04.23 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
๋๋ถ๋์ Devlog
๋๋ถ๋