IoC(Inversion of Control) : 그동안은 개발자가 객체를 new(방식을)를 통해 만들고 제어권을 가지고 있었다면,
스프링에선 Spring Bean Configuration file, java file 로 스프링 자체에서 객체 생성이 가능하고 즉 이 만들어주고 관리해주는 컨테이너에게 제어권을 반환해준다는 의미
DI(Dependency Injection) : 의존성 삽입. 그동안은 개발자가 생성자와 setter를 통해서 값을 주입했다면 DI는 스프링이 알아서 객체에 "값을 주입"한다.
Spring이 지원하는 2가지 DI 유형 - SI (Setter Injection): Setter Method를 명시하여 자동적으로 의존성 삽입이 이루어 지는 유형
- CI (Constructor Injection): 인자를 가지고 있는 생성자를 호출 할때 의존성 삽입이 이루어 지는 유형
예시를 볼까.
bean-context.xml 파일 (메타데이터를 bean화 시켜 생성, 관리하는 파일)
bean.context 1번
<bean id="calc" class="spring.Calculator" />
bean.context 2번
<bean id="computer" class="spring.Computer">
<property name="model"> <!-- 필드 중 1개 -->
<value>IMac</value> <!-- 필드의 일반 값 -->
</property>
<property name="a"> <!-- 필드 중 1개 -->
<value>10</value> <!-- 필드의 일반 값 -->
</property>
<property name="b"> <!-- 필드 중 1개 -->
<value>3</value> <!-- 필드의 일반 값 -->
</property>
<property name="calculator"><!-- 필드 중 1개 -->
<ref bean ="calc" /> <!-- 필드의 다른 빈을 값으로 가지는 경우 *ref* -->
</property>
</bean>
bean.context 3번
<bean id="computer2" class="spring.Computer">
<property name="model" value="Samsung" />
<property name="a" value="1" />
<property name="b" value="2" />
<property name="calculator" ref="calc" />
</bean>
bean.context 4번
<bean id="computer3" class="spring.Computer">
<constructor-arg>
<value>LG</value>
</constructor-arg>
<constructor-arg>
<value>5</value>
</constructor-arg>
<constructor-arg>
<value>1</value>
</constructor-arg>
<constructor-arg>
<ref bean="calc" />
</constructor-arg>
</bean>
IoC 적용 없이 개발자가 직접 처리하는 경우
// bean.context 1번 적용
Calculator calc = new Calculator(); // 개발자가 직접 객체 생성
Computer computer = new Computer(); // 디폴트 생성자
computer.setModel("IMac"); // 값의 주입 (setter이용)
computer.setA(10); // 값의 주입 (setter이용)
computer.setB(5); // 값의 주입 (setter이용)
computer.setCalculator(calc); // 값의 주입 (setter이용)
System.out.println(computer.getModel());
computer.add();
computer.sub();
computer.mul();
computer.div();
*참고* Spring에서 spring 기능 한번 사용 없이 java만 사용해도 동작은 잘 된다.
IoC 적용 : bean-context.xml 을 보고 spring이 bean을 생성한다.
String resourceLocations = "classpath:bean-context.xml";
AbstractApplicationContext ctx = new GenericXmlApplicationContext(resourceLocations);
// bean.context 3번 적용<ctx.getBean("<bean id>", "<bean class>".class)
Computer myCom = ctx.getBean("computer", Computer.class);
System.out.println(myCom.getModel());
myCom.add();
myCom.sub();
myCom.mul();
myCom.div();
// bean.context 3번 적용
Computer yourCom = ctx.getBean("computer2", Computer.class);
System.out.println(yourCom.getModel());
yourCom.add();
yourCom.sub();
yourCom.mul();
yourCom.div();
// bean.context 4번 적용
Computer ourCom = ctx.getBean("computer3", Computer.class);
System.out.println(ourCom.getModel());
ourCom.add();
ourCom.sub();
ourCom.mul();
ourCom.div();
ctx.close();
// spring이 대신 new 작업(객체생성)을 해주어 똑같이 실행이 가능하다.
'Backend > Spring' 카테고리의 다른 글
6. STS / RESTful API 로 user 정보 관리하는 관리자페이지만들기 (0) | 2020.09.12 |
---|---|
5. STS / REST API (0) | 2020.09.07 |
4. STS / Mybatis 게시판에 이미지 업로드하고 다운로드 받기 (0) | 2020.09.04 |
3. STS 로 랜덤한 숫자의 인증코드 이메일로 보내고 인증절차 거치기 (0) | 2020.09.02 |
2. List/Set/Map handler (0) | 2020.08.20 |