JAKARTAPROJECT
JAKARTA TIPJSP TIPJSP 질문&답변DATABASE TIPJAVASCRIPT TIPWEBHACKING TIP기타 TIP
JSP 팁
JSP 팁
JSP 팁 게시판 입니다
Spring 빈묶기- 생성자를 통한 의존성 주입
kaiser
이미지 슬라이더 보기
 

자바에서는 클래스는 하나 이상의 생성자를 가질수 있다. 생성자를 이용하여 해당 빈을 속성값을 셋팅할수 있다.

생성자를 통해 속성값을 셋팅하는 것은 강한 의존성을 가지는 반면, 세터를 이용하여 셋팅하는 것은 어떤 속성이 필수인지 아닌지를 설정할 수가 없는 점이 발생한다.

세터 주입의 경우에는 주입하고자 하는 특성을 <property> 요소를 사용하여 정의했다.

생성자 주입의 경우도 마찬가지인데, 다만 빈이 인스턴스화될때 생성자에 전달할 인자를 <bean> 하위요소로서 <constructor-arg> 사용하여 지정한다는 점이 다르다.

또한 <constructor-arg> <property> 요소와는 달리 name 속성을 갖지 않는다

 

다음은 생성자 주입을 사용하는 설정예제이다.

 

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg>

<value>42</value>

</constructor-arg>

</bean>

 

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg>

<ref bean = "bar" />

</constructor-arg>

</bean>

 

모호한 생성자 인자의 처리

 

만약 생성자의 인자들의 값들이 동일한 타입이라면 어떤 인자에 어떤값을 넣을지 Spring 컨테이너는 어떻게 있을까?

 

예제를 보면

 

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg>

<value>http://www.maning.com </value>

</constructor-arg>

<constructor-arg>

<value>http://www.springinaction.com </value>

</constructor-arg>

</bean>

 

 

빈에서는 다음과 같이…

 

public class Foo {

Public Foo(String arg1, java.net.URL arg2){

...

}

}

 

이라는 가정하에서 보자.

Spring 빈을 묶을   인자값을 어떻게 할당할까요?

답은 spring org.springframework.beans.factory.UnsatisfiedDependencyException 던져 사용자에게 생성자의 인자에 모호함을 알려준다.

생성자 인자를 다룰 있는 방법에는 2가지 존재하는데 하나는 색인을 이용하는 것과 타입을 이용하는 것이다.

 

1. Index 이용

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg   index = "1">

<value>http://www.maning.com </value>

</constructor-arg>

<constructor-arg   index = "0">

<value>http://www.springinaction.com </value>

</constructor-arg>

</bean>

 

Index 0 부터 시작이다. 0번이 첫번째 인자값에 할당 되고 1번째가 두번째 인자값에 할당된다.

 

2. Type 이용

 

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg   type = "java.lang.String">

<value>http://www.maning.com </value>

</constructor-arg>

<constructor-arg   type = "java.net.URL">

<value>http://www.springinaction.com </value>

</constructor-arg>

</bean>

 

인자에 맞는 형에 할당되어진다. 만약 같은 형이 2 이상 존재한다면 반드시 index 이용해야 한다.

 

생성자와 세터 비교

 

1. 생성자의 장점

- 생성자 주입은 강한 의존성 계약을 강제한다. 요컨데, 빈은 모든 의존성에 대해 총족되지 않으면 인스턴스화될 없다. 일단 인스턴스화되면 빈은 완벽하게 유효하며 즉시 사용 가능한 상태가 된다. 물론 이는 빈의 생성자가 빈의 모든 의존성에 해당하는 파라미터 목록을 갖고 있다는 가정하에 그렇다.

- 빈의 모든 의존성이 생성자를 통해 설정되기 때문에, 불필요한 세터 메소드를 가질 필요가 없다. 이는 코드의 양을 최소로 유지시켜주는 장점이 있다.

- 오직 생성자를 통해서만 특성을 설정할 있도록 함으로써, 자연히 특성을 변경되지 않는 특성이 되는 효과가 있다.

 

2. 생성자의 단점

- 빈이 여러 개의 의존성을 갖는 경우에는 생성자의 파라미터 목록이 매우 길어진다.

- 유효한 객체를 구성하는 다양한 방법이 존재한다면, 오직 파라미터의 수와 타입에 의해 생성자의 시그니처(signature) 다양해질 것이므로 특정한 생성자를 식별하기가 어려워진다.

- 만약 생성자가 동일한 타입의 두개 이상의 파라미터를 취한다면, 파라미터의 목적을 파악하기 어려워질 것이다.

- 생성자 주입은 자체로 즉시 상속에서 사용할 없다. 부모 객체의 private 특성을 설정하기 우해서는 빈의 생성자에서 항상 파라미터를 super() 넘겨야 것이다.

 

세터와 생성자중 어느것을 선택해도 상관이 없다. 가장 좋은 방안은 spring 설정 파일의 명확하게 만들주기만 하면 된다.

참고로 위의 장단점을 파악하여 좋은것을 취하는 방법이 우선적으로 하고 단점이 생기지 않도록 설정파일을 만들면 될것 같다.

2007-02-22 01:33:01
211.189.124.***

서현사랑~ 안녕 안녕 나의 아기별~~

0점 (0명)
덧글 2개 | 태그 1개 | 관련글보기
태그입력
쉽표(,)구분으로 한번에 여러 태그를 입력할수 있습니다
spring (18)
GoodBug
(0) (0)

대용씨 열심히시네요 ^^

저도 이번 플젝끝나면 다시 공부를 ^^;

220.70.88.*** 2007-02-22 00:13:57
kaiser
(0) (0)

근데 제가 잘하고 있는건지 반응이 없어서...쩝...

211.234.208.*** 2007-02-22 01:33:01
이름 비밀번호
JSP 팁
JSP 팁 게시판 입니다
! 번호 제목 글쓴이 일자 조회
114 STS Spring MVC on STS 2.8, 2.9 버전에서 프로젝트 생성시 에러발생 할 경우 1 GoodBug 2012-03-08 8,042
113 dbcp DBCP 사용시 DB정보 암호화 1 GoodBug 2012-02-08 5,555
112 스트럿츠 action alert 메시지 출력 후 페이지 이동 & 뒤로가기 예방 행복한광대 2009-01-14 11,605
111 spring spring 자동묶기 1 kaiser 2007-03-12 11,816
spring Spring 빈묶기- 생성자를 통한 의존성 주입 2 1 kaiser 2007-02-21 21,576
109 spring Spring 빈묶기-세터메소드를 통한 의존성 주입 1 kaiser 2007-02-21 11,879
108 spring Spring - xml로 묶기 1 kaiser 2007-02-07 12,367
107 spring Spring 빈묶기-기본묶기 1 kaiser 2007-02-05 8,785
106 spring spring 빈묶기-2 1 kaiser 2007-01-29 9,646
105 spring Spring 빈묶기-1 1 kaiser 2007-01-29 9,718
104 spring Spring 1차 요약 1 kaiser 2007-01-23 10,789
103 spring spring 시작하기-2 1 1 kaiser 2007-01-22 9,942
102 spring Spring 시작하기-1 4 1 kaiser 2007-01-22 11,649
101 spring Spring 서론 - spring 설치 1 1 kaiser 2007-01-19 13,327
100 clob 사용하기 kaiser 2008-08-21 7,645
99 span 글쓰기 후 사용할 protoload 1 1 고고싱 2008-05-09 7,139
98 log4sql log4sql 1 1 Aki 2008-04-30 8,371
97 숫자 세자리마다 콤마 찍기 1 곱슬대마왕 2008-03-21 8,476
96 iBatis iBatis 에서 SQL 로깅시 이뿌게 보이기 6 1 GoodBug 2007-10-26 22,577
95 log4sql요즘 많이 쓰는것 같던데.... 영이남푠 2008-10-17 8,096
copyright 2005-2018 by Unicorn