위로 아래

제어 역전

IoC (Inversion of Control) 제어 역전

  1. 객체의 생성부터 소멸까지 객체의 모든 생명주기를 개발자가 아닌 컨테이너가 담당하는 것

 

서블릿과 자바 클래스만 이용 시 (Spring X)

  1. 서블릿과 자바 클래스만 사용해서 웹 어플리케이션을 만들 때
  2. 클라이언트가 서버에 웹페이지를 요청하면 WAS(서블릿 컨테이너)에서는 사용자 요청 별 스레드를 생성하고, URL에 매핑된 서블릿 객체를 만들어서 파라미터 값을 전달해주며 실행한다.
  3. 서블릿 객체는 싱글톤 패턴으로, 모든 스레드에서 공유할 수 있는 하나의 객체로 생성되어 실행된다.
  4. 서블릿만 사용해도 서블릿 컨테이너(톰캣)이 IoC 컨테이너기 때문에, 개발자가 스레드를 직접 만들고 new 서블릿으로 서블릿 객체를 생성할 필요는 없다. 서블릿 컨테이너가 대신 생성해준다. 

 

 


의존성 주입

DI (Dependency Injection) 의존성 주입

  1. 컨테이너에서 관리할 객체를 지정해주고, 코드 내에서는 컨테이너에서 객체를 받아 사용하는 방식
  2. 빈을 정의할 때 객체 간 의존 관계를 명시해 코드에서 사용 시 자동으로 주입 받도록 한다.

 

예시

  1. 의존성 주입 X
    1. 클래스 a에서 클래스 b 객체를 만들어 사용 : 클래스 a가 클래스b에 의존
    2. 클래스 a를 사용하기 위해서 클래스 b도 생성해서 클래스 a에게 주입해야 한다.
  2. 의존성 주입 사용
    1. 클래스 a와 클래스 b의 의존 관계를 빈에 정의해서 컨테이너에게 위임
    2. 개발자가 클래스 a의 객체를 요청하면, 컨테이너가 클래스 b의 객체도 생성해 클래스 a에 주입한 뒤, 클래스 a의 객체를 개발자에게 전달해준다.

 

 

 


의존성 주입, 제어 역전 사용

  1. DI : 의존성 주입
  2. IoC : 제어 역전
  3. 의존성 주입, 제어 역행 사용 이유 : 클래스의 기능을 변경하거나 대체할 때 수월하게 하기 위해서
  4. 의존성 주입, 제어 역행 사용 전 : 개발자가 직접 코드에서 사용할 클래스의 생성자를 호출
  5. 의존성 주입, 제어 역행 사용 후 : 개발자가 아니라, 컨테이너가 연관 관계를 규정 짓는다. (약한 결합) 코드에서 직접 연관 관계를 작성하지 않으므로 클래스의 변경이 자유로워진다.

 

사용

  1. 사용법 2가지 : xml 또는 에너테이션
  2. 객체를 주입하여 객체들의 의존 관계를 맺어준다. 
  3. 여기서 말하는 객체가 빈. 이름이 빈인 이유는 xml 파일에 <bean>으로 명시하기 때문.
  4. 의존 객체를 주입하는 방법 : 생성자 or setter 

 

 


xml 사용 의존성 주입

사용 과정

  1. 스프링 빈 설정 xml 파일 생성
  2. 컨테이너에게 위임할 클래스들의 정보를 형식에 맞게 작성 (Bean 정의)
  3. 하나의 빈에서 다른 빈을 참조하도록 설정 (의존성 주입)
  4. 코드 내에서 컨테이너에게 객체(빈)을 요청

 

xml <bean> 속성들

<bean id="personService" class="com.spring.ex01.PersonServiceImpl">
  <property name="name">
     <value>홍길동</value>
  </property>
</bean>

<bean id="personService1" class="com.spring.ex02.PersonServiceImpl">
    <constructor-arg value="이순신"/>
</bean>
  1. id : 빈 객체의 고유 이름. id를 이용해 빈에 접근한다.
  2. name : 빈 객체의 별칭
  3. class : 생성할 클래스. 패키지 이름까지 입력.
  4. constructor-arg : 생성자를 이용해 값을 주입할 때 사용
  5. property : setter를 이용해 값을 주입할 때 사용
  6. ref : 주입되는 데이터가 기본형이 아닌 참조형인 경우 ref 속성을 이용해야 한다.