반응형
01. 🌈Spring IoC(제어의역행)의 장점🌈
- 팩토리클래스 안만들어도 됨 : 스프링이 기본적으로 그 역할을 해줌
- 다른 클래스를 고칠 필요가 없음
- 그 전에는 HelloMessageObject에서 HiMessageObject클래스로 변경하고 싶다면?
- 팩토리클래스 뿐만 아니라 Service클래스도 조금은 변경이 필요했음
- 하지만, Spring은 팩토리 역할을 하는 xml환경설정파일만 수정하면됨!
- 또한, 팩토리클래스처럼 객체도 만들어주지만, 객체 간의 관계까지 설정해줌 : xml파일 외 다른 프로그램을 수정할 필요가 없다는 뜻임
- 결합도를 완전히 느슨하게 했음!!
02. 일종의 DAO클래스
(부모) src.main.java > xyz.itwill03.spring > MessageObject.java
package xyz.itwill03.spring;
public interface MessageObject {
String getMessage();
}
(자식) src.main.java > xyz.itwill03.spring > HelloMessageObject.java
package xyz.itwill03.spring;
public class HelloMessageObject implements MessageObject {
@Override
public String getMessage() {
return "Hello!!!";
}
(자식) src.main.java > xyz.itwill03.spring > HiMessageObject.java
package xyz.itwill03.spring;
public class HiMessageObject implements MessageObject {
@Override
public String getMessage() {
return "Hi!!!";
}
}
03. 💖Spring Bean Configuration File
[src.main.resources > 03_message.xml]
- 스프링 컨테이너가 관리하는 환경설정파일
- 💖팩토리클래스 역할해줌 - 대신 객체생성
스프링 컨테이너가 관리하는 환경설정 파일 만드는 법
- 스키마 파일에 대한 namespace 설정해 생성하기
- beans 이라는 namespace가 제공해주는 스키마파일의 경로로 환경설정이 완료됨
- 스프링 빈 - 스프링 컨테이너가 만들어주는 객체
스프링 컨테이너(S)가 사용하는 Bean(커피콩) Configuration File 이라는 뜻
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="<http://www.springframework.org/schema/beans>"
xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
xsi:schemaLocation="<http://www.springframework.org/schema/beans> <https://www.springframework.org/schema/beans/spring-beans.xsd>">
<!-- 스프링 컨테이너는 환경설정파일(Spring Bean Configuration File - XML)로부터 클래스를
제공받아 객체를 생성하여 관리 - Spring Bean : 스프링 컨테이너에 의해 관리되는 객체(클래스) -->
<!-- => 스프링 컨테이너는 리플렉션(Reflection) 기술을 사용하여 객체를 생성함 -->
<!-- => 클래스의 경로만 알고 있으면(xyz.itwill03.spring.HelloMessageObject)
class.forName()을 호출해 클래스를 읽어서 클래즈 객체를 만들고 객체의 생성자를 제공받아 해당 객체를 만들어줌
- 이렇게 만든 객체는 실행될 때 메모리에 생성되며 접근지정자에 상관없이 필드나 메소드 사용 가능 -->
<!-- bean 엘리먼트를 사용하여 스프링 컨테이너에게 Spring Bean으로 사용될 클래스 제공 : 자동완성됨 -->
<bean class="xyz.itwill03.spring.HelloMessageObject" id="helloMessageObject"/><!-- 스프링컨테이너가 알아서 객체 만들어줌, 구분할 식별자도 지정 -->
<bean class="xyz.itwill03.spring.HiMessageObject" id="hiMessageObject"/>
<!-- bean 엘리먼트의 하위 엘리먼트를 사용하여 Spring Bean에 대한 포함관계 설정 - 의존성 주입 -->
<bean class="xyz.itwill03.spring.MessagePrint" id="messagePrint">
<!-- object 필드에는 helloMessageObject객체를 가져다 저장 : 포함관계 성립 -->
<!-- <property name="object" ref="helloMessageObject"/> -->
<property name="object" ref="hiMessageObject"/>
</bean>
</beans>
04. 일종의 Service클래스
src.main.java > xyz.itwill03.spring > MessagePrint.java
package xyz.itwill03.spring;
public class MessagePrint {
//MessageObject 인터페이스를 상속받은 자식클래스의 객체를 저장하기 위한 필드
//=> 필드에 객체를 저장해야만 포함관계 성립 - 포함관계의 클래스에 작성된 메소드 호출 가능
private MessageObject object;
public MessageObject getObject() {
return object;
}
public void setObject(MessageObject object) {
this.object = object;
}
public void messagePrint() {
String message=object.getMessage();
System.out.println("message = "+message);
}
}
05. 일종의 요청처리
src.main.java > xyz.itwill03.spring > MessagePrintApp.java
package xyz.itwill03.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//스프링 컨테이너(Spring Container)를 이용해 객체를 생성하여 제공받아 사용
// => Spring Container : Spring Framework에서 프로그램 작성에 필요한 객체를 관리하는 컴퍼넌트
// => 프로그래머가 아닌 스프링 컨테이너가 객체 관리 - Spring IoC
// => 스프링 컨테이너는 환경설정파일(Spring Bean Configuration File - XML)을 이용하여 객체의
//생명주기(Life Cycle) 관리 및 객체간의 관계 설정
//=> XML파일 안 : 이 객체랑 이 객체랑 관계 좀 맺어줘! - 라고 하면 spring이 알아서 관계를 맺어줌
public class MessagePrintApp {
public static void main(String[] args) {
/*
//객체간의 관계를 맺기 위해 프로그램을 이용함
HelloMessageObject object = new HelloMessageObject();
MessagePrint print = new MessagePrint();
print.setObject(object); //포함관계 성립 - 필드에 HelloMessageObject 객체 저장
print.messagePrint();
//개발자가 직접 관계도 설정함, old의 방법과 거의 비슷하다고 볼 수 있음 - 이건 스프링의 방법이 아님
*/
//ApplicationContext 객체(스프링 컨테이너 기능을 제공하는 객체) 생성
//Spring Bean Configuration File을 제공받아 Spring Bean을 생성하여 관리
ApplicationContext context = new ClassPathXmlApplicationContext("03_message.xml");
//스프링 컨테이너로부터 필요한 Spring Bean를 제공받아 저장
// => Spring Bean을 구분하기 위한 식별자(beanName 또는 beanId)를 전달
MessagePrint print=(MessagePrint)context.getBean("messagePrint");
print.messagePrint();
//스프링 컨테이너 제거
((ClassPathXmlApplicationContext)context).close();
}
}
반응형
'framework > spring IOC(제어의 역행)' 카테고리의 다른 글
[springIOC] 6. DI | 자동주입 | 자동으로 Inject 하는 법 (0) | 2024.07.28 |
---|---|
[springIOC] 5. DI | 수동주입 | Constructor Injection & Setter Injection (0) | 2024.07.28 |
[springIOC] 4. DI | 수동주입 | 집합객체로 의존성 주입해 객체 생성하는법 (0) | 2024.07.27 |
[springIOC] 3. 스프링 Bean 클래스 생성법 | DL | 룩업기능 (feat. ApplicationContext 객체) (0) | 2024.07.27 |
[springIOC] 1. 결합도가 높은 프로그램 vs 결합도가 낮은 프로그램(팩토리클래스의 역할) (0) | 2024.07.26 |