Bean을 .xml 통해 만들어 보기

바꿔 볼 Java code 

 

  • .xml 은 하나의 IoC 컨테이너로 bean들을 해당 파일 안에 선언해두면 우리가 원하는 대로 선택해서 사용 할 수 있게된다. 
  • 그렇다면 이러한 bean은 어떻게 만들어지는지 확인해보자. 
  • 먼저 바꿔볼 자바 코드는 아래와 같다. 
Exam exam = new NewlecExam();
ExamConsole console = new GridExamConsole();

console.setExam(exam);

console.print();

 

  • 우리가 필요한 기능 들은  NewlecExam클래스에 있고 그것을 인터페이스인 exam 타입으로 객체를 만들어 두었다.
  • 그리고 원하는 모양의 콘솔을 console로 선언 해두었고, 원하는 값을 받아서 출력하는 코드가 바로 위의 코드이다. 

.xml 로 객체 만들기

 

  • 위의 코드를 한줄 씩 xml에 빈으로 등록 해보자.
  • id 는 참조변수로 호출 되는 객체가 만들어져 사용될 때, 쓰여질 이름이다.
  • class는 빈으로 만들어져야 하는 클래스의 주소를 넣은 것이다. 
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam " class="spring.di.entity.NewlecExam"/>

 

  • console은 위와 같은 내용으로 만들어 졌다. 
  • property에 적혀지는 내용은 일종의 규칙이 정해져 있다. 
  • name에 적혀진 exam은 아래의 규칙을 다른다.  
    • set은 생략이 가능함 : 기존에 setExam으로 사용되었던 메소드 명에서 set을 뺀 것이다. 
    • 소문자를 사용 : set이 없어지고 남은 Exam에서 대문자를 소문자를 바꿔서 exam이 되었다. 
  • ref 는 참조하는 객체의 이름을 호출하는 것으로 이미 만들어 놓은 exam을 호출하였음. 
<!-- 	ExamConsole console = new GridExamConsole() -->	
<bean id="console" class="spring.di.ui.GridExamConsole">

    <!-- console.setExam(exam); -->
    <property name="exam" ref="exam"></property>
    
</bean>

Bean에 setter를 이용하여 값(Value) 넣기

 

  • NewlecExam 클래스 내부에는 아래와 같이 멤버변수가 선언 되어져 있다.
public class NewlecExam implements Exam {
	
	private int kor;
	private int eng;
	private int math;
	private int com;
    
}

 

  • 그렇다면 해당 값을 지정하려면 setter를 통해 값을 지정해주어야 하는데 그러한 작업을 .xml에서도 이용가능하다. 
  • 시작하기전 클래스 내부에 setter가 있어야 한다는 것을 알아야 한다. 
  • Bean에서 이름과 값을 지정하면 들어가고 정의된 객체를 쓰기만 하면된다.  
<bean id="exam" class="spring.di.entity.NewlecExam">
    <property name="kor" value="10"></property>
    <property name="eng" value="10"></property>
    <property name="math" value="10"></property>
    <property name="com" value="10"></property>
</bean>

Bean에서 생성자를 이용하여 값을 설정

 

  • 매개변수가 있는 생성자를 이용하여 바로 객체를 생성하듯이 Bean에서도 값을 생성자에 지정하여 객체를 만들 수 있다. 
  • 시작하기전 클래스 내부에 매개변수가 필요한 생성자 메소드가 있어야 한다는 것을 알아야 한다.
public NewlecExam(int kor, int eng, int math, int com) {
    super();
    this.kor = kor;
    this.eng = eng;
    this.math = math;
    this.com = com;

 

  • 아래와 같이 construnctor-arg 태그를 이용하여 값을 만들면 된다.
<bean id="exam" class="spring.di.entity.NewlecExam">
    <constructor-arg value="10"></constructor-arg>
    <constructor-arg value="10"></constructor-arg>
    <constructor-arg value="10"></constructor-arg>
    <constructor-arg value="10"></constructor-arg>
</bean>

 

  • 하지만 위의 방법으로는 매개변수가 많아지면 어디에 무슨 값을 넣고 있는지 헷갈릴 수 있다.
  • 그렇기 때문에 name를 사용하여 위치를 지정할 수 있다.
<bean id="exam" class="spring.di.entity.NewlecExam">
    <constructor-arg name="kor" value="10"></constructor-arg>
    <constructor-arg name="eng" value="10"></constructor-arg>
    <constructor-arg name="com" value="10"></constructor-arg>
    <constructor-arg name="math" value="10"></constructor-arg>
</bean>

 

 

  • 다른 방법으로는 index로 지정하여 입력이 가능하다.
<bean id="exam" class="spring.di.entity.NewlecExam">
    <constructor-arg index="0" value="10"></constructor-arg>
    <constructor-arg index="1" value="10"></constructor-arg>
    <constructor-arg index="2" value="10"></constructor-arg>
    <constructor-arg index="3" value="10"></constructor-arg>
</bean>

 

  • 다른 쉬운 방법으로 p 라는 속성값을 이용하는 것이다. 
  • 해당 기능을 사용하려면 bean 클래스에서 Namespaces - p를 선택하여야 한다.

 

  • 그 다음 위의 내용을 아래와 같이 변경하면 된다.
<bean id="exam" class="spring.di.entity.NewlecExam" 
p:kor="10" p:eng="10" p:math="10" p:com="10"/>

 


Application

 

  • ApplicationContext 인터페이스는 이미 설정이된 Bean을 사용하기 위한 인터페이스이다.
  • ApplicationContext 를 구현한 객체들은 아래와 같다.

 

  • 위에 구현된 Bean을 사용하기 위해 여기서는 ClassPathXmlApplicationContext 를 사용하겠음.
  • 먼저 만들어 놓은 Bean을 사용하기 위해서는 현재 Bean을 configure 한 파일의 위치를 알려주어야 한다.
  • AppicationContext 타입으로  ClassPathXmlApplicationContext 의 객체를 생성해줄 때 매개변수 값으로 현재 configure된 주소의 위치를 넣어주면 된다.
  • 이후 .getBean메소드를 통해 이미 정해진 id를 입력하게 됨으로서 사용이 가능함
    • (ExamConsole) context.getBean("console"); - 직접 id값을 입력해주어 가져오는 방식으로 마지막에 캐스팅작업을 수행해야함. 
    • ExamConsole console = context.getBean(ExamConsole.class); : ExamConsole 인터페이스를 구현한 객체를 알아서 가져오는 방식으로 마지막에 캐스팅 작업이 필요없음. 
    ApplicationContext context = 
            new ClassPathXmlApplicationContext("spring/di/setting.xml");

    ExamConsole console = (ExamConsole) context.getBean("console");
//		ExamConsole console = context.getBean(ExamConsole.class);
    console.print();

 

  • 위에서 사용된 참조변수를 이용하였을 때 불러오는 방식은 아래의 bean의 id 값을 가지고 지정한 것이다.
<!-- ExamConsole console = new GridExamConsole() -->
<bean id="console" class="spring.di.ui.InlineExamConsole">
	<!-- console.setExam(exam); -->
    <property name="exam" ref="exam" />

</bean>

 


Bean에서 List를 만들어서 출력

 

  • 먼저 해볼 것은 bean 안에서 ArrayList를 만들어서 값들을 넣어보는 작업을 해볼 것이다.
  • 이름은 exams인 List가 생성 되었고 안에는 NewlecExam 객체에 값을 지정하는 방식과 만들어진 값을 참조하는 방식을 사용하여 추가하였다.
<bean id="exams" class="java.util.ArrayList">
    <constructor-arg>
        <list>
            <bean class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"
                p:math="10" p:com="10" />
            <ref bean="exam" />
        </list>
    </constructor-arg>
</bean>

 

  • 또 다른 방식으로는 util이라는 속성을 추가하여 util 태그를 사용하는 것이다. 

<util:list id="exams" list-class="java.util.ArrayList">
    <bean class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"
        p:math="10" p:com="10" />
    <ref bean="exam" />
</util:list>

 

'Backend > Spring' 카테고리의 다른 글

MVC 모델과 DispatcherServlet  (0) 2023.01.25
@Autowired @Quelifier @Component @Value  (0) 2023.01.07
Spring이란? (DI 와 IOC)  (0) 2023.01.04
모델(Model)  (0) 2022.11.29
HttpServlet  (0) 2022.11.29