본문 바로가기

Spring/Spring

(SPRING) 오브젝트와 의존관계 (스프링에 IOC)

핵심 : 빈팩토리, 어플리케이션컨텍스트

우리가 작성하였던 DaoFactory는 빈(bean)이 된다.

또한 UserDaoTest 는 ApplicationContext가 된다.


자바 코드를 스프링으로 변환해보자

  • 기존의 DaoFactory

  • 변경한 DaoFactory

  • 기존의 UserDaoTest
public class UserDaoTest {
    public static void main(String args[]){
        UserDao userdao = new UserDaoFactory().UserDao();
    }
}
  • 변경한 UserDaoTest
public class UserDaoTest {
    public static void main(String args[]){
        ApplictaionContext context = 
            new AnnotaionConfigApplicationContext(DaoFactory.class);
        UserDao dao = context.getBean("userDao", UserDao.class);
    }
}

 

굳이 이렇게 이름을 붙이는 이유는?

UserDao dao = context.getBean("userDao", UserDao.class);

-> UserDao를 다르게 사용할 수 있기 때문에

getBean을 사용할 수 있는 이유는?

ApplictaionContext 가 getBean 인터페이스를 상속 받기 때문에

 

  1. 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
  2. 어플리케이션컨텍스트는 종합 IOC 서비스를 제공해준다.
  3. 어플리케이션컨텍스트는 빈을 검색하는 다양한 방법을 제공해준다.

 

오브젝트의 동일성

  • 직접 생성한 DaoFactory 오브젝트 출력코드
DaoFactory factory = new DaoFactory();
UserDao dao1 = factory.userDao();
UserDao dao2 = factory.userDao();

System.out.println(dao1);
System.out.println(dao1);

 

출력결과

springbook.dao.UserDao@118f375

sptringbook.dao.UserDao@117a8bd

 

완전 다른 주소값을 출력!

스프링은 여러번 빈을 요청하더라도 동일한 오브젝트를 리턴합니다.

 

어떻게 이게 가능할까? : 싱글톤레지스트리 덕분

싱글톤레지스트리 : 스프링이 직접 싱글톤 형태읜 오브젝트를 만들고 관리한다.

장점 - private 생성자를 사용하지 않아도 된다. -> 평범한 자바 클래스를 싱클톤으로 만들어줍니다.

  • 오브젝트를 생성하고 관리하는 모든 권한이 어플리케이션컨텍스트에 있기 때문이다.

가장 중요한 것은 싱글톤 패턴과 달리 스프링이 지지하는 객체지향적인 설계방식과 원칙 , 디자인패턴 등을 적용하는데

아무러 제약이 없다는 것이다.


토비의 스프링 3.1 - Vol.1 스프링의 이해와 원리
국내도서
저자 : 이일민
출판 : 에이콘출판사 2012.09.21
상세보기