-
4. IoC와 DI개발자 수업/Spring 2021. 12. 29. 19:07
1. IoC (Inversion of Container) 개념
1) 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 의미
2) 디자인 패턴에 해당
2. IoC 컨테이너
1) 스프링 프레임워크도 객체에 대한 생성 및 생명주기를 관리 기능 제공
2) IoC 컨테이너 기능 제공
- 객체 생성, 의존성 관리
- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한
- 개발자들이 객체 생성을 컨테이너에게 맡김
3. IoC 분류
1) DL (Dependency Lookup) : 의존성 검색
2) DI : 의존성 주입
(각 클래스간 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것)
- Setter Injection
- Setter 메서드를 이용한 의존성 삽입
- Constructor Injection
- 생성자를 이용한 의존성 삽입
4. DI
1) 개발자들은 단지 빈 설정 파일에서 의존관계가 필요하다는 정보를 추가하면 됨
2) 객체 래퍼런스를 컨테이너로부터 주입받아서, 실행 시에 동적으로 의존관계가 생성됨
3) 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해주는 것
4) 장점 : 코드가 단순해짐, 컴포넌트 간 결합도 제거됨
MemberDAO.java public interface MemberDAO { public void listMembers(); }
memberDAOImpl.java public class MemberDAOImpl implements MemberDAO { @Override public void listMembers() { System.out.println("listMembers 메서드 호출"); System.out.println("회원정보를 조회합니다."); } }
MemberService.java public interface MemberService { public void listMembers(); }
MemberServiceImpl.java //MemberServiceImpl 클래스 : setter로 주입되는 빈을 받을 MemberDAO 타입의 속성과 setter를 이용해 구현함 public class MemberServiceImpl implements MemberService { //주입되는 빈을 저장할 MemberDAO 타입의 속성 선언 private MemberDAO memberDAO; //설정 파일에서 memberDAO 빈을 생성한 후 setter로 속성 memberDAO에 주입함 public void setMemberDAO(MemberDAO memberDAO) { this.memberDAO = memberDAO; } @Override public void listMembers() { //주입된 빈을 이용해 listMembers() 메서드를 호출함 memberDAO.listMembers(); } }
member.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <!-- id가 memberService인 빈을 MemberServiceImpl 이용해 만듦 빈을 만들면서 setter 주입 방식으로 id가 memberDAO인 빈을 자신의 속성에 주입함 --> <bean id="memberService" class="kr.co.ezenac.di03.MemberServiceImpl"> <property name="memberDAO" ref="memberDAO"/> <!-- ref: 주입되는 데이터가 기본형이 아닌 참조형일 경우 --> </bean> <!-- id가 memberDAO인 빈을 MemberDAOImpl 이용해 만듦 --> <bean id="memberDAO" class="kr.co.ezenac.di03.MemberDAOImpl"/> </beans>
MemberTest.java import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.FileSystemResource; public class MemberTest { //member.xml을 읽어들인 후 빈을 생성함 //setter 주입 방식으로 주입한 빈 id인 memberService로 접근하여 listMembers() 메서드 호출 public static void main(String[] args) { //실행시 member.xml에 설정한대로 빈 생성 후 주입함 BeanFactory factory = new XmlBeanFactory(new FileSystemResource("member.xml")); //id가 memberService인 빈을 가져옴 MemberService service = (MemberService)factory.getBean("memberService"); service.listMembers(); } }
Printer.java public interface Printer { public void print(String message); }
StringPrinter.java public class StringPrinter implements Printer { private StringBuffer buffer = new StringBuffer(); @Override public void print(String message) { buffer.append(message); } @Override public String toString() { return buffer.toString(); } }
ConsolePrinter.java public class ConsolePrinter implements Printer { @Override public void print(String message) { System.out.println(message); } }
HiUser.java public class HiUser { private String name; private Printer printer; public HiUser() { } public void setName(String name) { this.name = name; } public void setPrinter(Printer printer) { this.printer = printer; } public String sayHello() { return "Hello " + name; } public void print() { this.printer.print(sayHello()); } }
HiUserBeanTest.java import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.FileSystemResource; public class HiUserBeanTest { public static void main(String[] args) { /* * 1. 빈(Bean) : 스프링이 IoC 방식으로 관리하는 객체 * 스프링이 직접 생성과 제어를 담당하는 객체를 Bean이라고 부름 * 2. 빈 팩토리(BeanFactory) : 스프링의 IoC를 담당하는 핵심 컨테이너를 가리킴 * Bean을 등록, 생성, 조회, 반환하는 기능을 담당함 */ //1. IoC 컨테이너 생성 BeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); //2. getBean() 호출 HiUser hiUser = (HiUser)factory.getBean("hiUser"); System.out.println(hiUser.sayHello()); hiUser.print(); Printer printer = factory.getBean("printer", Printer.class); System.out.println(printer.toString()); HiUser hiUser2 = factory.getBean("hiUser", HiUser.class); System.out.println(hiUser == hiUser2); } }
beans.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-3.2.xsd"> <bean id="hiUser" class="kr.co.ezenac.di04.HiUser"> <property name="name" value="ezenac"/> <property name="printer" ref="printer"/> </bean> <bean id="printer" class="kr.co.ezenac.di04.StringPrinter"/> <bean id="consolePrinter" class="kr.co.ezenac.di04.ConsolePrinter"/> </beans>
'개발자 수업 > Spring' 카테고리의 다른 글
6. Spring MVC (0) 2021.12.30 5. AOP (0) 2021.12.29 3. 스프링 의존성 주입 (0) 2021.12.29 2. 스프링 프레임워크 (0) 2021.12.29 1. 프레임워크 시작하기 (0) 2021.12.29