
뉴렉처 님의 스프링 강의를 보며 작성 중이고 공부 기록용 입니다.
참고만 부탁드립니다.
package spring.di;
import spring.di.entity.Exam;
import spring.di.entity.NewlecExam;
import spring.di.ui.ExamConsole;
import spring.di.ui.GridExamConsole;
import spring.di.ui.InlineExamConsole;
public class Program {
public static void main(String[] args) {
/*
* Exam exam = new NewlecExam();
* ExamConsole console = new GridExamConsole();
* console.setExam(exam);
*/
console.print();
}
}
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam" />
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"/><!-- setter함수를 쓰는 것 -->
</bean>
</beans>
<property> 태그를 확인할 수 있는데 이는 setter 함수를 사용한다. name="exam" 부분은 setExam() 이라는 set 함수를 묵시적으로 표현하는 것이다. 따라서 이는 위에서 생성한 exam이라는 객체를 console 객체에 주입하는 과정인 것이다.
<Application Context 생성하기>
ApplicationContext context = new
ClassPathXmlApplicationContext("config.xml");
<Application Context 종류>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
</dependency>
</dependencies>


위에서 setting.xml에 지시서를 작성하였으니 이제 지시서에 작성한 내용을 불러와야한다.
ApplicationContext context = new ClassPathXmlApplicationContext("지시서 경로");
그 다음으로는 context에 지시서 객체가 생성되고 해당 객체에서 Bean을 가져온다. 그 방법으로는 두 가지 방법이 있는다.
ExamConsole console = (ExamConsole) context.getBean("console");
ExamConsole console = context.getBean(ExamConsole.class);
클래스 내부의 변수에도 xml파일을 통해 값을 설정할 수 있다.
<bean id="exam" class="spring.di.entity.NewlecExam">
<property name="kor" value="20"/>
<property name="eng" value="50"/>
<property name="math" value="80"/>
</bean>


<bean id="exam" class="spring.di.entity.NewlecExam">
<property name="kor">
<value>10</value>
</property>
<property name="eng" value="50"/>
<property name="math" value="80"/>
</bean>
일반적으로 객체를 생성할 때 생성자를 통해 값을 전달할 수도 있다. 이때 이것을 어떻게 처리해야 할까?
<constructor-arg></constructor-arg>
위의 태그를 이용하면 된다.
<bean id="exam" class="spring.di.entity.NewlecExam">
<constructor-arg name="kor" value="10"/>
<constructor-arg name="eng" value="20"/>
<constructor-arg name="com" value="30"/>
<constructor-arg name="math" value="40"/>
</bean>

또한 아래와 같이 단일 태그로도 설정이 가능하다.
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="20"/>
하지만 위의 방법을 쓰려면 네임스페이를 추가해야한다.

위의 사진에 p를 체크하면 아래의 코드가 xml파일에 추가된다.
xmlns:p="http://www.springframework.org/schema/p"
List<Exam> exams = (List<Exam>) context.getBean("exams");
exams.add(new NewlecExam(1, 1, 1, 1));
for(Exam e : exams)
System.out.println(e.toString());
리스트를 만들고 이를 설정 xml 파일에서 이름으로 불러와서 리스트에 add를 하고 이를 출력하는 코드이다. 하지만 이 작업을 xml 파일에서도 할 수 있다.
"첫번째 방법"
<bean id="exams" class="java.util.ArrayList">
<constructor-arg>
<list>
<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1"/> 직접추가
<ref bean="exam"/> 위에있는 객체를 참조
</list>
</constructor-arg>
</bean>
bean으로 해당 class의 해당되는 bean 태그를 작성하고 내부에 <constructor-arg>에 태그와 <list>라는 것을 명시하는 태그를 작성한다. 그리고 <bean> 태그를 통해 값을 설정한다. <ref> 태그는 이미 있는 변수를 참조하여 추가하는 것이다.
"두번째 방법"
<util:list id="exams" list-class="java.util.ArrayList">
<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1"/> <!-- 직접추가 -->
<ref bean="exam"/> <!-- 위에있는 객체를 참조 -->
</util:list>
위 방법은 namespace를 추가하여 사용한 방법이다.
Namespaces 부분으로가서

위 부분을 체크하면 사용 가능하다.
1강~11강
<오늘의 느낀점>
이제 Oracle, JDBC, JSP/Servlet 강의를 듣고 Spring으로 넘어왔는데 이해하기가 꽤 힘들다. 하지만 꾸준히 해보자