본문 바로가기
프로그래밍/Spring

Spring / constructor-arg를 통한 의존주입

by 소소로드 2018. 4. 7.

[constructor-arg를 통한 의존주입]




Student.java

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;
    }
    
    public String getName() { // 필드 값에 따른 setter, getter 정의
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getGradeNum() {
        return gradeNum;
    }
    public void setGradeNum(String gradeNum) {
        this.gradeNum = gradeNum;
    }
    public String getClassNum() {
        return classNum;
    }
    public void setClassNum(String classNum) {
        this.classNum = classNum;
    }
}
cs

*

별 다른 것은 없고 매개변수를 전부 받아서 초기화한 생성자에 주목

물론 setter가 있지만 생성자로부터 초기화한 상태이다.


필드 + 필드 전체가 담긴 생성자 + setter, getter 조합




StudentInfo.java

public class StudentInfo {
    
    private Student student; // Student를 참조하는 변수를 선언
    
    public StudentInfo(Student student) { // 생성자
        this.student = student;
    }
 
    public void setStudent(Student student) { // setter
        this.student = student;
    }
    
    public void getStudentInfo() { // getter
        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("========================");
        }
    }
}
cs

*

student 변수 + 생성자 + setter, getter(getter에 학생정보) 조합



ctx_example01.xml

<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
 
 
<bean id="student1" class="com.yul.ex03_example01.Student">
    <constructor-arg value="yul"/>
    <constructor-arg value="10살"/>
    <constructor-arg value="3학년"/>
    <constructor-arg value="4반"/>
</bean>
 
<bean id="student2" class="com.yul.ex03_example01.Student">
    <constructor-arg value="rim"/>
    <constructor-arg value="9살"/>
    <constructor-arg value="6학년"/>
    <constructor-arg value="8반"/>
</bean>
 
<bean id="studentInfo" class="com.yul.ex03_example01.StudentInfo">
     <constructor-arg>
         <ref bean="student1"/>
     </constructor-arg>
</bean>
 
</beans>
cs

*

우선 student를 어떻게 매핑하는지 주의 깊게 보자.


*

constructor-arg : 앞서 student의 '생성자'를 유심히 보라고 했다.

같은 클래스로부터 student1과 student2 두 개의 객체를 만들었는데

사실 student에 생성자와 setter 둘 다 명시되어 있어서 골라서 쓸 수 있지만

생성자를 택했고 생성자를 통해서 객체를 만들 경우 constructor-arg를 써야한다.


그리고 studentInfo에서 만든 생성자를 토대로 constructor-arg 값을 주고

여기서 중요한 점은 student1을 참조한다고 쓴다.

studentInfo는 생성자를 호출하여 student1을 참조로 초기화한다.



constructor-arg는 매개변수가 있는 생성자를 호출하여 초기화 property는 매개변수가 없는 생성자 호출후 setter메서드를 호출하여 필드값을 초기화




MainClass.java

public class MainClass {
 
    public static void main(String[] args) {
        
        String configLocation = "classpath:ctx_example01.xml";
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
        
        StudentInfo studentInfo = ctx.getBean("studentInfo", StudentInfo.class);
        studentInfo.getStudentInfo(); // 1
    
        Student student2 = ctx.getBean("student2", Student.class); 
        studentInfo.setStudent(student2); 
        studentInfo.getStudentInfo(); // 2
        
        ctx.close();
    }
 
}
cs

*

1과 2가 어떻게 다른지 비교해보자.


//1

student1을 참고하고 있는 studentInfo를 뽑아와서

StudentInfo의 변수 studentInfo에 넣고 있고

getStudentInfo()를 통해 학생의 정보를 호출한다.



//2

student2 자체를 뽑아왔는데

기존 setter값을 다시 초기화하기 위해 student2를 넣는 것이다.

그 후 다시 똑같은 getStudentInfo()를 통해 학생의 정보를 호출하면 다른 값이 나온다.






 

Student - StudentInfo는 의존관계이다.

의존주입(DI)에는 두 가지 방법이 있다.


1. 생성자() : 생성자의 파라미터를 통해 - constructor-arg 

2. setter() : setter를 통해 - property


왼쪽의 Student는 xml 파일을 통해 bean을 생성해서 주입한다.

오른쪽의 Student는 java파일 그 자체를 통해 주입할 수도 있다.