프로그래밍/Spring

스프링(Spring) - DI(Depedency Injection) 개념과 예제 : 생성자 사용

abfc 2016. 10. 23.
반응형

예제 파일 : 

diEx2.zip



이전 포스트에서 DI의 방식 중 setter()를 사용하였습니다. 이번 포스트에서는 생성자를 사용해보도록 할게요.

참고 : 스프링(Spring) - DI(Depedency Injection) 개념과 예제 : setter() 사용



생성자를 사용한 예제)


이전 setter방식과 다르게 MyCats에 setter()가 없고 생성자를 이용해서 name, age, hobbys를 인자로 받아와 필드에 있는 name, age, hobbys를 초기화 시켜주었고, Cats에서도 마찬가지로 myCats를 인수로 받아와서 필드의 myCats값을 초기화 시켜주었습니다.


메인클래스에서는 이전과 똑같은 방법으로(getBean) 객체를 얻어와서 사용합니다. 얻어온 객체를 보시면 catsInfo라는 객체를 얻어왔다고 되어있네요. applicationContext.xml에서 catsInfo객체를 확인해봐야겠죠?


 생성한 첫번째 객체를 보시면 "이 객체의 이름(id)은 cat1이고, diEx2패키지에 있는 MyCats 클래스입니다" 라고 보시면 됩니다. MyCats 클래스에는 name, age, hobbys를 인자로 받아와서 필드값을 초기화 시켜주는 생성자가 있었죠? 생성자에 값을 넘겨주기 위해서는 이전에 했던 property가 아닌 constructor-arg를 사용해서 값을 넘겨줍니다. (property는 setter()가 있어야 사용이 가능합니다.) 생성자에서 받아오는 인자 순서대로 이름, 나이, 취미를 넣어주면 되고요.


 두번째 객체를 보시면 "이 객체의 이름(id)은 catsInfo이고, diEx2패키지에 있는 Cats 클래스입니다" 겠죠? Cats클래스에도 생성자가 있었습니다. myCats를 인자로 받아와서 필드에 있는 myCats의 값을 초기화 시켜주기 때문에 마찬가지로 contructor-arg를 이용하여 값을 넘겨줍니다. <ref bean = "cat1"/> 위에서 만든 cat1이라는 bean(객체)를 참조하겠다고 작성했기 때문에 첫번째 객체인 cat1의 값들이 넘어가서 생성자를 통해 초기화 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package diEx2;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
 
public class MainClass {
 
    public static void main(String[] args) {
        
        //bean을 설정한 xml파일이 있는 위치 지정
        String configLocation = "classpath:applicationContext.xml";
        
        //지정한 위치를 참고하여 설정파일을 얻어옴
        AbstractApplicationContext ctx = 
                new GenericXmlApplicationContext(configLocation);
        
        //설정파일에서 bean을 가져옴
        //getBean()를 이용해서 Cats타입에서 catsInfo를 얻어와서 객체를 생성 
        // = 방법1 예제처럼 직접 생성이 아닌 외부에서 얻어옴(주입을 시켜줌)
        Cats catsInfo = ctx.getBean("catsInfo",Cats.class);
        
        //호출
        catsInfo.getMyCatsInfo();
    }
 
}
cs


메인클래스를 다시 보시면 getBean으로 MyCats를 참조하고 있는 catsInfo라는 객체를 가져와서 catsInfo에 있는 getMyCatsInfo() 메서드를 사용하여 고양이의 정보를 출력해줍니다.


결과화면)

고양이가 두마리일 경우에는 어떻게 출력하는지도 살펴볼까요?

applicationContext에서 cat2라는 bean을 생성하고 값을 설정해 주었습니다. property와 같이 <contructor-arg>안에 바로 value 값을 넣어줘도 됩니다. 아래에 아까 생성한 catsInfo라는 객체는 여전히 cat1을 참조하고 있습니다.(변경사항 없음)



Cats클래스에서 두번째 고양이의 정보도 출력할 수 있게 set메서드를 추가해줄게요.


setMyCatsInfo() 메서드에서 인자값으로 myCats를 받아와서 필드의 myCats에 값을 넣어줍니다. 어디서 받아올까요? 메인 클래스에서 넘겨주면 됩니다.

첫번째 고양이의 경우 catsInfo라는 객체에서 cat1을 참조하기 때문에 따로 set을 해주지 않아도 되지만 두번째 고양이의 객체는 참조하고 있지 않으니 직접 set을 해줍니다. 

 getBean을 통해서 cat2 객체를 얻어와서 위에서 생성한 setMyCatsInfo에 인자값으로 넣어줍니다. 그럼 Cats클래스에서 받아온 인자값을 필드값에 넣어주겠죠? 그 후에 getMyCatsInfo() 메서드를 호출해서 cat2의 값이 들어간 정보를 출력해줍니다. (그리고.... 이전 포스팅에서 깜빡했는데 다 사용한 객체는 close()를 이용해서 닫아주어야 무리가 안간다고 하네요.^^;)




 예제를 통해서 setter()와 생성자를 이용해서 의존성을 주입시켜주는 방법을 살펴보았습니다. 어때요? 개념만 읽는 것보다 직접 예제를 통해서 의존성을 주입시켜주니 어렵지 않죠?

 예제와 같이 setter를 사용해도 되고, 생성자를 사용해도 됩니다. 물론 둘 다 사용하는것도 가능하니 자신이 편한 방식대로 사용하면 될것같습니다. 당연한 얘기지만 property를 사용할때는 꼭 setter()가 있어야하고, constructor-arg를 사용할때는 생성자가 있어야 한다는 것!   



**

예제 파일은 따로 올려드리지만 꼭 직접 해보시고, 본인의 것으로 만드시길 바랍니다!







반응형

댓글

💲 추천 글