티스토리 뷰

728x90
반응형

 1. IoC(Inversion of Control)

1.1. 정의 (제어의 역전)
      오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않는다. 당연히 생성하지도 않는다.또 자신도 어떻게 만들어지고 어디서 사용되는지를 알 수 없다.
      모든 제어권한을 자신이 아닌 다른 대상에게 위임하는 방식.

-팩토리 : 객체의 생성방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 클래스.

-팩토리를 이용했을 때의 장점
 + 애플리케이션의 컴포넌트 역할을 하는 오브젝트와 애플리케이션의 구조를 결정하는 오브젝트(팩토리)를 분리했다는 데 가장 의미가 있다.

2. Spring IoC

2.1. 용어 설명

-빈팩토리(Bean Factory) - 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트
-어플리케이션 컨텍스트(application context) - IoC 방식을 따라 만들어진 일종의 빈 팩토리라고 생각하면 된다.( 빈팩토리를 상속받음)

(In detail)
-빈  - 빈 또는 빈 오브젝트는 스프링이 IoC방식으로 관리하는 오브젝트라는 뜻, 관리되는 오브젝트.
        스프링이 직접 생성과 제어를 담당하는 오브젝트만을 빈이라 한다.

-빈 팩토리 - 스프링의 IoC를 담당하는 핵심 컨테이너. 
                   빈을 등록하고, 생성하고, 조외하고, 돌려주는 기능 담당
                   보통 빈팩토리를 직접 사용하지 않고 이를 확장한 애플리케이션 컨텍스트를 이용.

위의 팩토리라는 오브젝트를 스프링에서 알아먹겠끔 만들기 위해 어노테이션을 붙인다.
@Configuration - 오브젝트 설정을 담당하는 클래스라고 알려준다.
@Bean - 특정 타입의 오브젝트를 생성해주는 메소드에 붙여준다.

DaoFactory.java
@Configuration
public class DaoFactory {
     @Bean
     public UserDao userDao() {
          UserDao dao = new UserDao(connectionMaker());
          return dao;
     }

     @Bean
     public ConnectionMaker connectionMaker() {
          ConnectionMaker connectionMaker = new DConnectionMaker();
          return connectionMaker;
     }

UserDaoTest.java
          AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
          UserDao dao = context.getBean("userDao", UserDao.class);


내부적으로 애플리케이션 컨텍스트가 DaoFactory의 userDao() 메소드를 호출해서 오프벡트를 가져온 것을 클라이언트가 getBean()으로 요청할때 전달해준다.
==>설정 정보를 가지고 app-context를 생성하면 가지고 있지만 getBean을 요청하기 전까지 주지 않는다.


3. 싱글톤 레지스트리와 오브젝트 스코프

- 오브젝트의 동일성과 동등성
  두개의 오브젝트가 완전히 같은 동일한(identical) 오브젝트라는 것과 동일한 정보를 담고 있는(equivalent) 오브젝트라고 말하는 것은 분명히 차이가 있다.
  전자는 동일성, 후자는 동등성/ 비교방법: 동일성은 ==, 동등성은 equals()

3.1. 스프링은 직접 싱글톤 형태의 오브젝트르 만들고 관리하는 기능을 제공한다.(싱글톤 레지스트리)
그러나 스프링이 사용하는 싱글톤은 보통 우리가 알고 있는 싱글톤 패턴과는 다른다.
스프링 레지스트리의 장점은 스태틱 메소드와 private생성자를 사용해야 하는 비정상적인 클래스가 아니라 평범한 자바 클래스를 싱글톤으로 활용할 수 있게 해준다는 점이다.


4.의존관계 주입(DI)

4.1. DI( Dependency Injection)
      오브젝트 레퍼런스를 외부로부터 제공(주입) 받고 이를 통해 여타 오브젝트와 다이내믹하게 의존관계가 만들어지는 것이 핵심.

     -의존 오브젝트 - 런타임 시에 의존관계를 맺는 대상, 즉 실제 사용대상인 오브젝트.
     의존관계 주입의 조건
    1) 클래스 모델이나 코드에느 ㄴ런타임 시점의 의존 관계가 드러나지 않는다. 인터페이스에만 의존하고 있어야한다.
    2) 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다.
    3) 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제고(주입)해줌으로써 만들어진다.

4.2. 의존관계 검색과 주입
      의존 관계를 맺는 방법이 외부로부터의 주입이 아니라 스스로 검색을 이용하기 때문에 의존관계 검색이라고 불린다.

4.2.1 차이점
      의존관계 검색 방식에서는 검색하는 오브젝트는 자신이 스프링의 빈일 필요가 없다는 점이다.

*DI를 원하는 오브젝트는 먼저 자기 자신이 컨테이너가 관리하는 빈이 돼야 한다.

4.2.2. 메소드를 이용한 의존관계 주입
     -생성자를 이용한 의존관계 주입
     -수정자 메소드(setter)를 이용한 "
     -일반 메소드를 이용한 "
보통 수정자를 이용한 의존관계 주입방법을 사용한다. 왜냐하면 XML을 만들때 property 의 rel부분에 적용하기가 편리하기 때문이다.

4.3. XML을 이용한 설정

빈 설정파일     @Configuration               <bean>
빈의 이름        @Bean methodName()     <bean id="methodName"
빈의 클래스     return new BeanClass();   <class="a.b.c....BeanClass">

<property> 태그는 name과 ref라는 두개의 애트리뷰트를 갖는다.
 Name은 프로퍼티의 이름이고, 이 프로퍼티 이름으로 수정자 메소드를 알 수 있으며, ref는 수정자 메소드를 통해 주입해줄 오브젝트의 빈 이름이다.

     userDao.setConnectionMaker(connectionMake());
                 --- -------------------   ------------------   
<property name="connectionMaker"   ref="ConnectionMaker" />

Xml로 설정부분을 사용하면 AnnotationConfigApplicationContext를 GenericXmlApplicationContext를 이용해서 어플리케이션 컨텍스트를 생성한다.
ApplicatoinContext contxt = new GenericXmlApplicationContext("applicationContext.xml");    //실제 applicationContext.xml의 경로를 넣는다.

패키지가 길어지면 클래스패스를 모두 적기가 귀찮을수가 있다.
new GenericXmlApplicationContext("springbook/user/dao/daoContext.xml");
반면에 ClassPathXmlApplicationContext는 xml 파일과 같은 클래스패스에 있는 클래스 오브젝트를 넘겨서 클래스패스에 대한 힌트를 제공할 수 있다.
new ClassPathXmlApplicationContext("daoContext.xml", UserDao.class);

DataSource같은 경우 xml에서 DI를 이용할때 object가 아닌 String값을 넣어주어야 하는데 이럴땐 Xml parameter를 rel 대신 value를 이용하면 된다.
<property name = "driverClass" value="com.mysql.jdbc.Driver"/>

위와 같은 경우는 Class 인데도 불구하고 에러가 발생하지 않는 이유는 Spring 알아서 클래스임을 인지하고 자동 변경 시켜주기 때문이다.

class driverClass = Class.forName("com.mysql.jdbc.Driver");
dataSource.setDriverClass(driverClass);

반응형

'이제 관심밖의 IT 기술 > Spring' 카테고리의 다른 글

2장. Spring JUnit Test  (0) 2011.07.08
댓글
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함