[์คํ๋ง๋ถํธ ์ ๋ฌธ] 3. ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์
DI์ IoC
์คํ๋ง์๋ DI(Dependency Injection, ์์กด์ฑ ์ฃผ์ )์ด๋ผ๋ ๊ฐ๋ ์ด ์๋ค. @Autowired๊ฐ ์์ผ๋ฉด ์คํ๋ง์ด ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์์ ์ฐพ์์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ค.
๋ ์คํ๋ง์ @Component ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋กํ๊ณ ์ด๋ฐ ๊ฐ์ฒด๋ค์ ์์ฑ, ์ค์ , ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ค. ์ด๋ ๊ฒ ํ๋ ์์ํฌ(์คํ๋ง)๊ฐ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ IoC(Inversion of Control, ์ ์ด์ ์ญ์ )์ด๋ผ๊ณ ํ๋ค.
์ด๋ ๊ฒ ๊ธ๋ก๋ง ์ฝ์ด์๋ ์ ์๋ฟ์ง ์๋๋ค. ์์ ๋ฅผ ํตํด DI์ IoC์ ๋ํด ์ดํดํด๋ณด๋๋ก ํ์.
์ฝ๋๋ฅผ ๋ณด๊ธฐ ์ MemberController์์ MemberService๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ์. ์ด ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ ์ธํด์ ์ฌ์ฉํ ์๋ ์๋ค.
private final MemberService memberService = new MemberService();
ํ์ง๋ง ์ด MemberService๊ฐ์ฒด๊ฐ ๋ง์ ๊ณณ์์ ์ฌ์ฉ๋์ด์ผ ํ๋ค๋ฉด ์ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ณณ์์ ๋งค ๋ฒ ์ ์ธํ๋ ๊ฒ๋ ๊ท์ฐฎ๊ณ ์ดํ ์ด๋ฆ์ด ๋ฐ๋๊ธฐ๋ผ๋ ํ๋ฉด ๋ชจ๋ ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๋ค. ๋ ์ด ๊ฐ์ฒด๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ์ ์ฅํ๋ค๋ฉด ํ๋๋ง ๋ง๋ค์ด์ ๊ณต์ ํด์ผ ํ ์๋ ์๋ค. ์ด๊ฒ์ ๊ฐํธํ๊ฒ ํด์ฃผ๊ธฐ ์ํ ๊ธฐ๋ฒ์ด ๋ฐ๋ก DI์ด๋ค.
์์
๋จผ์ ์์์ ๋งํ๋ ๋๋ก new๋ฅผ ์ฌ์ฉํ์ง ์๊ณ MemberController์์ MemberService๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง๋ฉด ๋๋ค.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService=memberService;
}
}
@Service
public class MemberService {
}
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด @Controller์ @Service๊ฐ ๋ณด์ผ ๊ฒ์ด๋ค. ์ฌ์ค ์๋งคํ์ผ๋ก @Repository๋ ์๋๋ฐ cmd+click์ ํตํด ํด๋น ์ด๋ ธํ ์ด์ ๋ค์ ์ ์๋ฅผ ๋ณด๋ฉด ์ด๋ฐ ๋ฌธ๊ตฌ๊ฐ ์๋ค.
This annotation serves as a specialization of @Component
์ฆ ์๋ค์ ๋ชจ๋ @Component์ ํน์ ์ผ์ด์ค๋ผ๋ ๊ฒ์ด๋ค. ์คํ๋ง์ด ์คํ๋๋ฉด ์คํ๋ง์ ์ปดํฌ๋ํธ ์ค์บ์ด๋ผ๋ ๊ฒ์ ํ๋ค. ๊ทธ๋ฌ๋ฉด์ @Component๊ฐ ๋ถ์ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์์ฑํด์ ์คํ๋ง ์ปจํ ์ด๋๋ผ๋ ๊ณณ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค. ์ด๋ ๊ฒ ์คํ๋ง์ด ๋์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋ก ์์์ ๋ณธ IoC(Inversion of Control, ์ ์ด์ ์ญ์ )์ด๋ค.
๊ทธ๋ผ ์ด๋ ๊ฒ ์์ฑํ ์คํ๋ง ๋น(๊ฐ์ฒด)๋ค์ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊น? ๊ทธ๊ฑธ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋ ์ด๋ ธํ ์ด์ ์ด ๋ฐ๋ก @Autowired์ด๋ค. MemberController์ฝ๋๋ฅผ ๋ณด๋ฉด @AutoWired ์ด๋ ธํ ์ด์ ๋ฐ์ MemberController์ ์์ฑ์๊ฐ ์๋ค. ๊ทธ ์์ฑ์์์๋ MemberService๋ฅผ ์ธ์๋ก ๋ฐ์ this.memberService์ ๋ฑ๋กํ๋ค. ์ด๋ ์ธ์๋ก ๋ฐ๋ MemberService๊ฐ ๋ฐ๋ก ์คํ๋ง ๋น์ด๋ค. @AutoWired ์ด๋ ธํ ์ด์ ๋๋ถ์ ์คํ๋ง ์ปจํ ์ด๋๋ก๋ถํฐ MemberService๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก DI(Dependency Injection, ์์กด์ฑ ์ฃผ์ )์ด๋ค.
์ ๋ฆฌ
์ด๋ฒ ๊ธ์์๋ DI, IoC์ ๊ฐ๋ ๊ณผ ์ด๋ ธํ ์ด์ ์ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์คํ๋ง๋น์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์๋ค. ์ฌ์ค ์๋ฐ ์ฝ๋๋ฅผ ์ด์ฉํด ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ๋ ์๋๋ฐ ๊ทธ ๋ด์ฉ์ ๋ค์ ๊ธ์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.