티스토리 뷰
포스팅에 앞서...
이 포스팅은 Spring Framework 를 이용한 Java 코드 위주의 설명입니다.
관련 코드는 아래 링크를 통해 깃허브에서 받아보실 수 있습니다.
https://github.com/ChoHyeonJunn/Workspace_Spring
Spring03 프로젝트에 com.test03 패키지에서부터 testCode 를 진행하겠습니다.
실습의 주요 내용은 클래스의 구성에 따라 applicationContext.xml (IoC Container) 를 작성하고 main 메서드에서 이를 사용하는 방법에 대한 내용입니다.
http://www.springframework.org/schema/beans/spring-beans.xsd
다루게 될 주요 내용
TestCode
1. <Spring03 - com.test03 package>
com.test03 패키지의 클래스 구성도 입니다.
Engineer 클래스와 Developer 클래스는 Emp 클래스를 상속받고 있고, 각각의 생성자에서 Emp 클래스의 생성자를 호출한 모습입니다.
추가로 만든 필드 dept 는 Setter 메서드에서 초기화하고 있습니다.
applicationContext.xml 문서에서 bean 태그를 통해 Developer , Engineer 의 객체를 생성합니다.
<constructor-arg> 태그로 생성자에 아규먼트 셋
<property> 태그로 setter 에 변수 셋
이외에 특별한 점은 없습니다.
main()
package com.test03;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test03/applicationContext.xml");
Emp hong = factory.getBean("hong", Emp.class);
Emp lee = factory.getBean("lee", Emp.class);
System.out.println(hong);
System.out.println(lee);
}
}
2. <Spring03 - com.test04 package>
com.test04 패키지의 클래스 구성도입니다.
com.test03 패키지와의 차이점은 Engineer 와 Developer 클래스가 Emp 클래스를 상속받지 않고, 각각필드에 Emp 타입의 변수를 가지고 있다는 점입니다.
applicationContext.xml에서 위와 같은 구조의 객체를 생성하기 위해서는
<bean> 태그를 이용해 Emp객체를 만든 후, Engineer 와 Developer 객체 생성에서 'ref' 속성을 이용해 이를 참조해야 합니다.
12줄 : honggd 객체 생성시 <constructor-arg> 의 ref 속성을 이용해 (8줄 :) id가 hong인 객체를 생성자의 아규먼트에 주입합니다.
22줄 : 위 설명과 같습니다.
이외 특별한 점은 없습니다.
package com.test04;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test04/applicationContext.xml");
Developer hong = factory.getBean("honggd", Developer.class);
Engineer lee = factory.getBean("leess", Engineer.class);
System.out.println(hong);
System.out.println(lee);
}
}
3. <Spring03 - com.test05 package>
(클래스 구성은 위의 test04 패키지와 일치합니다.)
- c: & p: Schema의 사용
평소와 같이 applicationContext.xml 을 생성한 후, Namespaces 탭으로 들어가 c 와 p 체크박스를 체크해줍니다.
네임스페이스를 추가하면 c & p schema 를 사용 가능한데
<constructor-arg/> 혹은 <property/> 태그를 대신해서 c: p: 속성을 이용해 값을 지정해 줄 수 있습니다.
main()메서드를 통해 출력하는 내용도 com.test04패키지와 일치합니다.
4. <Spring03 - com.test06 package>
com.test06 패키지의 클래스구성도입니다.
이번 패키지에서는 applicationContext.xml 파일을 생성하지 않고 이를 BeanFactory 클래스를 이용해 대신해보도록 하겠습니다.
실제 applicationContext.xml (IoC Container) 즉 스프링 컨테이너에는 factory 패턴, singleton 패턴, strategy 패턴 등 다양한 패턴이 적용되어 있습니다.
이번 패키지에서는 BeanFactory 클래스에 factory 패턴을 적용한 모습을 살펴보겠습니다.
기본 클래스는 SamsongTV , IgTV 가 TV 인터페이스를 상속받고 있습니다. 필드는 따로 존재하지 않고 인터페이스에 정의한 가상클래스를 각각 SamsongTV , IgTV 클래스에서 구현하고 있습니다.
applicationContext.xml 을 대신하는 BeanFactory 클래스는 간단한 Factory 클래스의 모습을 보여주고 있으며 파라미터로 받는 String 변수의 값에 따라 리턴하는 클래스가 다릅니다.
main()
package com.test06;
import com.test07.TV;
public class MTest {
public static void main(String[] args) {
BeanFactory factory = new BeanFactory();
TV tv = (TV) factory.getBean("samsong");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
}
}
BeanFactory 객체를 생성한 main 메서드에서는 samsong 이라는 아규먼트를 전달해 객체를 호출하고 있습니다.
결과값은 위 console 창에 나온것 처럼 SamsongTV 객체가 생성되고 SamsongTV 의 멤버메서드들이 호출되는 모습을 보실 수 있습니다.
5. <Spring03 - com.test07 package>
com.test07의 클래스 구성도는 위의 com.test06 패키지와 같습니다.
다만 applicationContext.xml 파일을 생성하도록 하겠습니다.
bean 태그를 통해 SamsongTV 와 IgTV 의 객체를 생성한 모습입니다.
bean 태그의 속성으로 lazy-init 이라는 속성이 들어가있는데요.
기존 applicationContext의 객체가 생성되는 순간 bean 태그에 해당하는 객체들이 동시에 생성되던 것과 달리
lazy-init 속성을 사용하면 호출측에서 해당객체를 생성하기 전에는 객체가 생성되지 않습니다.
main()
package com.test07;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test07/applicationContext.xml");
//TV samsong = factory.getBean("samsong", TV.class);
TV ig = factory.getBean("ig", TV.class);
// samsong.powerOn();
// samsong.volumeUp();
// samsong.volumeDown();
// samsong.powerOff();
ig.powerOn();
ig.volumeUp();
ig.volumeDown();
ig.powerOff();
}
}
applicationContext.xml 파일에서 bean 태그를 통해 SamsongTV 와 IgTV 객체를 생성했음에도 불구하고 lazy-init 이라는 속성때문에 호출측(main 메서드) 에서 해당 객체를 호출하지 않으면 객체 생성이 이루어지지 않는 것을 볼 수 있습니다.
applicationContext.xml 의 bean 태그에 lazy-init 속성을 지워보고 main메서드의 samsong 객체 호출 주석을 풀어보며 console 창에서 출력 내용을 비교해 보시면 lazy-init 속성의 역할을 더 확실히 눈으로 확인하실 수 있습니다.
'JAVA > Spring' 카테고리의 다른 글
Spring13 - 게시판 + filter + aop + login + interceptor + transaction (0) | 2020.03.26 |
---|---|
Spring 04 - Annotation (0) | 2020.03.18 |
Spring 03 - Spring Bean (Collection) (0) | 2020.03.18 |
Spring 01 - 기본개념 / 기본환경설정 (0) | 2020.03.18 |
- Total
- Today
- Yesterday
- 상속
- controller
- JdbcTemplate
- java
- 추상화
- Update
- Oracle
- 캡슐화
- 다형성
- OOP
- JDBC 프로그램 작성단계
- jdbc
- MVC
- select
- view
- ojdbc6.jar
- .
- Scott/Tiger
- model
- Delete
- 객체
- INSERT
- 객체지향
- java 환경설정
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |