본문 바로가기
Spring

[Spring] DI( Dependency Injection )에 대해 알아보자 (1) 생성자를 통한 의존성 주입

by 신입같은 3년차 2017. 12. 17.

안녕하세요. 오늘은 스프링 프레임워크의 특징은 의존성주입인 DI 즉, Dependency Injection에대해 알아 보겠습니다.

 

 

wikipedia 참고하였음

의존성 주입 (DI) 란 구성요소간의 의존관계가 소스코드 내부가 아닌 외부의 설정파일 등을 통해 정의되게 하는 디자인 패턴중 하나이다.

 

 

DI 의존객체의 전달방법에는 2가지가 있습니다.

 

바로 생성자 방식과 프로퍼티 방식입니다.. 이렇게 말로만하면 이해하기 어려우실까봐 부족한 실력입니다만 코드를 첨부해 보겠습니다.

 

그전에 생성자 방식과 프로퍼티 방식에대해 간단하게 알아보고 들어가겠습니다.

 

 - 생성자 방식

말그대로 생성자를 통해 생성될때 파리미터로 넘겨받아 의존성을 주입해주는 방식입니다.

 

 

 - 프로퍼티 방식

set메소드를 이용하여 의존성을 주입해주는 방식입니다.

 

setParameter() 라는 set 메소드가 있다면 실제로 bean을 등록할때는  set을 뺀 Parameter()에서 맨앞자리를 소문자로 바꿔준 parameter로 사용하면 됩니다. 직접 실습해보겠습니다.

 

이번 글에서는 프로젝트 생성화면은 제외하고 진행하겠습니다.  ( Spring Legacy Project -> Spring MVC Project ) 로 생성하였고 필요없는 Dependency는 다 삭제하였습니다.

 

저의 개발 셋팅은 다음과 같습니다. 

 

jdk 1.8_144 , Apache Tomcat v8.5  , spring-webmvc 4.3.4.RELEASE로 진행하겠습니다.

 

 

 

의존성을 주입하는 첫번째 생성자 방식입니다.

 

person.xml에서 빈을 등록하고 루트 디렉터리 ( " / " )로 접근시 컨트롤러에서 빈을 변수에 담아서 View로 던져서 출력하는 코드를 

 

실습하겠습니다.

 

* 생성자방식으로 bean생성시 주의사항 

 - 생성자함수의 파라미터의 순서대로 넣어줘야 한다는 점입니다.

 

디렉터리의 구조는 다음과 같습니다.

 

 

 

데이터를 받아 View에 뿌려주기위한 HomeController.java, 

데이터 전송을위한 Person.java 

빈 등록을 하기 위한 person.xml

빈을 통해 가져온 데이터를 출력할 home.jsp  총 4개로 구성되어있습니다.

 

(기본적인 component-scan은 생략하고 진행하도록 하겠습니다.)

 

다음은 HomeController.java Code입니다.

 

 

@Controller
public class HomeController {
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public ModelAndView home(Locale locale, Model model) {
		
		//ModelAndView를 통해 View지정.
		ModelAndView mv = new ModelAndView("home");
		
		GenericXmlApplicationContext context = new GenericXmlApplicationContext("classpath:person.xml");
		
		//id가 person 빈객체를 가져와서 Person.class 타입으로 가져옵니다.
		Person person = context.getBean("person" , Person.class);
		String name =  person.getName();	//이름
		int age = person.getAge();			//나이
		String birth = person.getBirth();	//생년월일 앞자리
				
		mv.addObject("name", name );
		mv.addObject("age", age );
		mv.addObject("birth", birth );
		
		return mv;
	}
}

 
 
 

 

다음은 Person.java DTO class입니다.

 

 

public class Person {
	/** 
	 * 이름 , 나이 , 생년월일 앞자리.
	 * */
	private String name;
	private int age;
	private String birth;
	
	// 생성자 함수
	public Person() {
		// TODO Auto-generated constructor stub
	}

	public Person(String name, int age, String birth) {
		super();
		this.name = name;
		this.age = age;
		this.birth = birth;
	}

	// setter/getter
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getBirth() {
		return birth;
	}

	public void setBirth(String birth) {
		this.birth = birth;
	}
}

 

 

 

빈을 등록할 person.xml 입니다.

 

 - class : 

 

<?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="person" class="yunjin.tistory.DTO.Person">
		<constructor-arg value="최윤진"/>
		<constructor-arg value="25"/>
		<constructor-arg value="930925"/>
	</bean>
</beans>

 

person.xml을 해석하면 다음과 같습니다.

 

생성할 빈 객체의 완전한 클래스 이름 : yunjin.tistory.DTO.Person , id가 person을 만드는데 생성자의 첫번째 value로는 "최윤진" , 두번째 value로는 "25", 세번째 value로는 ="930925"를 입력받습니다. 

 

하지만 person.xml을 보면 이상한점이 있습니다. 나이는 int 로 선언했는데 "(더블퀘테이션)으로 감싸있는것을 확인할수 있습니다. 저도 정확 하지는 않지만 spring에서 자체적으로 자료형에 맞게 값을 대입해주는것같습니다. 이부분은 찾아보는대로 수정하도록 하겠습니다. 아시는분있다면 댓글부탁드립니다.ㅠㅠ

 

 

자, 이제 HomeController에있는 @RequestMapping 어노테이션에 등록된 value ="/"이기때문에 URL이 루트디렉터리로 접근하게되면 ModelAndView를통해 리턴시켜줄 jsp페이지를 등록할수 있습니다. WEB-INF/views/home.jsp를 접근할때 home만적어도 동작하는 이유는 WEB-INF/spring/appServlet/servlet-context.xml에 org.springframework.web.servlet.view.InternalResourceViewResolver가 빈으로 생성되있어 자동으로 prefix와 suffix를 통해 앞뒤를 등록해주었기때문입니다.

 

그럼 다시 진행해서 GenericXmlApplicationContext를 통해 person.xml을 읽고 getBean(id) 를 통해 해당 id값인 bean 객체를 가지고 옵니다. 그후에 ModelAndView 로 생성된 객체에 addObject로 key value 관계로 값을넣어주고 ModelAndView를 리턴해줍니다.

 

리턴타입이 ModelAndView이기 때문에 home메소드의 반환타입은 ModelAndView가 됩니다.

 

그럼 결과값을 보겠습니다.

 

 

그러면 다음과같이 실행된 웹페이지에 이름, 나이 , 생년월일이 찍힌것을 확인할 수 있습니다.

 

 

이렇게 DI중에서도 생성자를 통한 의존성 주입에 대해 알아봤습니다. DI를 말로설명하면 짧아도 이렇게 블로그에 글을적으려니 생각보다 양이 많네요 ㅎㅎ 그래서 1편과 2편으로 생성자 의존성주입, 프로퍼티를통한 의존성 주입 두번으로 나눴습니다. 

 

글을 읽어보시다가 이해가 안된다던지 틀린부분에대한 댓글을 남겨주시면 바로바로 확인하고 수정하겠습니다.

 

감사합니다.  그리고 spring 환경셋팅은 프로퍼티를 통한 의존성주입다음 글로 넣어보도록 하겠습니다.

 

 

반응형

'Spring' 카테고리의 다른 글

[Spring] 스프링 프레임워크에 대해 알아보자  (0) 2017.12.16

댓글