spring은 xml을 통해 bean을 형성해주는데,
main함수가 들어있는 java 파일에서는 xml에서 생성한 bean에서 id 값을 통해 데이터를 받아와 출력을 진행한다.
class는 bean에 넣을 값을 받아 올 위치를 말한다.
예를 들어,
<bean id="messageBean" class="practice3.MessageBeanEn" scope=""/>
(Application.xml)
라는 xml 코드가 작성되었고,
ApplicationContext context = new ClassPathXmlApplicationContext("Application.xml");
MessageBean messageBean = (MessageBean)context.getBean("messageBean");
messageBean.sayHello("Spring");
System.out.println("-----------------");
MessageBean messageBean2 = (MessageBean)context.getBean("messageBean");
messageBean2.sayHello("Spring");
System.out.println("-----------------");
MessageBean messageBean3 = (MessageBean)context.getBean("messageBean");
messageBean3.sayHello("Spring");
System.out.println("-----------------");
(main.java)
main 자바 파일에서 해당 코드를 작성하였다면, ClassPathXmlApp("application.xml")의 인스턴스는 "messageBean" 이라는 id값을 통해 data를 받아오고 있는 것이다.
여기서 "messageBean"은 위에서 xml설정된 파일의 Id값이다.
아직 DTO에 데이터 입력값이 없기 때문에 예제에서 실제로 Bean이 생성되었고 데이터가 실제로 저장되었음을 보여줄 내용이 없다. 하지만 아래 sungjuk project에서는 확인이 가능하다.
** 중요한 것
기본적으로 spring xml에서 bean을 생성하였을 시, 디폴트로 객체 한개 당 한개의 bean을 생성하는 Singleton 개념을 갖는다. 이 싱글톤을 해제하고 싶으면 아래와 같이 scope에 "prototype" 값을 넣어주면 된다.
<bean id="messageBean" class="practice3.MessageBeanEn" scope="prototype"/>
아래 코드는, 생성자를 통해 직접 DTO에 값을 넣어주는 xml 코드이다.
<bean id="sungJukDTO" class="practice5.SungJukDTO">
<property name="name" value="홍길동"/>
<property name="math" value="95"/>
<property name="kor" value="97"/>
<property name="eng" value="100"/>
<property name="tot" value="292"/>
<property name="avg" value="97"/>
</bean>
<bean id="sungJukImpl" class="practice5.SungJukImpl">
<constructor-arg ref="sungJukDTO"></constructor-arg>
</bean>
(1) sungJukDTO 라는 ID값을 갖는 bean에 property name 별 각각의 value를 넣어주었다.
(2) sungJukImpl 라는 ID값을 갖는 bean에는 생성자를 통하여 (1)번의 value를 넣어주었다.
이렇게 되면,
다음 코드의 DTO 초기값은 (1) 이 된다.
--> xml 사용하지 않았다면 아래 코드에 직접 변수 초기값을 설정하였을 것이다.
그 초기값을 xml로 지정해준 후, modify method를 이용하여 DTO에 들어갈 각 value를 수정해주는 것이다.
public class SungJukImpl implements SungJuk{
private SungJukDTO sungJukDTO;
public SungJukImpl(SungJukDTO sungJukDTO) {
this.sungJukDTO = sungJukDTO;
}
@Override
public void calcTot() {
sungJukDTO.setTot(sungJukDTO.getKor() + sungJukDTO.getMath() + sungJukDTO.getEng());
}
@Override
public void calcAvg() {
sungJukDTO.setAvg(sungJukDTO.getTot()/0.3);
}
@Override
public void modify() {
Scanner scn = new Scanner(System.in);
System.out.println("이름을 입력하세요: ");
sungJukDTO.setName(scn.next());
System.out.println("국어 점수를 입력하세요: ");
sungJukDTO.setKor(scn.nextInt());
System.out.println("영어 점수를 입력하세요: ");
sungJukDTO.setEng(scn.nextInt());
System.out.println("수학 점수를 입력하세요: ");
sungJukDTO.setMath(scn.nextInt());
}
@Override
public void display() {
System.out.println("이름\t국어\t영어\t수학\t총점\t평균");
System.out.println(sungJukDTO);
}
}