1.2 컨테이너 by ys

IoC(Inversion of Control- 제어의 역전)란?] : IoC란 프로그램의 제어 흐름 구조가 바뀌는 것

[AOP(Aspect-Oriented Programming)기술이란?] : 기능을 핵심 비즈니스 로직과 공통 모듈로 구분하고, 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 효과적으로 잘 끼워넣도록 하는 개발 방법공통 모듈(보안 인증, 로깅 같은 요소등)을 만든 후에 코드 밖에서 이 모듈을 비느지스 로직에 삽입하는 이 바로 AOP적인 개발이다. 코드 밖에서 설정 된다는 것이 핵심이다. = 분산되어 있고 중복적인 내용을 묶어주는 기법 ex) 로깅, 보안, 간단한 메소드 성능 검사, 트랜잭션, 예외 반환, 아키텍처 검증 등의 공통기능을 모듈화 처리

org.springframework.context.ApplicationContext 인터페이스는 Spring IoC 컨테이너를 말하며, 인스턴스화, 구성 및 bean들의 결합을 담당합니다. 컨테이너는 구성 메타 데이터를 읽음으로써 어떤 객체를 인스턴스화, 구성 및 결합할 것인지에 대한 지시를 얻습니다. 구성 메타 데이터는 XML, Java 어노테이션 또는 Java 코드로 표시됩니다. 이를 통해 어플리케이션을 구성하는 오브젝트와 해그 오브젝트 간의 풍부한 상호 의존성을 표현할 수 있습니다.

객체(Object)는 소프트웨어 세계에 구현할 대상이고, 이를 구현하기 위한 설계도가 클래스(Class)이며, 이 설계도에 따라 소프트웨어 세계에 구현된 실체가 인스턴스(Instance)이다. 객체(Object)는 현실의 대상(Object)과 비슷하여, 상태나 행동 등을 가지지만, 소프트웨어 관점에서는 그저 콘셉에 불과하다. 소프트웨어에서 객체를 구현하기 위해서는 콘셉 이상으로 많은 것들을 사고하여 구현해야 하므로, 이를 위한 설계도로 클래스를 작성한다. 설계도를 바탕으로 객체를 소프트웨어에 실체화 하면 그것이 인스턴스(Instance)가 되고, 이 과정을 인스턴스화(instantiation)라고 한다. 실체화된 인스턴스는 메모리에 할당된다.

코딩을 할 때, 클래스 생성에 따라 메모리에 할당된 객체인 인스턴스를 ‘객체’라고 부르는데, 틀린 말이 아니다.

인스턴스라고 부르면 더 정확하지만, 개념적으로 인스턴스는 객체에 포함된다고 볼 수 있다. 물론 어디가 소프트웨어 세계에 더 가깝냐를 따지면 당연히 인스턴스이다. 잘 구분해서 쓴다면 프로빼쌰날(?) 하다는 소리를 들을 수 있을지도. 그러나 객체나 인스턴스를 클래스로, 혹은 클래스를 객체나 인스턴스라고 해선 안 된다. 건물의 설계도를 보고 건물이라고 하지 않고, 반대로 건물을 설계도라고 하지 않으니까~

ApplicationContext인터페이스 의 몇가지 구현은 Spring과 함께 제공됩니다. 독립 실행 형 응용 프로그램에서 이것은 ClassPathXmlApplicationContext 또는 FileSystemXmlApplicationContext의 인스턴스를 만드는 것이 일반적입니다. XML은 구성 메타 데이터를 정의하기위한 전통적인 형식이었던 반면에 자바 annotation을 사용하거나 선언적으로 추가적인 메타데이터 형식이 지원이 가능하기위해 작은 양의 XML 구성을 제공함으로써 메타데이터 형식을 코드화 하는것에 사용할 수 있습니다.

대부분의 애플리케이션 시나리오에서 명백한 너(사용자)의 코드는 Spring IoC 컨테이너의 하나 이상의 인스턴스를 인스턴스화 할 필요가 없다. 예를 들어, 웹 응용 프로그램 시나리오에서 웹의 web.xml 파일 안에 있는 상용구 웹 설명자 XML의 간단한 8줄만 있으면 전형적으로 충분합니다.( 웹 응용 프로그램의 편리한 ApplicationContext Instantiation 참조 ). Spring Tool Suite(이클립스 구동 개발 환경)를 사용하는 경우, 당신은 쉽게 몇 번의 마우스 클릭이나 키 입력이 이 상용구 구성을 만들 수 있습니다.

다음 다이어그램은 Spring이 어떻게 작동 하는지 높은 레벨의 를 보여줍니다. 응용 프로그램 클래스는 구성 메타 데이터와 결합되어 ApplicationContext작성되고 초기화 된 후 완전히 구성되고 실행 가능한 시스템 또는 응용 프로그램을 갖게됩니다.

1.2.1 configuration 메타 데이터

Spring configuration metadata스프링 설정 메타데이터

  • 어떤 객체를 인스턴스화·설정·구성할 것인지에 대한 정보

XML, 자바 애노테이션, 자바 코드로 표현됨

1.2.1. configuration 메타 데이터

앞의 다이어그램에서 볼 수 있듯이 Spring IoC 컨테이너는 configuration 메타 데이터의 형태를 사용한다. 이 configuration 메타 데이터는 애플리케이션 개발자로서 애플리케이션에서 어떻게 객체를 인스턴스화, 구성 및 조립을 위해 어떻게 Spring 컨테이너를 말할 수 있는지 나타냅니다.

configuration 메타 데이터는 전통적으로 단순하고 직관적 인 XML 형식으로 제공되며, 이 장의 대부분은 Spring IoC 컨테이너의 핵심 개념과 기능을 전달하는 데 사용된다.

XML 기반 메타 데이터는 configuration 메타 데이터의 유일한 허용 형식이 아닙니다. Spring IoC 컨테이너 자체는이 구성 메타 데이터가 실제로 작성된 형식과 완전히 분리되어있다. 요즈음, 많은 개발자 들은 Spring 어플리케이션을위한 자바 기반 configuration 을 선택 합니다.

Spring 컨테이너에서 다른 형식의 메타 데이터를 사용하는 방법에 대한 정보는 다음을 참조하십시오.

  • 어노테이션 기반 configuraton : 스프링 2.5는 어노테이션 기반 설정 메타 데이터에 대한 지원을 도입했다.

  • 자바 기반 configuration : Spring 3.0부터는 Spring JavaConfig 프로젝트에서 제공하는 많은 기능들이 핵심 Spring 프레임 워크의 일부가되었다. 따라서 XML 파일이 아닌 Java를 사용하여 응용 프로그램 클래스 외부의 Bean을 정의 할 수 있습니다. 이러한 새 기능을 사용하려면 @Configuration, @Bean, @Import, 및 @DependsOnannotion을 참조하세요.

Spring configuration은 컨테이너가 관리해야하는 최소 하나 이상의 bean 정의로 구성된다. XML 기반 configuration 메타 데이터는 이러한 bean을 <bean/>최상위 요소 내부의 <beans/>요소로 구성합니다. Java configuration은 일반적으로 @Configuration 클래스 안의 annotation 방법인 @Bean 을 사용합니다.

이 bean 정의는 응용 프로그램에서 만들어진 실제 객체에 해당합니다. 일반적으로 서비스 계층 개체, 데이터 접근 개체 (DAO), Struts Action인스턴스 와 같은 프레젠테이션 개체 , Hibernate SessionFactories, JMS Queues등과 같은 인프라 개체 등을 정의합니다.

--> 너무 어렵다..

Message Queue는 JMS(Java Message Service) 개방형 표준을 구현하는 엔터프라이즈 메시징 시스템 즉, JMS 공급자입니다.

1. 하이버네이트(Hibernate) 란? 하이버네이트는 ORM(Object-Relational Mapping) 의 한 종류 이다. ORM은 데이터베이스에 저장된 데이터와 프로그램의 객체를 매핑하는 프로그램 기술이다.또한, 간단하게 데이터를 생성하고, 조작하고, 접근 할 수 있게 해준다. 2. 하이버네이트를 쓰면 좋은점 1. 오픈소스이며 가볍다.2. 빠른 성능을 보장한다. 2단계 캐시를 지원한다.3. 데이터베이스 쿼리에 독립적이다. (Oracle이나 MySQL 등 상이한 데이터베이스에 대해 같은 결과를 보장받는다.)4. 자동으로 테이블 생성 기능을 제공한다.5. 간단한 조인을 수행한다. 6. 쿼리 캐시와 데이터베이스 상태와 쿼리의 통계에 대한 기능을 지원한다.

하이버네이트의 구성 요소 중 SessionFactory

Session 과 application 의 Connection Provider 에 대한 Factory 이다. 그것은 (Session 또는 Connection Provider 를 말하는 것 같다.) 2단계 캐시를 유지한다. org.hibernate.SessionFactory 인터페이스는 Session 객체를 반환 하는 메소드를 제공한 다.

하이버네이트 더 찾아볼 것.

Struts(스트럿츠) : 자바 프레임워크를 이용한 웹 애플리케이션의 구축

목적 : 서로의 부분을 디자이너의 영역과 프로그래머의 영역 전체적인 설정과 구조를 서로 분리해보자.

이도 심플하게 말하자면 영역을 분리하는것입니다.

디자이너의 부분 프로그램의 부분 전체적인 시스템을 관리하는 부분(컨트롤이라고도 하죠.)

이를 어려운 영어를 쓴다면 MVC가 됩니다. Model, View, Controller라는 이름으로 구분하게 된것이죠.

이렇게 사용하게끔 구분을 하여 나온것이 struts라는 프레임워크인 것입니다.

이것만 기억하세요 struts는 MVC를 근간으로 하는 프레임워크다

일반적으로 도메인 객체를 생성하고로드하는 것은 DAO와 비즈니스 로직의 책임이기 때문에 일반적으로 컨테이너에 세밀한 도메인 객체를 구성하지 않습니다. 그러나 AspectJ와 Spring의 통합을 사용하여 IoC 컨테이너의 제어 범위 밖에서 생성 된 객체를 구성 할 수있다. AspectJ를 사용하여 Spring과의 의존성 주입 도메인 객체를참조하십시오 .

역자주: 코(장음)스 그레인드(coarse-grained)파인 그레인드(fine-grained)는 우리말 한마디로 옮기기에는 무척 버거운 개념이다. grain은 원래 보리나 밀 같은 곡식을 낟알로 만드는 작업이나 표면을 우둘투둘하게 하는 일을 뜻 하는데, 그때아주 곱고 섬세하게 하느냐, 아니면 듬성 듬성 크게 하느냐에 따라 fine와 coarse라 는형용사를 붙인다. 이것이 소프트웨어공학에 도입되어 어떠한 프로세스를 아주 잘게 쪼개느냐 아니면 굵게 쪼개서 뭉뚱그려 놓느냐를 표현할 때 쓰게 되었다. 웹서비스에서의서비스라는 단위에 비해 상대적으로 자바의 메소드는 더 세분화되어있다는 뜻에서 코스그레인드 서비스-파인그레인드 메소드라는 대칭이 생겼다고 봐도 좋다.

: coase-grainde : 크게 쪼개는거, fine-grained : 세밀하게 쪼개는거

다음 예제는 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       
  http://www.springframework.org/schema/beans/spring-beans.xsd">​   
   <bean id="..." class="...">          
    <!-- collaborators and configuration for this bean go here -->  
      </bean>​    <bean id="..." class="...">       
   <!-- collaborators and configuration for this bean go here -->    </bean>​    
   <!-- more bean definitions go here -->​</beans>
  1. id 속성은 개별 빈 정의를 식별하는 문자열 입니다.

  2. 이 class 속성은 bean의 유형을 정의하고 완전한 클래스 이름을 사용합니다.

id속성 의 값은 협업 오브젝트를 나타냄니다. 협업 오브젝트를 참조하기위한 XML은 이 예제에 표시되지 않습니다. 자세한 내용은 종속성 을 참조하십시오.

1.2.2. 컨테이너 인스턴스화하기

ApplicationContext생성자에 제공되는 위치 경로 는 컨테이너가 로컬 파일 시스템, Java CLASSPATH등과 같은 다양한 외부 리소스의 구성 메타 데이터를로드 할 수 있도록하는 리소스 문자열입니다.

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

Spring의 IoC 컨테이너에 대해 배우고 나면 , URI 구문에 정의 된 위치에서 InputStream을 읽는 편리한 메커니즘을 제공하는 Spring의 Resource추상화 에 대해 자세히 알고 싶을 것이다 ( 참고 자료 참조 ). 특히 Resource경로는 응용 프로그램 컨텍스트 및 자원 경로 에서 설명한대로 응용 프로그램 컨텍스트를 구성하는 데 사용됩니다 .

다음 예에서는 서비스 계층 개체 (services.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       
 http://www.springframework.org/schema/beans/spring-beans.xsd">​    
 <!-- services -->​   
 
   <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">        
   <property name="accountDao" ref="accountDao"/>       
<property name="itemDao" ref="itemDao"/>        
<!-- additional collaborators and configuration for this bean go here -->   
 </bean>​    <!-- more bean definitions for services go here -->​</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        
 http://www.springframework.org/schema/beans/spring-beans.xsd">​    
 
 <bean id="accountDao"       
  class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">      
    <!-- additional collaborators and configuration for this bean go here --> 
</bean>​    

<bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">        
<!-- additional collaborators and configuration for this bean go here -->   
 </bean>​    <!-- more bean definitions for data access objects go here -->
 ​</beans>

앞의 예에서 서비스 계층은 PetStoreServiceImpl유형 JpaAccountDaoJpaItemDao(JPA 객체 관계형 매핑 표준을 기반으로 한) 두 가지 데이터 액세스 객체 로 구성됩니다 . property name요소는 자바 빈즈 속성의 이름을 참조하고, ref요소는 다른 빈 정의의 이름을 나타냅니다. 이 요소 idref요소 사이의 연결은 공동 작업 객체 간의 종속성을 나타냅니다. 개체의 종속성을 구성하는 세부 사항을 참조 종속성 .

XML 기반 구성 메타 데이터 작성

빈 정의가 여러 XML 파일에 걸쳐있는 것이 유용 할 수 있습니다. 각 개별 XML 구성 파일은 아키텍처의 논리 계층 또는 모듈을 나타내는 경우가 많습니다.

응용 프로그램 컨텍스트 생성자를 사용하여 모든 XML 조각에서 bean 정의를 로드 할 수 있습니다. 이 생성자는 이전 섹션Resource 에서 설명한 것처럼 여러 위치를 사용합니다 . 또는 <import/>요소 의 하나 이상의 어커런스를 사용하여 다른 파일 또는 파일의 bean 정의를로드하십시오. 다음 예제에서는 이를 수행하는 방법을 보여줍니다.

<beans>   
 <import resource="services.xml"/>    
 <import resource="resources/messageSource.xml"/>    
 <import resource="/resources/themeSource.xml"/>​    
  <bean id="bean1" class="..."/>    
  <bean id="bean2" class="..."/>
 </beans>

앞의 예에서 외부 bean 정의는 세 개의 파일에서로드 : services.xml, messageSource.xml,와 themeSource.xml. 모든 위치 경로는 가져 오기를 수행하는 정의 파일에 상대적이기 때문에 services.xml동안, 오기 (import)를 수행하는 파일과 같은 디렉토리 나 클래스 패스 위치에 있어야messageSource.xml하고 themeSource.xml에 있어야합니다 resources가져 오기 파일의 위치 아래에 위치. 보시다시피, 선행 슬래시는 무시됩니다. 그러나 이러한 경로가 상대적인 경우 슬래시를 전혀 사용하지 않는 것이 좋습니다. 최상위 <beans/>요소를 포함하여 가져올 파일의 내용은 Spring 스키마에 따라 유효한 XML bean 정의 여야합니다.

상대적 "../"경로를 사용하여 상위 디렉토리의 파일을 참조하는 것은 가능하지만 권장하지는 않습니다. 이렇게하면 현재 응용 프로그램 외부에있는 파일에 대한 종속성이 만들어집니다. 특히이 참조는 런타임 해결 프로세스가 "가장 가까운"클래스 경로 루트를 선택한 다음 상위 디렉토리를 조사 하는 classpath:URL (예 :) 에는 권장되지 않습니다 classpath:../services.xml. 클래스 경로 구성 변경으로 인해 다른 디렉토리가 잘못 선택 될 수 있습니다.

상대 경로 대신 정규화 된 리소스 위치를 항상 사용할 수 있습니다 (예 : file:C:/config/services.xml또는) classpath:/config/services.xml. 그러나 응용 프로그램의 구성을 특정 절대 위치에 연결한다는 점에 유의하십시오. 일반적으로 런타임시 JVM 시스템 속성에 대해 해결되는 "$ {...}"자리 표시자를 통해 절대 위치에 대한 간접 참조를 유지하는 것이 바람직합니다.

네임 스페이스 자체가 가져 오기 지시문 기능을 제공합니다. 일반 Bean 정의를 뛰어 넘는 추가 구성 기능은 Spring에서 제공하는 XML 네임 스페이스 (예 : the contextutil네임 스페이스) 의 선택에서 사용할 수 있습니다 .

그루비 빈 정의 DSL

외부화 된 설정 메타 데이터에 대한 또 다른 예로서, 빈 정의는 Grails 프레임 워크에서 알려진 바와 같이 Spring의 Groovy Bean Definition DSL로 표현 될 수있다. 일반적으로 이러한 구성은 다음 예제와 같은 구조의 ".groovy"파일에 있습니다.

beans {    dataSource(BasicDataSource) 
{        driverClassName = "org.hsqldb.jdbcDriver"       
 url = "jdbc:hsqldb:mem:grailsDB"       
username = "sa"       
 password = ""        
 settings = [mynew:"setting"]    }   
  sessionFactory(SessionFactory) 
  {        dataSource = dataSource    }    
  myService(MyService) {       
   nestedBean = { AnotherBean bean ->          
     dataSource = dataSource        }    }}

이 설정 스타일은 XML bean 정의와 거의 동일하며 Spring의 XML 설정 네임 스페이스를 지원한다. 또한 XML Bean 정의 파일을 importBeans지시문을 통해 가져올 수 있습니다 .

1.2.3. 컨테이너 사용

이것은 ApplicationContext다른 bean과 그 의존성의 레지스트리를 관리 할 수있는 고급 팩토리를위한 인터페이스입니다. 이 메소드를 사용 T getBean(String name, Class<T> requiredType)하여 bean 인스턴스를 검색 할 수 있습니다.

ApplicationContext은 당신이 이 빈 정의를 읽고, 다음의 예와 같이, 그들에 액세스 할 수 있습니다 :

// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
​// retrieve configured instancePetStoreService service = context.getBean("petStore", PetStoreService.class);
​// use configured instanceList
<String> userList = service.getUsernameList();

Groovy 설정을 사용하면 부트 스트랩이 매우 비슷해 보입니다. 이것은 Groovy를 인식하는 다른 컨텍스트 구현 클래스를 가지고 있지만 (또한 XML bean 정의를 이해한다.) 다음 예제는 Groovy 설정을 보여줍니다 :

ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");

가장 유연한 변형은 다음 예제와 같이 XML 파일의 경우와 같이 GenericApplicationContext독자 위임자와 함께 사용 XmlBeanDefinitionReader됩니다.

GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");context.refresh();

GroovyBeanDefinitionReader다음 예제와 같이 for Groovy 파일을 사용할 수도 있습니다

GenericApplicationContext context = new GenericApplicationContext();
new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy");context.refresh();

이러한 리더 위임자 ApplicationContext를 다양한 구성 소스의 Bean 정의를 읽고 동일한 환경 에서 혼합하여 사용할 수 있습니다 .

그런 다음 getBeanbean의 인스턴스를 검색 하는 데 사용할 수 있습니다 . ApplicationContext 인터페이스는 이상적으로, 응용 프로그램 코드를 사용해서는 안, bean을 검색하기위한 몇 가지 다른 방법이 있지만. 사실, 애플리케이션 코드는 getBean()메소드에 대한 호출을 전혀 가지지 않아야 하므로 Spring API에 전혀 의존하지 않는다. 예를 들어 Spring의 웹 프레임 워크와의 통합은 컨트롤러 및 JSF 관리 빈과 같은 다양한 웹 프레임 워크 구성 요소에 대한 종속성 주입을 제공하여 메타 데이터 (예 : 자동 와이어 링 주석)를 통해 특정 빈에 대한 종속성을 선언 할 수 있습니다.

Last updated