글 작성자: 개발섭

의존성 주입의 경우 DI(Dependency Injection)라고도 부르고, 꼭 Spring에 국한되어서 적용되는 것은 아님.

Java계열의 언어들이나 사용값에 대해서 다 적용된다고 합니다. (Java, JSP, android)

 

자바의 경우 한객체에서 다른 객체를 받아오는 방식으로 변수형식으로 받지 않고, 생성자에 의해서 넣는 방식으로 들어가게된다면, 객체를 직접 만드는 방식이 아닌 만들어진 객체를 넣어서 사용하는 방식으로 작동한다.

 

Spring은 스프링 설정 파일에 의해서 스프링 컨테이너에 의해서 bean이란 객체를 만들어서 직접 이 객체를 필요하는 곳에 자동으로 넣어주는 방식을 취합니다. 

혹은 Spring의 bean은 큰 객체안에 작은 객체를 넣어서 큰 Bean을 만드는 방식으로 작용할 수 도 있습니다. 

 

Spring Bean에서 객체 주입

이런 빈을 주입하는 방식은 간단하게 쓸수 있습니다.

 

wa라는 id를 가진 객체를 walk라는 id를 가진 객체에  넣는 방식으로 

<constructor-arg>를  bean안에 넣어주면 됩니다. 이러면 wa가 가진 형식을 walk가 가지게 할 수 있습니다. 결국 객체안에 객체를 넣는 방식 자체가 생성자를 굳이 쓰지 않아도 getBean(),  GenericXmlApplicationContext 와 같은 것으로 굳이 여러번 객체를 만들어내지 않아도 객체를 간편하게 한줄로 넣을 수 있습니다.

 

Spring에서 객체 주입 방식들

객체를 넣는 방식은 여러가지가 존재할 수 있습니다 . 1. 생성자, 2, setter의 의한 의존객체주입 3.List형의 객체 주입 4. map형의 객체주입

 

1. 생성자의 경우 

<constructor-arg>를 사용하여 ref =""안에 넣고 싶은 객체의 id명을 입력합니다. 

 

2. setter의 경우

setter

setter의 경우 set을 만들어 놓은뒤에

일단 이 setter를 가지고 있는 class bean객체를 만들어 놓은뒤에 <property>를 통해서 setter를 받습니다.

Name란에 setter의 set을빼고 Moving의 M을 소문자로 만들어 입력을 받고

value란에 그 setter의 받는 int x값을 넣어줍니다.  저는 일반적인 값인 100인 integer를 넣었습니다.

 

3. List의 경우 

<property>를 사용하는데, name은 같은 방식 

그이후에  <list>와 <value>를 통해서 그 안의 값들을 변경 할 수 있습니다.

 

4. Map의경우

<property>를 사용하는데, name은 같은 방식

그 이후에 <map>태그와 <entry>로 key값과 value값을 따로따로 분리해서 가져갑니다.key value는 key의 값 value는 key값 안에 있는 value값입니다.

 

스프링 설정파일 분리

spring의 설정 xml파일이 이런식으로 계속 길어지다보면 일단 코드를 짤때 어디에 무엇이 있는지 명확하게 찾기도 어렵고, 일일히 스크롤 하고 내가 이코드를 썻는지 확인해보는 과정을 걸처야하는데, 그러면 생산성이 떨어지니까 스프링에서 xml파일을 분리해서 관리하는 방식을 채용합니다.

 

이 분리된 xml을 모두 사용하는 방식은 두가지 정도로 분류가 되는데, 

 

1. xml String[] 배열을 만들어서 GenericXmlApplicationContext을 넣을때 String배열로 들어가는 방식을 취하기.

 

2. xml파일에서 <import resource = "">을 사용해서 xml파일에 xml위치를 다 넣는 방식을 취함.

 

스프링 Bean의 범위

스프링에서 Bean은 기본적으로 싱글톤(Singleton)의 형식을 취하고 있다. 객체를 새로 생성하는 방식이 아닌 한번 객체를 만들면 계속 그 객체에서 사용하는 방식이다. 동일한 객체에서 모든 값을 가져오거나 특정 메소드를 작동시키는 방식이다.

 

단, 같은 객체를 여러가지를 만드는 방식은 bean 태그 안에 Scope="prototype"을 넣어 주면 된다. 

마치 new 처럼 여러가지 다른 객체로 만드는 방식은 이와 같이 prototype을 통해서 여러가지 다른 객체를 만들어가는 방식으로 사용되어집니다.