위로
아래
제어 역전
IoC (Inversion of Control) 제어 역전
- 객체의 생성부터 소멸까지 객체의 모든 생명주기를 개발자가 아닌 컨테이너가 담당하는 것
서블릿과 자바 클래스만 이용 시 (Spring X)
- 서블릿과 자바 클래스만 사용해서 웹 어플리케이션을 만들 때
- 클라이언트가 서버에 웹페이지를 요청하면 WAS(서블릿 컨테이너)에서는 사용자 요청 별 스레드를 생성하고, URL에 매핑된 서블릿 객체를 만들어서 파라미터 값을 전달해주며 실행한다.
- 서블릿 객체는 싱글톤 패턴으로, 모든 스레드에서 공유할 수 있는 하나의 객체로 생성되어 실행된다.
- 서블릿만 사용해도 서블릿 컨테이너(톰캣)이 IoC 컨테이너기 때문에, 개발자가 스레드를 직접 만들고 new 서블릿으로 서블릿 객체를 생성할 필요는 없다. 서블릿 컨테이너가 대신 생성해준다.
의존성 주입
DI (Dependency Injection) 의존성 주입
- 컨테이너에서 관리할 객체를 지정해주고, 코드 내에서는 컨테이너에서 객체를 받아 사용하는 방식
- 빈을 정의할 때 객체 간 의존 관계를 명시해 코드에서 사용 시 자동으로 주입 받도록 한다.
예시
- 의존성 주입 X
- 클래스 a에서 클래스 b 객체를 만들어 사용 : 클래스 a가 클래스b에 의존
- 클래스 a를 사용하기 위해서 클래스 b도 생성해서 클래스 a에게 주입해야 한다.
- 의존성 주입 사용
- 클래스 a와 클래스 b의 의존 관계를 빈에 정의해서 컨테이너에게 위임
- 개발자가 클래스 a의 객체를 요청하면, 컨테이너가 클래스 b의 객체도 생성해 클래스 a에 주입한 뒤, 클래스 a의 객체를 개발자에게 전달해준다.
의존성 주입, 제어 역전 사용
- DI : 의존성 주입
- IoC : 제어 역전
- 의존성 주입, 제어 역행 사용 이유 : 클래스의 기능을 변경하거나 대체할 때 수월하게 하기 위해서
- 의존성 주입, 제어 역행 사용 전 : 개발자가 직접 코드에서 사용할 클래스의 생성자를 호출
- 의존성 주입, 제어 역행 사용 후 : 개발자가 아니라, 컨테이너가 연관 관계를 규정 짓는다. (약한 결합) 코드에서 직접 연관 관계를 작성하지 않으므로 클래스의 변경이 자유로워진다.
사용
- 사용법 2가지 : xml 또는 에너테이션
- 객체를 주입하여 객체들의 의존 관계를 맺어준다.
- 여기서 말하는 객체가 빈. 이름이 빈인 이유는 xml 파일에 <bean>으로 명시하기 때문.
- 의존 객체를 주입하는 방법 : 생성자 or setter
xml 사용 의존성 주입
사용 과정
- 스프링 빈 설정 xml 파일 생성
- 컨테이너에게 위임할 클래스들의 정보를 형식에 맞게 작성 (Bean 정의)
- 하나의 빈에서 다른 빈을 참조하도록 설정 (의존성 주입)
- 코드 내에서 컨테이너에게 객체(빈)을 요청
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>
- id : 빈 객체의 고유 이름. id를 이용해 빈에 접근한다.
- name : 빈 객체의 별칭
- class : 생성할 클래스. 패키지 이름까지 입력.
- constructor-arg : 생성자를 이용해 값을 주입할 때 사용
- property : setter를 이용해 값을 주입할 때 사용
- ref : 주입되는 데이터가 기본형이 아닌 참조형인 경우 ref 속성을 이용해야 한다.