ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글