스프링 프레임워크 실습(XML)

유동현·2022년 11월 10일
0
post-thumbnail

package com.test.spr;

public interface Record
{
	public void setKor(int kor);
	public int getKor();
	
	public void setEng(int eng);
	public int getEng();
	
	public void setMat(int mat);
	public int getMat();

	public double getAvg();
	public int getTot();

}

위와 같이 정의되어 있지 않은 interface 선언 이후 이를 implement 하는 클래스들은 모두 의존객체로써 작동할 수 있다. 또한 객체를 사용해야하는 위치에 의존관계를 만들 수 있다.

package com.test.spr;

public class RecordImpl1 implements Record
{
	
	//주요속성 구성
	private int kor, eng, mat;

	@Override
	public void setKor(int kor)
	{
		this.kor = kor;
		
	}

	@Override
	public int getKor()
	{
		return kor;
	}

	@Override
	public void setEng(int eng)
	{
		this.eng = eng;
	}

	@Override
	public int getEng()
	{
		return eng;
	}

	@Override
	public void setMat(int mat)
	{
		this.mat = mat;
	}

	@Override
	public int getMat()
	{
		return mat;
	}

	@Override
	public double getAvg()
	{
		double result = 0;
		result = this.getTot()/3.0;
		return result;
	}

	@Override
	public int getTot()
	{
		int result = 0;
		result = this.getKor() + this.getEng() + this.getMat();
		return result;
	}
	

1번에서 만든 interface를 implement하는 클래스를 생성하고 Override한다.
이 과정은 이후 Record로 업캐스팅 될수있게 만들고 업캐스팅 될 수 있다는것은
의존객체로 작동할수 있다는것

package com.test.spr;

public interface RecordView
{
	
	//setter 메소드 선언 -> Record 인터페이스 타입의 객체를 넘겨받을 수 있도록 처리
	public void setRecord(Record record);
	public void input();
	public void output();

}

의존관계: RecordView형 객체가 Record형 객체에 의존하게된다.
즉, Ioc가 성립되고 DI를 진행한것

/*=========================================
 RecordViewImp1.java
 -클래스
 -RecordView 인터페이스를 구현하는 클래스로 설계
  
 ====================================*/

package com.test.spr;

import java.util.Scanner;

public class RecordViewImpl1 implements RecordView
{
	//속성 구성 -> 인터페이스 형태의 자료형 구성
	private Record record;

	@Override
	public void setRecord(Record record)
	{
		// TODO Auto-generated method stub
		this.record = record;
	}

	@Override
	public void input()
	{
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		System.out.println("국어 영어 수학 점수 입력(공백 구분) : ");
		String kor = sc.next();
		String eng = sc.next();
		String mat = sc.next();
		
		record.setKor(Integer.parseInt(kor));
		record.setEng(Integer.parseInt(eng));
		record.setMat(Integer.parseInt(mat));
		
		sc.close();
		
		
	}

	@Override
	public void output()
	{
		System.out.println("국어 영어 수학 총점 평균");
		System.out.printf("%6d %4d %4d %6d %5.1f"
				           , record.getKor(), record.getEng(), record.getMat()
				           , record.getTot(), record.getAvg());
	}

	
	
	
}
  • 생성자를 통해 record형으로 업캐스팅된 recodeImpl 객체를 받아올것이고
    input(), output()메소드의 활용을 위해선 의존객체인 recodeImpl이 필요하다.
    RecordImpl클래스가 RecordViewImpl클래스의 의존객체인것

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


   <!-- ※ 스프링이 제공하는 환경 설정 XML 파일 샘플 -->
   <!--    → 스프링이 생성하고 관리해야 할 객체들에 대한 정보 전달 -->
   <!-- 
      내가 여기에 스프링 컨테이너가 운용하는데 필요할 목록 적어둘게
      너가 운용해야 할, 운용하는 과정에서 필요한 설명서 
      내가 여기에 다 기술해둘테니까 너가 필요하다고 판단하면 그거 쓰면 돼
    -->

   <!-- 
      우리 xml에 다 bean 으로 등록해놨다.
      springContainer 안에서는 bean Container 가 돌아간다.
      bean 공장이 생겨서 bean을 생성해낸다.
      enterprise 기반으로 생성한거라, 단일 bean에 집중해서 돌아가는게 아니라
      여러 bean들을 찍어내고, 관리하는 게 비일비재하게 일어나기 때문에
      bean 생성하는 factory들(→ bean factory)이 있는 
      공단(→ applicationContext) 자체가 돌아가게 된다.
      'bean 식별해줬으면 좋겠어'하고 id 설정해서 라벨링을 다 한 것이다.
    -->  
      
    <!-- id는 이름 뭐라고 부를지 정해서 쓰고, 클래스는 우리가 만든거 쓰면 된다. -->
    <!-- 
       필요하면 너가 알아서 인스턴스 생성해
       그리고 너가 필요한만큼 쓰고, 너가 알아서 소멸시키면 돼
       얼마만큼 살려둘지 라이프사이클 관리도 너가 해
    -->
    <!-- RecordImpl1 (Record) 클래스에 대한 객체 정보 전달 과정 -->
    <bean id="record1" class="com.test.spr.RecordImpl1"></bean>
    <!-- 『com.test.spr.RecordImpl1 record1 = new com.test.spr.RecordImpl1();』 -->
   <!-- 구문을 수행할 수 있도록 관련 정보를 스프링 컨테이너에 전달 -->
   
   
    <!-- RecordImpl2 (Record) 클래스에 대한 객체 정보 전달 과정 -->
    <bean id="record2" class="com.test.spr.RecordImpl2"></bean>
    
    
      <!-- RecordViewImpl (RecordView) 클래스에 대한 객체 정보 전달 과정 -->
    <!-- 
       그런데, RecordViewImpl 은 Record 인터페이스 타입의 객체를 필요로 한다.
       RecordViewImpl 의 의존객체는 Record 이다.
       여기서 DI 설정도 해주게 된다고 했으므로, 의존객체에 대한 정보 전달
       property 태그 사용해서
    -->
    <bean id="view" class="com.test.spr.RecordViewImpl">
       <!-- RecordImpl1 또는 RecordImpl2 객체 (→ 의존 객체)에 대한 DI 설정 정보 전달 과정 -->
       <!-- 『property』 엘리먼트는 setter 메소드에 대한 구성 -->
       <!-- 즉, 『setXxx()』 메소드인 경우 
            『<property name="xxx"></property>』 -->
       <property name="record">
       <!-- RecordViewImpl의 setter 메소드에 Record record 라고 매개변수 받으니 --> 
       <!-- 그 이름 property name에 넣어준거!! -->
       
          <!-- 『ref』 엘리먼트는 DI 객체에 대한 참조 지정 -->
          <!-- <ref bean="record1"/> -->
          <ref bean="record2"/>
       </property>
       
       <!-- ※ 위 구문은 (Line 44~50) -->
       <!-- 『<property name="record" ref="record1"></property>』 -->
       <!-- 형태로 작성해도 된다. -->
       <!-- → 참조는 별도로 등록안하고, 속성값으로 넘겨줘도 상관없다는 얘기이다. -->    
    </bean>
    
</beans>

위와 같이 XML을 통해 생성해야할 객체와 객체에서 사용해야할 객체에 대한 정보를 지정해줄 수 있다.

Main

/*=====================================
 Main.java
 -클래스
 -main() 메소드가 포함된 테스트 클래스
======================================= */

package com.test.spr;

public class Main
{
	public static void main(String[] args)
	{
		
		//※ 스프링 프레임워크에서는
		// 객체 생성 과정 및 DI(의존 객체 주입)에 대한 설정은
		// 스프링 환경 설정 파일로 대체된다.
		
		//스프링 프레임워크에서 『applicationContext.xml』 파일을 읽어서
		// 생성 및 관리할 객체에 대한 정보를 얻어낼 수 있도록 처리해 주는 과정이 필요하다.
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		//context로 부터 『getBean()』메소드를 이요하여
		//사용자가 원하는 객체를 얻어와서 사용할 수 있다.
		// 이 과정에서 메소드 인자값으로는 id속성을 지정하면 된다.
		
		//RecordView view = (RecordViewImpl1)context.getBean("view");
		
		RecordView view = context.getBean("view", RecordViewImpl1.class);
		//위 둘은 같은 구문이다.
		//단 55번 line은 스프링 3.0이후 버전부터
		// 아래 코드 형식으로 사용하는 것이 가능.
		
		view.input();
		view.output();
		
		
		
	}

}

XML에서 설정해놓은 생성규칙에 따라 객체가 생성되고 이를 사용할 수 있게된다.

0개의 댓글