๐ก ์ด ํฌ์คํ ์ ์คํ๋ง ์คํฐ๋์ ๋ง๊ฒ ๊ตฌ์ฑ๋ ๊ฒ์ด๋ฉฐ, ์ถํ ๊ธ์ ๊ตฌ์กฐ์ ๋ค๋ฃจ๋ ๋ฒ์๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋ค.
IoC(Inversion of Control, ์ ์ด์ ์ญ์ )
์ค๋ธ์ ํธ ์์ฑ, ๊ด๊ณ์ค์ , ์ฌ์ฉ, ์ ๊ฑฐ ๋ฑ ์ค๋ธ์ ํธ ์ ๋ฐ์ ๊ฑธ์น ๋ชจ๋ ์ ์ด๊ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ๋๊ฒ ์๋๋ผ ํ๋ ์์ํฌ์ ์ปจํ ์ด๋์๊ฒ ๋๊ธฐ๋ ๊ฐ๋ ์ ๋งํ๋ค. ์ฐธ๊ณ ๋ก ์คํ๋ง ํ๋ ์์ํฌ ๋ง์ ๊ฐ๋ ์ด ์๋๋ค.
์คํ๋ง์์๋ ์ '์ค๋ธ์ ํธ'๋ฅผ '๋น(Bean)'์ด๋ผ๊ณ ์นญํ๋ค.
๐ก ๋น(Bean)์ ๋ํด์๋ ์ถํ ์ฌ๋ฌ๋ฒ์ ๊ฑธ์ณ ๋ณ๋๋ก ํฌ์คํ ํ ํ ๋ ์ฐธ๊ณ ๋ฐ๋๋ค.
์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด BestStar ์์ฑ์์์ Star ํด๋์ค์์ ์์กด๊ด๊ณ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ๋จ์์ ์ง์ ์ค์ ํ๊ณ ์๋ค.
๐ก ์์กด๊ด๊ณ
์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ์ ๋ ํผ๋ฐ์ค ์ฐธ์กฐ๊ฐ ๋์ด ์๋ค๋ ๋ง์ด๋ค.
public class BestStar {
private Star star;
public BestStar()
star = new Star();
// BestStar ์์ฑ์์์ Star ํด๋์ค์์ ์์กด๊ด๊ณ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
๋จ์์ ์ง์ ์ค์ ํ๊ณ ์๋ค.
}
}
๊ทธ๋ฐ๋ฐ ์คํ๋ง์ด ์ ๊ณตํ๋ @Autowired ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์กด๊ด๊ณ๋ฅผ ์ค์ ํด์ฃผ๋ ์ฝ๋๊ฐ ์ฌ๋ผ์ง๊ณ ํ๋ ์์ํฌ์ BestStar, Star ์ค๋ธ์ ํธ ์์กด๊ด๊ณ์ ์ ์ด๊ถ์ ๋งก๊ธธ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
public class BestStar {
@Autowired
private Star star;
}
๐ก ์ถํ @Autowired ์ด๋ ธํ ์ด์ ์ด ์คํ๋ง์์ ์ด๋ป๊ฒ ์ถ์ํ๋ผ์๊ณ ๊ทธ ๋ด๋ถ์์ ์ด๋ค ๋์์๋ฆฌ๋ฅผ ๊ฐ๋์ง ๋๋ฒ๊น ์คํ ํธ๋ ์ด์ฑ์ ํด๋ณด๋ฉฐ ๋ถ์ํ ๊ธ์ ํฌ์คํ ํ ํ ๋ ์ฐธ๊ณ ๋ฐ๋๋ค.
๋จผ์ ๊ถ๊ธํ์ ๋ถ๋ค์ Github์ ํ ์ดํ๋ก์ ํธ๋ก ์ ๋ฆฌํ ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ ๋ฐ๋๋ค.
IoC๊ฐ ํ์ํ ์ด์ ? - ๊ฐ์ฒด์งํฅ ์์น์ ์ ์งํค๊ธฐ ์ํด
๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ํ๋ ์์ํฌ์ ๋ด๊ฐ ๊ตฌํ ํ๊ณ ์ ํ๋ ๋ถ๋ถ์ผ๋ก ์ญํ ๊ณผ ๊ด์ฌ์ ๋ถ๋ฆฌํด ์์ง๋๋ฅผ ๋์ด๊ณ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ฉฐ, ์ด์ ๋ฐ๋ผ ๋ณ๊ฒฝ์ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑ ํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ด๋ฅผ ์ญ์ ํ ๊ฒ์ด๋ค.
๐ก ์ถํ ๊ฐ์ฒด์งํฅ 3์์, 5์์น์ ๋ํด ๋ณ๋๋ก ํฌ์คํ ํ ๋งํฌ๋ฅผ ๊ฑธ์ด๋ํ ๋ ์ฐธ๊ณ ๋ฐ๋๋ค.
DI(Dependency Injection, ์์กด๊ด๊ณ ์ฃผ์ )
์ธ๋ถ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์๋ ์ธ์คํด์ค์ ๋ ํผ๋ฐ์ค๋ฅผ ์ธํฐํ์ด์ค ํ์ ์ ํ๋ผ๋ฏธํฐ๋ก ์์กด๊ด๊ณ๋ฅผ ์ค์ ํ๋๊ฒ์ ๋งํ๋ค. ์คํ๋ง์์ IoC๋ผ๋ ์ฉ์ด๋ง ๊ฐ์ง๊ณ ๋ ๊ฐ๋ ์ด ๋๋ฌด ์ถ์์ ์ด๋ผ ๊ทธ ํต์ฌ์ ์ง๋ ์ฉ์ด๊ฐ ํ์ํ๋๋ฐ, ์ด๋ ๋ช๋ช ์ฌ๋๋ค์ ์ ์์ผ๋ก ๋ง๋ ์ฉ์ด๊ฐ ๋ฐ๋ก DI์ธ ๊ฒ์ด๋ค.
์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ
ํ๋๋ฅผ ์ด์ฉํ ์์กด๊ด๊ณ ์ฃผ์ (Field Injection)
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private CourseService courseService;
@Override
public void studentMethod() {
courseService.courseMethod();
}
}
setter() ๋ฉ์๋๋ฅผ ์ด์ฉํ ์์กด๊ด๊ณ ์ฃผ์ (Setter Injection)
@Service
public class StudentServiceImpl implements StudentService {
private CourseService courseService;
@Autowired
public void setCourseService(CourseService courseService) {
this.courseService = courseService;
}
@Override
public void studentMethod() {
courseService.courseMethod();
}
}
์์ฑ์๋ฅผ ์ด์ฉํ ์์กด๊ด๊ณ ์ฃผ์ (Constructor Injection)
@Service
public class StudentServiceImpl implements StudentService {
private final CourseService courseService;
@Autowired
public StudentServiceImpl(CourseService courseService) {
this.courseService = courseService;
}
@Override
public void studentMethod() {
courseService.courseMethod();
}
}
๐ก ์ถํ ๊ฐ ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ์์ ๋น๊ตํ๋ฉฐ ๊ฒฐ๊ตญ์๋ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผํ๋ ์ด์ ์ ๋ํด์ ์ถ๊ฐ ์ค๋ช ํ ํ ๋ ์ฐธ๊ณ ๋ฐ๋๋ค.
์ถ์ฒ
์์กด๊ด๊ณ ์ฃผ์
martinfowler.com/articles/injection.html
์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผ ํ๋ ์ด์
yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง์ MVC (0) | 2021.06.15 |
---|---|
@Autowired์ ๋์์๋ฆฌ (1) | 2021.05.12 |
์คํ๋ง ์ปจํ ์ด๋(BeanFactory, ApplicationContext) (1) | 2021.05.06 |
POJO(Plain Old Java Object) (0) | 2021.04.28 |