Spring 1일차

post-thumbnail

뉴렉처 님의 스프링 강의를 보며 작성 중이고 공부 기록용 입니다.
참고만 부탁드립니다.

IoC 컨테이너

  • Inversion of Control Container
  • 스프링에서 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너

Spring DI 지시서 작성하기

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 파일에 지시서를 작성해야한다.
  • 소스 코드의 수정을 최소화하여 프로그램을 수정할 수 있도록 설정 부분을 외부로 빼는 작업이다.
  • Spring 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 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>
  • <bean> 태그는 객체를 생성한다.
  • <bean> 태그의 id는 고유의 이름을 설정한다.(변수 설정하듯이)
  • <bean> 태그의 class는 생성할 객체의 주소를 설정한다.

<property> 태그를 확인할 수 있는데 이는 setter 함수를 사용한다. name="exam" 부분은 setExam() 이라는 set 함수를 묵시적으로 표현하는 것이다. 따라서 이는 위에서 생성한 exam이라는 객체를 console 객체에 주입하는 과정인 것이다.

Spring IoC 컨테이너 이용하기(Application Context)

<Application Context 생성하기>

ApplicationContext context = new
ClassPathXmlApplicationContext("config.xml");

<Application Context 종류>

  1. ClassPathCXmlApplicationContext
  • 어플리케이션 root로 부터 경로지정
  1. FileSystemXmlApplicationContext
  • xml이 현재 파일시스템의 어느 곳의 경로에 있다.
  1. XmlWebApplicationContext
  • Web의 url을 통해서 지정
  1. AnnotationConfigApplicationContext
  • Annotation을 이용해서 넘겼다.
<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>  
  • 자동으로 필요한 라이브러리를 다운받아준다.


    위의 코드를 복사하여 <dependencies></dependencies> 태그 사이에 붙여넣기 하면된다.

위에서 setting.xml에 지시서를 작성하였으니 이제 지시서에 작성한 내용을 불러와야한다.

ApplicationContext context = new ClassPathXmlApplicationContext("지시서 경로");

그 다음으로는 context에 지시서 객체가 생성되고 해당 객체에서 Bean을 가져온다. 그 방법으로는 두 가지 방법이 있는다.

  1. 이름으로 가져오기

ExamConsole console = (ExamConsole) context.getBean("console");

  1. 자료형명으로 가져오기

ExamConsole console = context.getBean(ExamConsole.class);

값 형식 DI

클래스 내부의 변수에도 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>
  • setting.xml파일에 값 형식의 변수를 설정하였다면 해당클래스에 위의 변수들을 set할 수있는 함수들이 있어야한다.

  • 아래와 같은 방법도 가능하다.
<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>

생성자 DI

일반적으로 객체를 생성할 때 생성자를 통해 값을 전달할 수도 있다. 이때 이것을 어떻게 처리해야 할까?

<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>
  • 필요하면 type도 명시할 수 있다.

또한 아래와 같이 단일 태그로도 설정이 가능하다.

<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="20"/>

하지만 위의 방법을 쓰려면 네임스페이를 추가해야한다.

위의 사진에 p를 체크하면 아래의 코드가 xml파일에 추가된다.

xmlns:p="http://www.springframework.org/schema/p"

콜렉션 생성과 DI

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으로 넘어왔는데 이해하기가 꽤 힘들다. 하지만 꾸준히 해보자

0개의 댓글