spring framework 란?
자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션
- 엔터프라이즈 환경?
대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경
Spirng Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리한다. 객체의 생성 및 소멸 그리고 라이프 사이클을관리하며 언제든 Spring 컨테이너로 부터 필요한 객체를 가져와 사용할 수 있다.
= Spirng은 IOC 기반의 Framework 이다.
IOC 란?
Inversion of Control의 약자 = 제어의 역전
일반적으로 지금까지 프로그램은 객체 결정 및 생성 -> 의존성 객체 생성 -> 객채 내의 메소드 호출 하는 작업을 반복했다. 이는 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 구성하는 작업에 직접적으로 참여함을 의미함. 즉 모든 작업을 사용자가 제어하는 구조
하지만 IOC에서의 객체는 자기가 사용할 객체를 선택하거나 생성하지 않는다. 자신의 모든 권한을 다른 대상에 위임함으로 써 제어권한을 위임받은 특별한 객체에 의해 결정되고 만들어진다.
Spring IOC 컨테이너 사용하기 (ApplicationContext 이용하기)
Program.java
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
ExamConsole console = (ExamConsole) context.getBean("console");
// getBean으로 꺼내올 때 캐스팅 해야함 object로 가져오기 때문.
ExamConsole console = context.getBean(ExamConsole.class); //선호되는 방법
console.print();
IOC 의 구성요소 DI와 DL
IOC는 DI와 DL의 의해 구현된다.
DL(Dependency Lookup) - 의존성 검색
컨테이너에서는 객체들을 관리하기 위해 별도의 저장소에 빈을 저장하는데 이때 컨테이너에서 제공하는 api를 이용하여 사용하고자 하는 빈을 검색하는 방법을 말한다.
- setting.xml 에 bean태그 사용해서 지시하는 방법 (지시서 작성)
<!-- Exam exam = new NewlecExam();을 setting.xml 파일에서 아래와같이 작성하면 된다
패키지명도 같이 써줘야함 class에-->
<bean id ="exam" class="spring.di.entity.NewLecExam" />
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); 아래와 같이 property 태그를 사용해 작성하면 된다.
setExam 에서 set을 생략하고 Exam 의 E를 소문자로 바꿔준다 -->
<property name="exam" ref ="exam" />
</bean>
DI(Dependency Injection) - 의존성 주입
의존성 주입이란 객체가 서로 의존하는 관계가 되게 의존성을 주입하는 것이다. 객체지향 프로그램에서 의존성 이란 하나의 객체가 어떠한 다른 객체를 사용하고 있음을 의미한다. IOC에서의 DI는 각 클래스 사이에 필요로 하는 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것이다.
//setter injection
B b = new B(); //dependency
A a = new A();
a.setB(b);// injection
//construction injection
B b = new B();
A a = new A(b);
- 값 형식 DI
<bean id="exam" class="spring.di.entity.NewLecExam">
<property name="kor" value="10" />
</bean>
- 생성자 DI
property 대신 constructor-arg 를 사용하면 됨. index 속성으로 순서 지정 가능. 동일하게 name 사용 가능.
<bean id="exam" class="spring.di.entity.NewLecExam">
<constructor-arg index="0" value="10" />
<constructor-arg index="1" value="20" />
</bean>
<bean id="exam" class="spring.di.entity.NewLecExam" p:kor="10" p:eng="20" />
콜렉션 생성과 목록 DI
List<Exam> exams = new ArrayList<>();
exams.add(new NewLecExam(1,1,1,1));
for (Exam e : exams)
System.out.println(e);
를 아래와 같이 변경.
setting.xml
<bean id="exams" class="java.util.ArrayList" />
<constructor-arg>
<list>
<bean class="spring.di.entity.NewLecExam" p:kor="10" p:eng="20" />
<ref bean="exam" />
</list>
</constructor-arg>
<util:list id="exams" list-class="java.util.ArrayList">
<bean class="srping.di.entity.NewLecExam" p:kor="10" p:eng="20" />
<ref bean="exam" />
</util:list>
List<Exam> exams = (List<Exam>) context.getBean("exams");
for (Exam e : exams)
System.out.println(e);
'Web과 프로그래밍 언어 > JAVA' 카테고리의 다른 글
[Spring/스프링] Annotation 어노테이션 (@Autowired, @Qulifier, @Component, @Value)의 사용과 java configuration 의 사용 (0) | 2023.06.30 |
---|