ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3. 스프링 의존성 주입
    개발자 수업/Spring 2021. 12. 29. 09:58

    1. 의존성 주입
        1) 개발자가 직접 코딩을 통해 컴포넌트(클래스)에 부여하는 것이 아니라 컨테이너가 연관 관계를 직접 규정하는 것
        2) 각 클래스들의 변경이 자유로워짐 (loosely coupled, 약한 결합)
        3) 예
            - 쇼핑몰
                - 상품 관리, 주문 관리, 회원 관리, 게시판 관리 등 구성됨
                - 서로 관련있는 기능들은 강하게 결합(tightly coupled)하고, 관련이 없는 기능들은 약하게 결합(loosely coupled)해야 좋은 프로그램임

    2. 의존성 주입 장점
        1) 코드를 단순화할 수 있음
        2) 애플리케이션 더 쉽게 유지 및 관리 가능
        3) 기존 구현 방법은 개발자가 직접 코드 안에서 객체의 생성과 소멸을 제어했지만 의존성 주입은 객체의 생성, 소멸과 객체 간의 의존 관계를 컨테이너가 제어함

    3. 제어의 역전(Inversion of Control)
        1) 스프링 프레임워크에서 객체의 제어를 직접 담당
        2) IoC의 종류도 여러 가지이며, 일반적으로 스프링에서는 DI로 IoC의 기능을 구현
            -> IoC보다는 DI라는 용어를 더 많이 사용함

    4. 스프링의 의존성 주입 방법
        1) setter에 의한 주입
        2) 생성자에 의한 주입

     

     


    xml 공동 사용

    person.xml
    
    <beans>	
    	
    	<!--  bean 태그 이용해 PersonServiceImpl 객체(빈) 생성 후 빈 id를 personService로 지정
    	<bean id="personService" class="kr.co.ezenac.di01.PersonServiceImpl">
    		<property name="name">	PersonServiceImpl 객체의 속성인 name 값을 value 태그 이용해 초기화
    			<value>이순신</value>
    		</property>
    	</bean>
    	 -->
    	 
    	 <!-- 인자가 한 개인 생성자로 id가 personService1인 빈 생성함
    	 	  생성자로 value인 심사임당을 전달하여 name 속성을 초기화함 -->
    	 <bean id="personService1" class="kr.co.ezenac.di02.PersonServiceImpl">
    	 	<constructor-arg value="신사임당"/>
    	 </bean>
    	 
    	 <!-- 인자가 한 개인 생성자로 id가 personService2인 빈 생성함
    	 	  생성자로 두 개의 값을 전달하여 name과 age 속성을 초기화함 -->
    	 <bean id="personService2" class="kr.co.ezenac.di02.PersonServiceImpl">
    	 	<constructor-arg value="이이"/>
    	 	<constructor-arg value="23"/>
    	 </bean>
    </beans>

    PersonService.java
    
    public interface PersonService {
    	public void sayHello();
    }
    PersonServiceImpl.java
    
    public class PersonServiceImpl implements PersonService {
    	
    	private String name;
    	private int age;
    	
    	public void setName(String name) {	//value 태그의 값을 setter를 이용해 설정함
    		this.name = name;
    	}
    
    
    
    	@Override
    	public void sayHello() {
    		System.out.println("이름 : " + name);
    		System.out.println("나이 : " + age);
    	}
    
    }
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.core.io.FileSystemResource;
    
    public class PersonTest {
    	public static void main(String[] args) {
    		//실행 시 person.xml을 읽어들여 빈 생성함
    		BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
    		
    		//id가 personService인 빈을 가져옴
    		PersonService person = (PersonService)factory.getBean("personService");
    		//생성된 빈을 이용해 name 값 출력함
    		
    		//더이상 자바 코드에서 객체를 직접 생성하지 않음
    		//PersonService person = new PersonServiceImpl();
    		
    		//생성된 빈을 이용해 name값을 출력함
    		person.sayHello();
    	}
    }

    PersonService.java
    
    public interface PersonService {
    	public void sayHello();
    }
    PersonServiceImpl.java
    
    public class PersonServiceImpl implements PersonService {
    	
    	private String name;
    	private int age;
    	
    	
    	//person.xml에서 인자가 한 개인 생성자 설정 시 사용됨
    	public PersonServiceImpl(String name) {
    		//super();
    		this.name = name;
    	}
        
    	//person.xml에서 인자가 두 개인 생성자 설정 시 사용됨
    	public PersonServiceImpl(String name, int age) {
    		//super();
    		this.name = name;
    		this.age = age;
    	}
    
    	@Override
    	public void sayHello() {
    		System.out.println("이름 : " + name);
    		System.out.println("나이 : " + age);
    	}
    }
    PersonTest.java
    
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.core.io.FileSystemResource;
    
    public class PersonTest {
    	public static void main(String[] args) {
    		//실행 시 person.xml을 읽어들여 빈 생성함
    		BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
    		
    		//id가 personService1인 빈을 가져옴
    		PersonService person1 = (PersonService)factory.getBean("personService1");
    		person1.sayHello();
    		
    		System.out.println();
    		
    		//id가 personService2인 빈을 가져옴
    		PersonService person2 = (PersonService)factory.getBean("personService2");
    		person2.sayHello();
    		
    	}
    }

    '개발자 수업 > Spring' 카테고리의 다른 글

    6. Spring MVC  (0) 2021.12.30
    5. AOP  (0) 2021.12.29
    4. IoC와 DI  (0) 2021.12.29
    2. 스프링 프레임워크  (0) 2021.12.29
    1. 프레임워크 시작하기  (0) 2021.12.29

    댓글