SPRING_IoC & Container
๐ SPRING
๐ IoC & Container
IoC ( Inversion of Control ) ๋
- ๋ฉ์๋๋ ๊ฐ์ฒด์ ํธ์ถ์์ ์ ๊ฐ๋ฐ์๊ฐ ๊ฒฐ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ฒฐ์ ๋๋ ๊ฒ
- ๊ฐ์ฒด์ ์์กด์ฑ์ ์ญ์ ์์ผ ๊ฒฐํฉ๋๋ฅผ ์ค์ด๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํ์ฌ ๊ฐ๋ ์ฑ ๋ฐ ์ฝ๋ ์ค๋ณต, ์ ์ง ๋ณด์๋ฅผ ํธํ๊ฒ ํ ์ ์๊ฒ ํ๋ค.
- IoC / DI
- ๊ฐ์ฒด์งํฅ ์ธ์ด์์ Object ๊ฐ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ๋ฐํ์์ ๊ฒฐ์
- ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๊ฐ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋จ ( loose coupling ) ( new ๋ก ๊ฐ์ฒด ์ ์ธ์ ๊ฐํ ์ฐ๊ฒฐ์ด๋ค )
- IoC์ ๊ตฌํ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ DI ( Dependency Injection )
- ์ฝ๊ฒ ๋งํ๋ฉด ๊ธฐ์กด์๋ ๊ฐ์ฒด๋ฅผ ํ์ํ ๋ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค๋ฉด IoC ๋ ๋ฌด์กฐ๊ฑด ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
IoC ( Inversion of Control ) ๊ฐ๋
- ๊ฐ์ฒด ์ ์ด ๋ฐฉ์
- ๊ธฐ์กด : ํ์ํ ์์น์์ ๊ฐ๋ฐ์๊ฐ ํ์ํ ๊ฐ์ฒด ์์ฑ ๋ก์ง ๊ตฌํ
- IoC : ๊ฐ์ฒด ์์ฑ์ Container์๊ฒ ์์ํ์ฌ ์ฒ๋ฆฌ
- IoC ์ฌ์ฉ์ ๋ฐ๋ฅธ ์ฅ์
- ๊ฐ์ฒด๊ฐ ๊ฒฐํฉ๋๊ฐ ๋์ผ๋ฉด
- ํด๋น ํด๋์ค๊ฐ ์ ์ง๋ณด์ ๋ ๋ ๊ทธ ํด๋์ค์ ๊ฒฐํฉ๋ ๋ค๋ฅธ ํด๋์ค๋ ๊ฐ์ด ์ ์ง๋ณด์ ๋์ด์ผํ ๊ฐ๋ฅ์ฑ์ด ๋์ ( ์ํฅ์ ๋ง์ด ์ค๋ค. )
- ํด๋น ํด๋์ค๊ฐ ์ ์ง๋ณด์ ๋ ๋ ๊ทธ ํด๋์ค์ ๊ฒฐํฉ๋ ๋ค๋ฅธ ํด๋์ค๋ ๊ฐ์ด ์ ์ง๋ณด์ ๋์ด์ผํ ๊ฐ๋ฅ์ฑ์ด ๋์ ( ์ํฅ์ ๋ง์ด ์ค๋ค. )
๊ฐ์ฒด๊ฐ ๊ฐํ ๊ฒฐํฉ
- ํด๋์ค ํธ์ถ ๋ฐฉ์
- ํด๋์ค๋ด์ ์ ์ธ๊ณผ ๊ตฌํ์ด ๋ชจ๋ ๋์ด ์์ผ๋ฏ๋ก ๋ค์ํ ํํ๋ก ๋ณํ๊ฐ ๋ถ๊ฐ๋ฅ ํ๋ค.
- MemberService ๊ตฌํ์ฒด์ AdminService ๊ตฌํ์ฒด๋ฅผ HomeController์์ ์ง์ ์์ฑํ์ฌ ์ฌ์ฉํ๋ค.
- MemberService ๋๋ AdminService๊ฐ ๊ต์ฒด๋๊ฑฐ๋ ๋ด๋ถ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด HomeController๊น์ง ์์ ํด์ผํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
- ๊ฐํ ๊ฒฐํฉ
public class HomeController{
---
private MemberServiceImpl memberService = new MemberServiceImpl();
private AdminServiceImpl adminservice = new AdminServiceImpl();
---
-> ๊ตฌํ์ฒด๋ฅผ ์ง์ ์์ฑ
public void addUser(MemberDto memberDto){
memberService.joinMember(memberDto);
adminService.registerMember(memberDto);
}
}
๊ฐ์ฒด ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ ๋คํ์ฑ์ ํตํด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถค
์ธํฐํ์ด์ค ํธ์ถ ๋ฐฉ์
- ๊ตฌํ ํด๋์ค ๊ต์ฒด๊ฐ ์ฉ์ดํ์ฌ ๋ค์ํ ํํ๋ก ๋ณํ ๊ฐ๋ฅ
- ํ์ง๋ง ์ธํฐํ์ด์ค ๊ต์ฒด ์ ํธ์ถ ํด๋์ค๋ ์์ ํด์ผ ํจ
-
๊ฐ์ฒด ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ ๋คํ์ฑ์ ํตํด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
- MemberService์ AdminService๋ CommonService ๋ฅผ ์์๋ฐ๋๋ค.
- HomeController์์ ๊ฐ ์๋น์ค๋ฅผ ์ด์ฉ ์ MemberService์ AdminService๋ CommonService Type์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
1.
public interface MemberService extends CommonService{
}
2.
public interface AdminService extends CommonService{
}
public class HomeController{
private CommonService memberService = new MemberServiceImpl();
private CommonService adminservice = new AdminServiceImpl();
// ๋ชจ๋ CommonService ํ์
์ผ๋ก ์ด์ฉ ๊ฐ๋ฅ
public void addUser(MemberDto memberDto){
memberService.registerMember(memberDto);
adminService.registerMember(memberDto);
}
}
ํฉํ ๋ฆฌ ํธ์ถ ๋ฐฉ์
- ํฉํ ๋ฆฌ ๋ฐฉ์์ ํฉํ ๋ฆฌ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์์ฑํ๋ฏ๋ก ํด๋์ค๋ ํฉํ ๋ฆฌ๋ฅผ ํธ์ถํ๋ค.
- ์ธํฐํ์ด์ค ๋ณ๊ฒฝ ์ ํฉํ ๋ฆฌ๋ง ์์ ํ๋ฉด ๋๋ค. ํธ์ถ ํด๋์ค์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- ํ์ง๋ง ํด๋์ค์ ํฉํ ๋ฆฌ๋ฅผ ํธ์ถํ๋ ์์ค๊ฐ ๋ค์ด๊ฐ์ผํ๋ค. ๊ทธ๊ฒ์ด ํฉํ ๋ฆฌ์ ์์กดํจ์ ์๋ฏธํ๋ค.
-
๊ฐ์ฒด ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ ํฉํ ๋ฆฌ๋ฅผ ํตํด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
- ๊ฐ Service๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ Factory๋ฅผ ์ฌ์ฉ
- Service๋ฅผ ์ด์ฉํ๋ ์ชฝ์์๋ interface๋ง ์๊ณ ์์ผ๋ฉด ์ด๋ค ๊ตฌํ์ฒด๊ฐ ์ด๋ป๊ฒ ์์ฑ๋๋์ง์ ๋ํด ์ ํ์๊ฐ ์๋ค.
- ์ด Factory ํจํด์ด ์ ์ฉ๋ ๊ฒ์ด Container์ ๊ธฐ๋ฅ์ด๋ฉฐ ์ด Container์ ๊ธฐ๋ฅ์ ์ ๊ณตํด ์ฃผ๊ณ ์ ํ๋ ๊ฒ์ด IoC ๋ชจ๋์ด๋ค.
// ๊ฐ ์๋น์ค๋ฅผ ์์ฑํ์ฌ ๋ฐํํด์ฃผ๋ factory
public class ServiceFactory{
public static CommonService getMemberService(){
return new MemberServiceImpl();
}
public static CommonService getAdminService(){
return new AdminServiceImpl();
}
}
public class HomeController{
private CommonService memberService = ServiceFactory.getMemberService();
private CommonService adminservice = ServiceFactory.getAdminService();
...
}
IoC ํธ์ถ ๋ฐฉ์
- ํฉํ ๋ฆฌ ํจํด์ ์ฅ์ ์ ๋ํ์ฌ ์ด๋ ํ ๊ฒ์๋ ์์กดํ์ง ์๋ ํํ๊ฐ ๋๋ค.
- ์คํ์์ ( runtime )์ ํด๋์ค ๊ฐ์ ๊ด๊ณ๊ฐ ํ์ฑ์ด ๋จ
- ๊ฐ Service์ LifeCycle์ ๊ด๋ฆฌํ๋ Assembler๋ฅผ ์ฌ์ฉํ๋ค.
- Spring Container๊ฐ ์ธ๋ถ ์กฐ๋ฆฝ๊ธฐ(Assembler) ์ญํ ์ ํ๋ค.
servlet-context.xml์ bean ์ค์ ์ ํด์ค๋ค !!
xml ๋ฒ์ ผ๊ณผ annotation ๋ฒ์ ผ์ด ์๋๋ฐ annotation ๋ฒ์ ผ์ ๋ง์ด ์ฌ์ฉํ๋ค.
Spring ๊ตฌํ์ฒด ๊ฐ์ฒด์ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ Spring Container ๊ฐ ํด์ค๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">+
<!-- xml ๋ฒ์ ผ -->
<bean id="memberService" class="com.test.hello.service2.MemberServiceImpl"/>
<bean id="adminService" class="com.test.hello.service2.AdminServiceImpl"/>
<!-- annotation ๋ฒ์ ผ -->
<context:component-scan base-package="com.test.hello.service2" />
// xml ๋ฒ์ ผ
ApplicationContext context = new ClassPathXmlApplicationContext("com/test/hello/controller4/applicationContext.xml");
CommonService memberService = context.getBean("memberService", MemberService.class);
CommonService adminService = context.getBean("adminService", AdminService.class);
// annotation ๋ฒ์ ผ
@Service
public class MemberService{
}
@Service
public class AdminService{
}
IoC ( Inversion of Control ) ์ ํ
- Dependency Lookup
- ์ปจํ ์ด๋๊ฐ lookup context๋ฅผ ํตํด์ ํ์ํ Resource๋ Object๋ฅผ ์ป๋ ๋ฐฉ์
- JNDI ์ด์ธ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด JNDI ๊ด๋ จ ์ฝ๋๋ฅผ ์ค๋ธ์ ํธ ๋ด์์ ์ผ์ผ์ด ๋ณ๊ฒฝํด ์ฃผ์ด์ผ ํจ.
- Lookup ํ Object๋ฅผ ํ์ํ ํ์ ์ผ๋ก Casting ํด ์ฃผ์ด์ผ ํจ
- Naming Exception์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ก์ง์ด ํ์ํ๋ค.
- ์ฝ๊ฒ ๋งํ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ค ํด์ผํ๋ค.
-
Dependency Injection ( DI )
- ์คํ๋ง์ด ๋ค๋ฅธ ํ๋ ์์ํฌ์ ์ฐจ๋ณํ๋์ด ์ ๊ณตํ๋ ์์กด๊ด๊ณ ์ฃผ์
- ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ์์ฑํ ํ ์ฃผ์ ์์ผ์ฃผ๋ ๋ฐฉ์
- ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๊ณ ์ ์ฐ์ฑ์ด ๋์์ง๋ค.
- Object์ lookup ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ปจํ ์ด๋๊ฐ ์ง์ ์์กด ๊ตฌ์กฐ๋ฅผ Object์ ์ค์ ํ ์ ์๋๋ก ์ง์ ํด ์ฃผ๋ ๋ฐฉ์
- ํด๋์ค ๋ณ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ๋ค์ด ๊ณง DI๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- Object๊ฐ ์ปจํ ์ด๋์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ์ ํ์๊ฐ ์์
- Lookup ๊ด๋ จ๋ ์ฝ๋๋ค์ด Object ๋ด์์ ์ฌ๋ผ์ง
- Setter Injection ๊ณผ Constructor Inject
- ์ฝ๊ฒ ๋งํ๋ฉด ์ฐ๋ฆฌ๊ฐ ํ ํ์ ์์ด Container๊ฐ ํด์ค๋ค.
-
Dependency Injection ์ฉ์ด
-
๋น ( Bean )
- ์คํ๋ง์ด IoC ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ ์ค๋ธ์ ํธ
- ์คํ๋ง์ด ์ง์ ๊ทธ ์์ฑ๊ณผ ์ ์ด๋ฅผ ๋ด๋นํ๋ ์ค๋ธ์ ํธ๋ง์ ๋น์ด๋ผ ํ๋ค.
-
๋น ํฉํ ๋ฆฌ ( BeanFactory )
- ์คํ๋ง์ด IoC๋ฅผ ๋ด๋นํ๋ ํต์ฌ ์ปจํ ์ด๋
- Bean์ ๋ฑ๋ก, ์์ฑ, ์กฐํ, ๋ฐํํ๋ ๊ธฐ๋ฅ์ ๋ด๋น
- ์ผ๋ฐ์ ์ผ๋ก BeanFactory๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ์ง ์๊ณ ์ด๋ฅผ ํ์ฅํ ApplicationContext๋ฅผ ์ด์ฉํ๋ค.
-
์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ ( ApplicationContext )
- BeanFactory๋ฅผ ํ์ฅํ IoC ์ปจํ ์ด๋์ด๋ค.
- ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ๊ฐ๋ค.
- ๊ฐ์ข ๋ถ๊ฐ์๋น์ค๋ฅผ ์ถ๊ฐ๋ก ์ ๊ณตํ๋ค.
- BeanFactory ๋ผ๊ณ ๋ถ๋ฅผ ๋๋ ์ฃผ๋ก ๋น์ ์์ฑ๊ณผ ์ ์ด์ ๊ด์ ์์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ผ๊ณ ํ ๋๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ง์ ๊ธฐ๋ฅ์ ๋ชจ๋ ํฌํจํด์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด๋ค. ( ํ์ฅ )
-
์ค์ ์ ๋ณด/ ์ค์ ๋ฉํ์ ๋ณด ( configuration metadata )
- ์คํ๋ง์ ์ค์ ์ ๋ณด๋ ApplicationContext ๋๋ BeanFactory ๊ฐ IoC๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฉํ์ ๋ณด๋ฅผ ๋งํ๋ค. ๊ตฌ์ฑ์ ๋ณด ๋ด์ง๋ ํ์์ ๋ณด๋ผ๋ ์๋ฏธ์ด๋ค.
- ์ค์ ์ ๋ณด๋ IoC ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ Bean ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑํ ๋ ์ฌ์ฉ ๋๋ค.
-
์คํ๋ง ํ๋ ์ ์ํฌ
- ์คํ๋ง ํ๋ ์ ์ํฌ๋ IoC ์ปจํ ์ด๋, ApplicationContext๋ฅผ ํฌํจํด์ ์คํ๋ง์ด ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํตํ์ด ๋งํ ๋ ์ฃผ๋ก ์ฌ์ฉ
-
๋น ( Bean )
Container ๋
- ๊ฐ์ฒด์ ์์ฑ, ์ฌ์ฉ, ์๋ฉธ์ ํด๋นํ๋ ๋ผ์ดํ์ฌ์ดํด์ ๋ด๋นํ๋ค.
- ๋ผ์ดํ์ฌ์ดํด์ ๊ธฐ๋ณธ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์ ํ์ํ ์ฃผ์ ๊ธฐ๋ฅ ์ ๊ณต
Container ๊ธฐ๋ฅ
- ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ
- Dependency ๊ฐ์ฒด ์ ๊ณต
- Thread ๊ด๋ฆฌ
- ๊ธฐํ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํ์ํ ํ๊ฒฝ
Container ํ์์ฑ
- ๋น์ฆ๋์ค ๋ก์ง ์ธ์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค์ ๋ํด์๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋๋๋ก ํ๊ธฐ ์ํจ
- ์๋น์ค look up ์ด๋ Configuration์ ๋ํ ์ผ๊ด์ฑ์ ๊ฐ๊ธฐ ์ํจ
- ์๋น์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๊ฐ Factory ๋๋ Singleton ํจํด์ ์ง์ ๊ตฌํํ์ง ์์๋ ๋จ
IoC Container
- ์ค๋ธ์ ํธ์ ์์ฑ๊ณผ ๊ด๊ณ์ค์ , ์ฌ์ฉ, ์ ๊ฑฐ ๋ฑ์ ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋์ ๋ ๋ฆฝ๋ ์ปจํ ์ด๋๊ฐ ๋ด๋น
- ์ปจํ ์ด๋๊ฐ ์ฝ๋ ๋์ ์ค๋ธ์ ํธ์ ๋ํ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์์ด IoC๋ผ ๋ถ๋ฅธ๋ค.
- ์ด๋ฌํ ์ด์ ๋ก ์คํ๋ง ์ปจํ ์ด๋๋ฅผ IoC ์ปจํ ์ด๋๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ
- ์คํ๋ง์์ IoC๋ฅผ ๋ด๋นํ๋ ์ปจํ ์ด๋๋ BeanFactory, ApplicationContext๊ฐ ์๋ค.
Spring DI Container
- Spring DI Container๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ ํ๊ณ , ์ด ๋น๋ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ์๋ฏธ๋ก BeanFactory ๋ผ ํ๋ค.
- Bean Factory ์ ์ฌ๋ฌ ๊ฐ์ง ์ปจํ ์ด๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ApplicationContext ๋ผ ํ๋ค.
Spring Container
-
BeanFactory
- Bean ๊ฐ์ฒด์ ๋ํ ์์ฑ๊ณผ ์ ๊ณต์ ๋ด๋น
- ๋จ์ผ ์ ํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์ฌ๋ฌ ์ ํ์ ๋น์ ์์ฑ, ์ ๊ณต
- ๊ฐ์ฒด๊ฐ์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ค์ , ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ ๋น์ ์์ฑ
- ๋น์ ๋ผ์ดํ ์ฌ์ดํด์ ๊ด๋ฆฌ
-
ApplicationContext
- BeanFactory๊ฐ ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ ์ ๊ณต
- ์ํฐํ๋ผ์ด์ฆ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋๋ฐ ํ์ํ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํจ
- ์ปจํ ์ด๋ ์์ฑ์ ๋ชจ๋ ๋น ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉํจ
-
WebApplicationContext
- ์น ํ๊ฒฝ์์ ์ฌ์ฉํ ๋ ํ์ํ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ฉฐ ํนํ XmlWebApplicationContext๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ