본문 바로가기
SpringRealize

[자바로 스프링 구현하기] 1. IoC 컨테이너

by 서피 2021. 5. 29.

[SpringRealize 프로젝트] - 자바로 스프링 프레임워크 구현하기

 

스프링을 이해하기 위해 자바 코드로 스프링을 직접 구현해가는 과정이다.

Spring Framework Core 공식 문서(영문)를 통해 공부하였으므로 의역이 있다.


0. 프로젝트 생성하기

IDE는 이클립스를 이용한다.

File - New - Project... - Spring Starter Project - Next 클릭 ... 를 통해 Spring Legacy Project를 생성했다.

 

 

최상위 패키지명은 com.kdh.common 으로 지어주었다.

 

 

1. Service, Dao 클래스 만들기

먼저 자바 빈으로 등록할 클래스들을 생성한다.

학생 서비스 인터페이스, 학생 다오 인터페이스 및 각각의 구현체가 필요하다.

dao 패키지 - StudentDao (인터페이스), StudentDaoImpl

service 패키지 - StudentService (인터페이스), StudentServiceImpl

/*
 * 서비스 인터페이스
 */
public interface StudentService {

	List<String> printStudentNameList();

}

 

/*
 * 서비스 구현체
 */
public class StudentServiceImpl implements StudentService {
	
	StudentDao studentDao;

	@Override
	public List<String> printStudentNameList() {
		return studentDao.getStudentNameList();
	}

	public StudentDao getStudentDao() {
		return studentDao;
	}

	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
}

 

/*
 * 다오 인터페이스
 */
public interface StudentDao {

	List<String> getStudentNameList();

}

 

/*
 * 다오 구현체
 */
public class StudentDaoImpl implements StudentDao {
	
	List<String> studentList = new ArrayList<String>();
	
	public StudentDaoImpl() {
		studentList.add("김길동");
		studentList.add("홍길동");
		studentList.add("최길동");
	}
	
	@Override
	public List<String> getStudentNameList() {
		return studentList;
	}
}

StudentDaoImpl에는 학생 리스트를 만들어 넣어주었다.


2. IoC 컨테이너 만들기

컨테이너를 만들기 위해서는 먼저 xml파일에 bean정의들을 넣어주고, 그 xml파일을 자바로 불러와야 한다.

Service와 Dao의 구조를 정의할 xml파일을 각각 만들어준다.

 

파일의 경로는 다음과 같다.

 

service.xml

<?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">

    <bean id="studentService" class="com.kdh.student.service.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"/>
    </bean>

</beans>

 

 

daos.xml

<?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">

    <bean id="studentDao" class="com.kdh.student.dao.StudentDaoImpl">
    </bean>

</beans>

 

서비스와 다오를 각각 빈 객체로 구성해주었다.

이를 이용해  studentService빈을 부르면 StudentServiceImpl이 리턴되고, studentDao빈을 부르면 StudentDaoImpl이 리턴된다.

 

빈의 이름을 정하기 위해 id 혹은 name 속성을 이용할 수 있으며, id의 경우 전체 빈 중 유일한 값이어야 한다.

 


3. 컨테이너 구성하기

앞서 만든 xml파일들을 자바에서 불러올 차례이다.

컨테이너 역할을 할 SpringRealizeIocContainer.java 클래스 파일을 하나 생성해준다.

/*
 * Ioc 컨테이너
 */
public class SpringRealizeIocContainer {
	
	// xml 파일을 불러온다.
	ApplicationContext context = new ClassPathXmlApplicationContext("xml/services.xml", "xml/daos.xml");
	
	public StudentService getStudentService() {
		// xml파일에서 beanName에 맞는 빈을 가져온다.
		StudentService service = context.getBean("studentService", StudentService.class);
		return service;
	}
}

getStudentService

() - service.xml, daos.xml 파일을 불러와 빈 구성 정보를 읽은 뒤, studentService 라는 이름의 빈을 찾아서 반환한다.


4. Controller에서 컨테이너 객체 사용하기

MVC 중 C의 역할을 해줄 객체이다.

빈으로 등록해주었던 StudentService 객체를 SpringRealizeIocContainer 클래스를 통해 가져와주었다.

public class StudentController {
	
	StudentService service = new SpringRealizeIocContainer().studentService();
	
	public String viewStudentList () {
		return service.printStudentNameList().toString();
	}
	
}

 

 

5. 실행시키기

View 역할을 해줄 객체 Run을 _run 이라는 패키지 내부에 생성한다.

_ 를 붙인 이유는 패키지가 맨 위로 오게 하기 위해서이다.

 

브라우저 없이 실행시키기 위해 main함수를 생성하고, Controller에서 학생목록을 불러와 출력한다.

/*
 * 클라이언트 역할을 하는 클래스
 */
public class Run {
	
	public static void main(String [] args) {
		System.out.println(new StudentController().viewStudentList());
	}
}

 

 

실행 결과

studentList값

Ioc Container객체를 이용해 빈 파일을 읽어와 서비스, 다오를 생성해주었고, 이를 Run.java(View)에 정상적으로 출력하였다.

 

이어서 xml으로 진행한 설정들을 어노테이션 방식으로 변환한다.

 

 

 

 

 


다음 글 - [자바로 스프링 구현하기] 2. DispatcherServlet

'SpringRealize' 카테고리의 다른 글

[SpringRealize] 스프링 Core 이해하기 - IoC Container  (0) 2021.05.23

댓글