일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 | 29 | 30 |
- Java
- 인터페이스
- 컬렉션프레임워크
- 자동차수리시스템
- EnhancedFor
- 한국건설관리시스템
- 대덕인재개발원
- cursor문
- 제네릭
- 생성자오버로드
- 환경설정
- 객체 비교
- 예외처리
- exception
- 메소드오버로딩
- oracle
- 사용자예외클래스생성
- 어윈 사용법
- abstract
- 참조형변수
- 다형성
- NestedFor
- 자바
- 정수형타입
- GRANT VIEW
- 컬렉션 타입
- 추상메서드
- 오라클
- 예외미루기
- 집합_SET
- Today
- Total
거니의 velog
(4) 스프링 의존성 주입과 제어 역전 기능 3 본문
(2) 생성자를 이용한 DI 기능
* 이번에는 생성자 주입 방식으로 DI를 실습해 보자.
1. com.spring.ex02 패키지를 만들고 다음과 같이 클래스를 추가한다.
2. person.xml을 다음과 같이 작성한다. <bean> 태그를 이용해 id가 personService1인 빈을 생성하고 <constructor-arg> 태그를 이용해 생성자 호출 시 생성자 매개변수로 <value> 태그의 값을 전달하여 속성을 초기화한다. 이처럼 PersonServiceImpl 클래스의 인자가 한 개인 생성자를 이용하여 name 속성에 <value> 태그 값이 주입된다. 두 번째 <bean> 태그에서는 빈 생성 시 인자가 두 개인 생성자를 호출하면서 두 개의 값을 전달하여 각각의 속성을 초기화한다. 즉, PersonServiceImpl 클래스의 인자가 두 개인 생성자를 이용해 name과 age 속성에 <value> 태그의 값이 차례대로 주입된다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<!-- <bean>태그를 이용해 PersonServiceImpl 객체(빈)를 생성한 후 빈 id를 personService로 지정한다. -->
<!-- PersonServiceImpl 객체의 속성 name 값을 <value> 태그를 이용해 '홍길동'으로 초기화한다. -->
<!-- <bean id="personService" class="com.spring.ex01.PersonServiceImpl">
<property name="name">
<value>홍길동</value>
</property>
</bean> -->
<!-- 인자가 한 개인 생성자로 id가 personService1인 빈을 생성한다. 생성자로 value인 이순신을 전달하여 속성 name을 초기화한다. -->
<bean id="personService1" class="com.spring.ex02.PersonServiceImpl">
<constructor-arg value="이순신" />
</bean>
<!-- 인자가 두 개인 생성자로 id가 personService2인 빈을 생성한다. 생성자로 두 개의 값을 전달하여 name과 age를 초기화한다. -->
<bean id="personService2" class="com.spring.ex02.PersonServiceImpl">
<constructor-arg value="손흥민" />
<constructor-arg value="23" />
</bean>
</beans>
3. PersonServiceImpl 클래스에서는 인자가 한 개인 생성자와 두 개인 생성자를 구현한다.
package com.spring.ex02;
public class PersonServiceImpl implements PersonService {
private String name;
private int age;
public PersonServiceImpl(String name) {
this.name = name;
} // person.xml에서 인자가 한 개인 생성자 설정 시 사용된다.
public PersonServiceImpl(String name, int age) {
this.name = name;
this.age = age;
} // person.xml에서 인자가 두 개인 생성자 설정 시 사용된다.
@Override
public void sayHello() {
System.out.println("이름: " + name);
System.out.println("나이: " + age + "살");
}
}
4. 실행 클래스인 PersonTest2를 다음과 같이 작성한다. id가 personService1인 빈에 접근하여 sayHello() 메서드를 호출하면 age는 0으로 출력된다. 반면에 id가 personService2인 빈에 접근한 후 sayHello() 메서드를 호출하면 두 속성 값이 모두 출력된다.
package com.spring.ex02;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class PersonTest2 {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
PersonService person1 = (PersonService) factory.getBean("personService1"); // id가 personService1인 빈을 가져온다.
person1.sayHello(); // 빈의 sayHello()을 호출한다.
System.out.println();
PersonService person2 = (PersonService) factory.getBean("personService2"); // id가 personService2인 빈을 가져온다.
person2.sayHello();
}
}
5. 다음은 main() 메서드가 있는 실행 클래스(PersonTest2.java)가 보이는 상태에서 실행 버튼을 클릭하여 실행한 결과이다.
3. 회원 기능 이용해 DI 실습하기
* 앞에서는 설정 파일에서 기본형 데이터를 빈의 속성 값으로 직접 주입해서 사용했다. 이번에는 빈에 주입되는 값이 의존 관계에 있는 다른 빈을 주입하는 경우를 살펴보자.
* 다음 그림은 회원 기능 관련 Service 클래스와 DAO 클래스의 계층 구조를 나타내었다. Service 클래스는 데이터베이스와의 연동을 위해 DAO 클래스에 의존하는 관계임을 알 수 있다.
* 이전에 다룬 게시판 실습 예제가 있을 것이다. 이 때 Service 클래스는 소스 코드에서 직접 DAO 객체를 생성한 후 DAO에서 제공하는 메서드를 이용하여 데이터베이스와 연동했다. 그러면 이전의 경우와 DI를 이용하는 경우가 어떻게 다른지 다음 실습을 통해 알아보자.
1. 같은 프로젝트에 member.xml을 생성한다.
2. member.xml에서는 두 개의 빈을 동시에 생성한 후 id가 memberService인 빈이 id가 memberDAO인 빈을 자신의 속성 memberDAO인 빈을 자신의 속성 memberDAO에 바로 주입한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<!-- MemberServiceImpl 클래스를 이용해 id가 memberService인 빈을 만든다. 빈을 만들면서 setter 주입 방식으로 id가 memberDAO인 빈을 자신의 속성에 주입한다. -->
<bean id="memberService" class="com.spring.ex03.MemberServiceImpl">
<property name="memberDAO" ref="memberDAO" /> <!-- 주입되는 데이터가 기본형이 아닌 참조형인 경우 ref 속성으로 설정한다. -->
</bean>
<bean id="memberDAO" class="com.spring.ex03.MemberDAOImpl" /> <!-- id가 memberDAO인 빈을 MemberDAOImpl을 통해 만든다. -->
</beans>
* 의존하는 빈을 주입할 때는 주입되는 타입이 기본형 데이터가 아닌 참조형 데이터일 경우 ref 속성을 이용해 주입해야 한다는 것을 잊지 말자. member.xml에서 빈을 주입하는 과정은 다음과 같다.
3. MemberServiceImpl 클래스는 다음과 같이 setter로 주입되는 빈을 받을 MemberDAO 타입의 속성과 setter를 이용해 구현한다.
package com.spring.ex03;
public class MemberServiceImpl implements MemberService {
private MemberDAO memberDAO; // 주입되는 빈을 저장할 MemberDAO 타입의 속성을 선언한다.
public void setMemberDAO(MemberDAO memberDAO) {
this.memberDAO = memberDAO;
} // 설정 파일에서 memberDAO 빈을 생성한 후 setter로 속성 memberDAO에 주입한다.
@Override
public void listMembers() {
memberDAO.listMembers(); // 주입된 빈을 이용해 listMembers() 메서드를 호출한다.
}
}
4. 다음은 주입되는 빈에 해당하는 MemberDAOImpl 클래스이다.
package com.spring.ex03;
public class MemberDAOImpl implements MemberDAO {
@Override
public void listMembers() {
System.out.println("listMembers 메서드 호출");
System.out.println("회원정보를 조회합니다.");
}
}
5. 실행 클래스인 MemberTest1에서는 member.xml을 읽어 들인 후 빈을 생성한다. 그리고 setter 주입 방식으로 주입한 후 빈 id인 memberService로 접근하여 listMembers() 메서드를 호출한다.
package com.spring.ex03;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class MemberTest1 {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("member.xml")); // 실행 시 member.xml에 설정한 대로 빈을 생성한 후 주입한다.
MemberService service = (MemberService) factory.getBean("memberService"); // id가 memberService인 빈을 가져온다.
service.listMembers();
}
}
6. main() 메서드가 있는 실행 클래스(MemberTest1.java)가 보이는 상태에서 실행 버튼을 클릭해 실행한다. 이클립스 콘솔에서 MemberDAO의 ListMembers() 메서드를 호출한다는 결과를 확인할 수 있다.
* 이 예제에서는 자바 코드로 어떤 클래스 객체도 생성하지 않았다. 오로지 스프링의 DI 기능을 이용해 빈을 생성했고, 의존 관계에 있는 빈을 속성에 주입한 후 빈의 기능을 사용했다.
* 이후 진행할 스프링 관련 실습에서도 지금 실습한 방식으로 빈을 생성한 후 사용한다. 자바 코드로 직접 빈을 생성해서 사용하는 방식과 DI를 이용해서 실습한 방식이 어떻게 다른지 잘 구분해 두자.
'Java_Spring Framework part1' 카테고리의 다른 글
(6) 스프링 MVC 기능 1 (0) | 2023.10.03 |
---|---|
(5) 스프링 AOP 기능 (0) | 2023.10.03 |
(3) 스프링 의존성 주입과 제어 역전 기능 2 (0) | 2023.10.02 |
(2) 스프링 의존성 주입과 제어 역전 기능 1 (0) | 2023.09.27 |
(1) 스프링 프레임워크 시작하기 (0) | 2023.09.27 |