본문 바로가기

개발&컴퓨터/개발강좌

스프링(Spring) 프레임워크 기본 개념 강좌 (3) - IoC

반응형

1. 스프링의 핵심 개념

 - 이어서 계속

 

 

 

3) IoC 컨테이너 (스프링 컨테이너)

 * 제어의 역전 – 외부(컨테이너)에서 제어를 함.

 

> 빈(Bean) :
 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트.

 

> 빈 팩토리(Bean Factory) :
 빈(오브젝트)의 생성과 관계 설정 제어를 담당하는 IoC오브젝트.
 좀 더 확장한 애플리케이션 컨텍스트(application context)를 주로 사용.

 

> 애플리케이션 컨텍스트: (IoC 컨테이너 or  스프링 컨테이너)
 DI를 위한 빈 팩토리에 엔터프라이즈 애플리케이션을 개발하는 데 필요한 여러 가지 컨테이너 기능을 추가한 것.

 

> 설정정보/설정 메타정보
 구성정보 or 형상정보 (XML)

 

> 스프링 컨테이너(IoC 컨테이너) :
 IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 의미.

 

IoC컨테이너는 다른 용어로 빈 팩토리(Bean Factory), 애플리케이션 컨텍스트(Application Context) 라고도 불림.
스프링의 IoC 컨테이너는 일반적으로 애플르케이션 컨텍스트를 말함.

 

* 빈 팩토리를 애플리케이션 컨텍스트 또는 IoC컨테이너라 말하기도 하지만, 사실 애플리케이션 컨텍스트는 빈을 좀 더 확장한 개념.
* 애플리케이션 컨텍스트는 그 자체로 IoC와 DI를 위한 빈 팩토리(Bean Factory)이면서 그 이상의 기능을 가짐.
* 빈팩토리와 어플리케이션컨텍스트는 각각 BeanFactory, ApplicationContext 두 개의 인터페이스로 정의
* ApplicationContext 인터페이스는 BeanFactory 인터페이스를 상속한 서브인터페이스.
* 실제로 스프링 컨테이너 또는 IoC 컨테이너라고 말하는 것은 바로 이 ApplicationContext 인터페이스를 구현한 클래스의 오브젝트.
* 컨테이너가 본격적인 IoC 컨테이너로서 동작하려면 POJO클래스와 설정 메타정보가 필요.

   (스프링 애플리케이션 : POJO 클래스와 설정 메타정보를 이용해 IoC 컨테이너가 만들어주는 오브젝트의 조합.)

 

 * IoC 컨테이너
 어떠한 객체의 명세서를 작성하고, 스프링 라이브러리는 해당 명세대로 객체를 생성. 생성된 객체(그리고 디펜던시)들을 보관하는 공간을 의미.

 

 

* EJB : Enterprise Java Bean (엔터프라이즈 자바빈) – 효율적으로 서버 관리를 해주고, 또 프로그램 관련 문제들을 알아서 처리해준다는 개념.

  (연결 관계가 복잡하고, 무겁고, 독립적이지 못하다)
* DL : Dependency Lookup 

* DI : Dependency Injection

 

* DL(Dependecy Lookup) - JNDI 같은 저장소에 의하여 관리되고 있는 bean을 개발자들이 직접 컨테이너(Container)에서 제공하는 API를 이용하여 lookup하는 것을 말함. 따라서 container와의 종속성이 생김. (JNDI 컨테이너에 의존성이 강하다. )

 오브젝트간에 디커플링(decoupling)을 해주는 면에서 장점이 있지만 이렇게 만들어진 오브젝트는 컨테이너 밖에서 실행 할 수 없고 JNDI외의 방법을 사용할 경우 JNDI관련 코드를 오브젝트내에 일일히 변경해 줘야 하며 테스트하기 매우 어렵고 코드 양이 매우 증가하고 매번 Casting해야 하고 NamingException같은 checked exception을 처리하기 위해서 exception처리구조가 매우 복잡해지는 단점이 있음.

 EJB container, Spring container 에서 지원.

 

* DI (Dependecy Injection) – 각 class 사이의 의존관계를 빈 설정 정보를 바탕으로 container가 자동적으로 연결해 주는 것을 말함. 따라서 lookup과 관련된 코드들이 오브젝트 내에서 완전히 사라지고 컨테이너에 의존적이지 않은 코드를 작성할 수 있음.

 단지 빈 설정 파일에서 의존관계가 필요하다는 정보를 추가하면 됨.
1) Setter Injection – 클래스 사이의 의존관계를 연결시키기 위하여 setter 메소드를 이용하는 방법. property tag 사용.
2) Constructor Injection – 클래스 사이의 의존관계를 연결시키기 위하여 constructor를 이용하는 방법. constructor-arg tag 사용.
3) Method Injection – 싱글톤(Singleton) 인스턴스와 non singleton 인스턴스의 의존관계를 연결시킬 필요가 있을 때 사용하는 방법.

 

 

참고) JNDI (Java Naming and Directory Interface)

* 엔터프라이즈 애플리케이션을 위한 네이밍과 디렉토리 서비스 표준 인터페이스
* Java 소프트웨어 클라이언트가 이름(Name)을 이용하여 데이터 및 객체를 찾을 수 있도록 도와주는 디렉토리 서비스에 대한 Java API.

[Naming Service 구조]

 

Naming Service (네이밍 서비스)
 * Java Naming and Directory Interface(JNDI) API를 이용하여 자원(Resource)을 찾을 수 있도록 도와주는 서비스. Naming 서비스를 지원하는 Naming 서버에 자원을 등록하여 다른 어플리케이션에서 사용할 수 있도록 공개하고, Naming 서버에 등록되어 있는 자원을 찾아와서 이용할 수 있게 함.

 * DNS서버 같은 개념.

 

JNDI(Java Naming and Directory Interface)
 - 디렉토리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고하기 위한 자바 API.
 - J2EE 플랫폼의 일부.
 - 여러 대의 서버 간에 JNDI를 이용하여 객체를 등록, 참조하여 이용.
 - javax.naming 패키지 안에 존재.
 - 여러 웹 서버(톰캣, 웹로직, 제우스 등)에서 사용.
 - 기본 네임스페이스는 java:com/env.

 

 


 

반응형