DI 의존주입 & Bean 생성과 사용
-> service 클래스를 둔다. ( studentdao 객체를 멤버변수로 가지며, 생성자의 매개변수로 studentdao객체를 전달받아서 초기화한다)
-StudentDao 클래스 생성
public class StudentDao {
String driver;
String url;
String id;
String pw;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// 스프링 컨테이너에 넣어서 사용할 예정이므로, 싱글턴 코딩은 하지 않겠습니다.
StudentDao( DataBaseConnectionInfo dbconinfo ){
this.driver = dbconinfo.getDriver();
this.url = dbconinfo.getUrl();
this.id = dbconinfo.getId();
this.pw = dbconinfo.getPw();
}
-> 보이는 것처럼 StudentDao 의 생성자는 전달인수로 DataBaseConnection 객체가 필요하다.
-> xml 파일에 있는 Bean 객체를 이용하면 ok (빈 객체를 이용하여 의존 주입을 해준다.)
<bean class="com.ezen.member.dto.DataBaseConnectionInfo" id="dbconinfo1">
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="id" value="scott" />
<property name="pw" value="tiger" />
</bean>
-> 스프링 컨테이너의 Bean 태그에 property 태그를 이용하여 각 멤버변수에 초기값을 넣어줄 수 있다.
-> 단, 위와 같이 객체의 생성과 동시에 멤버변수에 초기값을 넣어주기 위해서는 해당 객체의 클래스에 getter/setter 메서드가 존재해야한다.
package com.ezen.member.dto;
public class DataBaseConnectionInfo {
private String url;
private String id;
private String pw;
private String driver;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
}
-만약 다른 내용의 객체가 필요하다면 , id만 달리해서 bean객체를 새로 생성해서 쓰면된다.
<bean class="com.ezen.member.dto.DataBaseConnectionInfo" id="dbconinfo2" >
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="id" value="system" />
<property name="pw" value="adminuser" />
</bean>
- studentDao 생성자에 의존 주입해주기
<bean class="com.ezen.member.dao.StudentDao" id="studentdao">
<constructor-arg ref="dbconinfo1"></constructor-arg>
</bean>
-> < constructor-arg ref="id명"> 태그를 이용하여 전달인수로 전달
- 학생정보를 조회하는 StudentSelectAllService 클래스 생성
package com.ezen.member.service;
import java.util.ArrayList;
import com.ezen.member.dao.StudentDao;
import com.ezen.member.dto.Student;
public class StudentSelectAllService {
private StudentDao sdao;
StudentSelectAllService( StudentDao sdao){
this.sdao = sdao;
}
public ArrayList<Student> selectAllStudent( ) {
ArrayList<Student> list = null;
list = sdao.selectAllStudent( );
return list;
}
}
-> 위에서 언급한대로, studentdao 객체를 매개변수로 필요로 함
-> 다시 applicationContext.xml 파일로 가보면..
<bean class="com.ezen.member.dto.DataBaseConnectionInfo" id="dbconinfo1">
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="id" value="scott" />
<property name="pw" value="tiger" />
</bean>
<bean class="com.ezen.member.dao.StudentDao" id="studentdao">
<constructor-arg ref="dbconinfo1"></constructor-arg>
</bean>
<bean class="com.ezen.member.service.StudentSelectAllService" id="selectAllService" >
<constructor-arg ref="studentdao" ></constructor-arg>
</bean>
-> DataBaseConnection 객체를 생성하고 property 태그를 이용하여 정보를 입력해놓은 Bean
-> 그 Bean을 StudentDao 클래스의 생성자 객체의 전달인수로 전달 ----> dbconinfo1 정보가 들어간 studentdao 객체 생성
-> 다시 StudentSelectAllService 클래스의 생성자 객체의 전달인수로 studentdao (Bean 객체) 를 전달
-> dbconinfo1정보가 들어간 studentdao 객체를 전달인수로 받은 selectAllService 객체가 생성됨.
-> 왜 굳이 Bean 객체를 이용하여 student 객체를 전달인수로 전달하느냐?
위에서 설명했듯이 만약 다른 DB정보가 들어간 studentdao 객체가 필요하다면 일일이 dbconinfo1의 property 내용을 수정해야하는 번거로움이 있다. (의존도가 높기때문)
하지만 BEAN을 사용하여 의존주입을 하게되면, 필요로 하는 정보가 담긴 dbconinfo2 객체를 생성하고, 그것을 전달인수로 받은 student2 객체를 전달인수로 의존주입 해주면 OK이다.