본문으로 바로가기

의존 관계


의존관계라는 것은 Dependency Injection의 약자로 우리말로 하면 '의존 주입'이다.





객체를 주입하는 방법은 2가지가 있다. 

생성자와 setter인데 오늘은 생성자로 주입하는 방법을 알아보겠다.

xml파일을 통해 StudentInfo를 주입했다면, 다른방법인 java파일에서 StudentInfo로 주입하는 방법도 있다.




Student.java

package com.javalec.ex;


public class Student {


private String name;

private String age;

private String gradeNum;

private String classNum;

public Student(String name, String age, String gradeNum, String classNum) { 

                  생성자 초기화

this.name = name;

this.age =  age;

this.gradeNum = gradeNum;

this.classNum = classNum;

}




applicationCTX.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.xsd">

xml 스프링 파일 생성자 설정  // setter방식에서는 proproty, value방식을 이용했지만 xml파일로 설정하기 위해 constructor-arg태그를 사용한다. 

<bean id="student1" class="com.javalec.ex.Student">

<constructor-arg>   or  <constructor-arg value =""> // proproty방식도 이렇게 사용가능하다.

<value>홍길동</value>

</constructor-arg>

<constructor-arg>

<value>10살</value>

</constructor-arg>

<constructor-arg>

<value>3학년</value>

</constructor-arg>

<constructor-arg>

<value>20번</value>

</constructor-arg>

</bean>

<bean id="student2" class="com.javalec.ex.Student">

<constructor-arg value="홍길동" />

<constructor-arg value="9살" />

<constructor-arg value="2학년" />

<constructor-arg value="10번" />

</bean>

<bean id="studentInfo" class="com.javalec.ex.StudentInfo">

<constructor-arg>

<ref bean="student1" />   stdent1객체를 참조한다. 

</constructor-arg>

</bean>

</beans>






package com.javalec.ex;


public class StudentInfo {


private Student student;   Student 클래스의 student객체를 말한다.

public StudentInfo(Student student) {

this.student = student;

}

public void getStudentInfo(){

if(student != null) {

System.out.println("이름 : " + student.getName());

System.out.println("나이 : " + student.getAge());

System.out.println("학년 : " + student.getGradeNum());

System.out.println("반 : " + student.getClassNum());

System.out.println("======================");

}

}

public void setStudent(Student student) {

this.student = student;

}

}









package com.javalec.ex;


import org.springframework.context.support.AbstractApplicationContext;

import org.springframework.context.support.GenericXmlApplicationContext;


public class MainClass {


public static void main(String[] args) {

String configLocatioin = "classpath:applicationCTX.xml";

AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocatioin);

StudentInfo studentInfo = ctx.getBean("studentInfo", StudentInfo.class);

studentInfo.getStudentInfo();   applicationCTX.xml파일에서  student1을 참조한다고 했으므로  student1객체의 데이터를 출력하게된다.

Student student2 = ctx.getBean("student2", Student.class); Student.class를 이용하여 xml에서 만들어진 student2객체를 사용

studentInfo.setStudent(student2); //student2객체를 studentInfo의 생성자로 주입한다.

studentInfo.getStudentInfo();

ctx.close();

}

}


DI 사용에 따른 장점

규모가 커지면 추후 유지보수 업무가 발생시 DI를 통한 개발의 장점을 느낄 수 있다고 합니다.


  처음에 업체에서 4B 굵기로 쓰이게 해달라고 요청을 했으나 6B굵기로 쓰이게 해달라고 요청을 하면 

자바파일은 건드리지않고 xml의 파일을 수정하여 보완을 하는것이다.

마찬가지로 지우개까지 추가해달라고 했을때도 xml파일을 수정하면 된다.

단, 객체(pensil)은 바뀌지 않는다. 인터페이스 타입으로 구현되야한다. 그래야지 클래스를 바꾸지 않아도 되는것이다.


public class MainClass {


public static void main(String[] args) {

// TODO Auto-generated method stub

AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");

Pencil pencil = ctx.getBean("pencil", Pencil.class);

                                                                 자바코드는 나두고. 4b, 6b로 사용하고 싶을때 xml파일에서 수정하면 된다.

pencil.use();

ctx.close();

}


}




applicationCTX.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.xsd">


<bean id="pencil" class="com.javalec.ex.Pencil6BWithEraser" />

                                          ----->여기부분의 클래스를 바꾸어주면 오버라이딩되어있기 때문에 4B, 6B, 지우개를 추가할 수 있다. 

</beans>


package com.javalec.ex;


import org.springframework.context.support.AbstractApplicationContext;

import org.springframework.context.support.GenericXmlApplicationContext;





package com.javalec.ex;


public interface Pencil {

public void use();  //use라는 메소드만 있음 추상클래스임

}




package com.javalec.ex;


public class Pencil4B implements Pencil {


@Override

public void use() {

System.out.println("4B 굵기로 쓰입니다.");

}


}




package com.javalec.ex;


public class Pencil6B implements Pencil {


@Override

public void use() {

System.out.println("6B굵기로 쓰입니다.");

}


}




package com.javalec.ex;


public class Pencil6BWithEraser  implements Pencil {


@Override

public void use() {

System.out.println("6B굵기로 쓰이고, 지우개가 있습니다.");

}

}





'프로그래밍 > spring' 카테고리의 다른 글

스프링 컨테이너 생명 주기  (472) 2017.12.07
4.DI(Dependency Injection)-II  (1162) 2017.11.22
3. DI(dependency Injection-1)  (1199) 2017.11.22
2.스프링 프로젝트 및 DI ,IDC  (1178) 2017.11.21
1.스프링  (1175) 2017.11.20