교재 실습/자바 웹 개발 워크북

124. 스프링 IoC 컨테이너 도입부 및 스프링 IoC 컨테이너 사용 준비 (1)

Jint 2022. 10. 2. 21:47

이번 장에서는 스프링 프레임워크(Spring Framework)의 IoC 컨테이너를 사용하여 자바 빈(bean)을 관리하는 방법을 알아본다. 스프링 프레[임워크를 이용하면 우리가 만든 클래스(spms.context.ApplicationContext)를 이용하는 것보다 훨씬 더 쉽고 편리하게 자바 빈을 관리할 수 있다.

스프링 프레임워크는 단순히 빈 관리를 위한 IoC 컨테이너를 넘어서 웹 MVC 아키텍처와 보안, 모바일 등 다양한 분야의 기반 기술을 제공하고 있다. 특히 우리나라에서는 '전자정부 표준 프레임워크'의 기반 기술로 스프링이 사용되고 있다. 정부에서는 특히 공공기관 웹 서비스를 개발할 때 '전자정부 표준 프레임워크'의 사용을 권장하고 있다. 따라서 스프링 사용법을 알아야 하는 것은 선택이 아니라 필수이다.

스프링은 오픈 소스이면서 사용하기 쉽고 성능이 좋아 국내에서 수행되는 많은 SI 프로젝트에서 도입하고 있다. 국내 유명 SI 업체의 전용 프레임워크들(삼성SDS의 Anyframe 등)도 스프링을 기반으로 만든 것이 많기 때문에, 자바 실무 개발자 교육의 최종 목적지는 결국 스프링 프레임워크의 교육으로 귀결될 수밖에 없다. 그러므로 '실무 = 스프링 프레임워크'라는 공식이 무리는 아닐 것이다. 이번 장에서는 스프링의 핵심 기능 중에서 빈 관리를 위한 IoC 컨테이너 사용법을 익히는 데 집중한다. 그리고 예제 프로젝트 SPMS에 적용해 본다.

 

@ 스프링 IoC 컨테이너 사용 준비

이번 절에서는 스프링 프레임워크에서 제공하는 빈(Java Bean) 관리 컨테이너를 사용하여 자바 객체를 관리하는 방법을 배운다. 스프링 프레임워크에서는 빈 관리 컨테이너를 IoC(Inversion of Control) 컨테이너라고 한다. 먼저 용어를 정리한다.

 

1. 의존성 주입(DI)과 역제어(IoC)

6장 미니 MVC 프레임워크 만들기에서 빈의 의존 객체 관리방법으로 의존성 주입(DI, Dependency Injection)을 소개했다. 의존성 주입을 일반적인 용어로 역제어(IoC; Inversion of Control)라고 한다. 즉 역제어(IoC)의 한 형태가 의존성 주입(DI)인 것이다. 역제어란 개발자가 작성한 코드의 흐름에 따라 제어가 이루어지는 것이 아니라 외부에 의해 코드의 흐름이 바뀌는 것을 말한다.

 

- 역제어 사례 1. 이벤트

역제어의 대표적인 예로 이벤트(Event)가 있다. 우리가 카카오톡으로 메시지를 작성하고 있다고 가정한다. 일반적인 흐름이라면 메시지를 입력하고 전송 버튼을 누르면 상대편에게 메시지가 전달되고 상대편이 보낸 메시지가 있다면 화면에 출력할 것이다(그림 1).

그림 1 (메시지 전송 기본 흐름)

하지만, 실제 카카오톡을 사용하다 보면 메시지를 작성하는 중이라도 상대편으로부터 메시지를 받게 되면 즉시 다음 그림과 같이 메시지를 출력한다. 즉 외부에서 발생한 이벤트에 의해 코드 흐름이 바뀐다. 이것이 역제어이다(그림 2).

그림 2 (이벤트 발생으로 흐름 변경)

 

- 역제어 사례 2. 의존성 주입

역제어의 또 다른 예로 의존성 주입(DI, Dependency Injection)이 있다. 예전에는 자신이 사용할 객체(의존 객체, Dependencies)는 자신이 직접 만들어 썼다. 다음 소스 코드를 보면 ProjectListController 클래스는 프로젝트 목록을 가져오기 위해 ProjectDao 객체를 사용하는데, 이렇게 어떤 작업을 처리하기 위해 사용하는 객체를 의존객체라 한다. ProjectListController 클래스는 ProjectDao 객체를 사용하고 위해 직접 인스턴스를 생성하고 있다.

- 예전방식
class ProjectListController {

    public void execute() {
        ProjectDao dao = new ProjectDao();
        ArrayList<Project> projects = dao.list();
        ...
    }
    
}

앞의 방식과 반대(Inversion)되는 방식이 의존성 주입이다. 즉 내부에서 생성하는 것이 아니라 외부에서 의존 객체를 주입하는 것이다. 다음 소스 코드를 살펴보면 셋터 메서드 setProjectDao() 메서드를 통해 외부에서 ProjectDao 객체를 주입하는데, execute() 메서드는 이렇게 외부에서 주입된 객체를 사용한다.

- 의존성 주입을 이용한 방식
class ProjectListController {

    ProjectDao dao;
    
    public void setProjectDao(ProjectDao dao) {
        this.dao = dao
    }
    
    public void execute() {
        ArrayList<Porject> projects = dao.list();
    }
    
    ...

}

 

- 이전방식 : 의존성 주입 방식 = 석기시대 : 현대사회

실생활과 비교하여 의존성 주입을 설명해본다. 석기 시대에는 사회 규모가 작기 때문에 개인이 필요한 물건을 직접 만들어 썼다. 집도 직접 짓고 농작물도 직접 키우고 도구도 직접 만들었다. 하지만 사회가 점점 커지고 복잡해지면서 개인이 모든 것을 직접 만들 수 없게 된다. 필요한 것은 서로 교환하는 방식으로 변화한다. 현대 사회를 보면 개인이 직접 자동차를 만들지 않고 돈 주고 산다.

프로그래밍 세계도 똑같다. 초창기에는 애플리케이션의 크기가 작아서 객체가 필요할 때마다 직접 생성해도 문제가 되지 않았다. 하지만, 애플리케이션 규모가 점점 커지면서 성능이나 유지 보수에 문제가 생기게 된다. 이런 문제를 해결하기 위해 등장한 것이 의존성 주입(DI)이라는 기법이다. 사실 필요한 객체를 외부에서 가져오는 것은 우리가 살아가는 현실의 삶과 일맥상통한다.

우리가 만든 예제는 이미 DI를 적용하여 빈을 관리하고 있다. spms.context 패키지의 ApplicationContext 클래스가 바로 DI 기법으로 빈을 관리하는 IoC 컨테이너이다. 이 클래스를 스프링에서 제공하는 IoC 컨테이너로 대체할 것이다. 그전에 먼저 스프링 IoC 컨테이너를 사용하기 위한 프로젝트를 준비한다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr