Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[Spring] 20240105 - [프로그램 소스] 본문

[Spring]/Program source (Spring)

[Spring] 20240105 - [프로그램 소스]

Jelly-fish 2024. 1. 7. 15:25

SpringPrj01


`JavaResources > src > com.test.spr`

 

■■■ IoC/DI 관련 실습 01 ■■■

※ 스프링 프레임워크 없이 IoC/DI 개념 실습

○ 실습 성격 및 주요사항
   1. 콘솔 프로젝트
   2. 성적 처리
      국어, 영어, 수학 점수를 입력받아 총점, 평균을 출력하는 프로그램

○ 물리적 파일 구성
   1. Record.java                 → 인터페이스
   2. RecordView.java             → 인터페이스
   3. RecordImpl1.java            → Record 인터페이스를 구현하는 클래스
   4. RecordImpl2.java            → Record 인터페이스를 구현하는 클래스
   5. RecordViewImpl.java         → RecordView 인터페이스를 구현하는 클래스
   6. Main.java                   → 클래스, main() 메소드를 포함하는 테스트 클래스

 

 

Record.java

 

/*=====================
    Record.java
    - 인터페이스
=======================*/

package com.test.spr;

// ★ 인터페이스를 구성하는 메소드는 모두 선언만 있어야 한다.
// abstract 키워드를 붙이지 않아도, 추상 메소드 이다.
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 int getTotal();
	
	public double getAvg();
}

 


 

RecordImpl1.java

 

/*========================================
	RecordImpl1.java
	- 클래스
	- Record 인터페이스를 구현하는 클래스
=========================================*/

package com.test.spr;

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

	// [우클릭 → Source → Override/implements Method]
	
	// Record 메소드 모두 재정의
	@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 int getTotal()
	{
		int result = 0;
		
		result = this.getKor() + this.getEng() + this.getMat();
		
		return result;
	}

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

	
	
}

 

RecordImpl2.java

 

/*========================================================
	RecordImpl2.java
	- 클래스
	- Record 인터페이스를 구현하는 클래스
	- RecordImpl1 에 적용된 업무와 차별화된 업무 수행
==========================================================*/

package com.test.spr;

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

	// [우클릭 → Source → Override/implements Method]
	
	// Record 메소드 모두 재정의
	@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 int getTotal()
	{
		int result = 0;
		
		// 기본 점수(100점) 추가 
		result = 100 + this.getKor() + this.getEng() + this.getMat();
		
		return result;
	}

	@Override
	public double getAvg()
	{
		double result = 0;
		
		// 기본 점수(100점)가 포함된 상태에서의 평균 처리
		result = this.getTotal() / 4.0;
		
		return result;
	}

}

 


 

RecordView.java

 

/*=====================
   RecordView.java
   - 인터페이스
=======================*/

package com.test.spr;

public interface RecordView
{
	// setter 메소드 선언
	public void setRecord(Record record);
	
	
	// 입력 액션 전용 메소드 선언
	public void input();
	
	// 출력 액션 전용 메소드 선언
	public void output();

}

 

RecordViewImpl;java

 

/*================================================
	RecordViewImpl.java
	- 클래스
	- RecordView 인터페이스를 구현하는 클래스
=================================================*/

package com.test.spr;

import java.util.Scanner;

public class RecordViewImpl implements RecordView
{
	// 주요 속성 구성 → 특정 클래스 타입이 아닌... 인터페이스 타입
	private Record record;
	
	//****************************************************************************
	// ( * RecordImpl1, RecordImpl2 모두 Record 를 구현하므로 → 서비스 추상화 )
	//****************************************************************************
	// [서비스 추상화] : 구체적인 기술과 환경에 종속되지 않도록
    //                   유연한 추상 계층(Interface)을 두는 방법
	//****************************************************************************

	
	// RecordView 인터페이스 메소드 재정의
	@Override
	public void setRecord(Record record)
	{
		this.record = record;
	}

	@Override
	public void input()
	{
		Scanner sc = new Scanner(System.in);
		System.out.print("국어 영어 수학 점수입력(공백 구분) : ");
		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  %5d  %5d  %6d  %6.1f%n"
						   	, record.getKor(), record.getEng(), record.getMat()
						   	, record.getTotal(), record.getAvg());
		
	}
	
	
	
	
}

 


 

 

■■■ IoC/DI 관련 실습 02 ■■■

※ 스프링 프레임워크 적용 IoC/DI 개념 실습

○ 실습 환경 구성
   → 스프링 자원을 활용할 수 있는 환경 구성

    1. 프로젝트명 마우스 우클릭
    2. Build Path > Configure Build Path... 메뉴 선택
    3. Libraries 탭 선택 > Add External JARs... 버튼 클릭
    4. 필요한 jar 파일을 해당 프로젝트에 외부 라이브러리로 등록
       - 경로1 → C:\s-f-3.0.2-with-docs\dist      
        ·파일1 → org.springframework.asm-3.0.2.RELEASE.jar
        ·파일2 → org.springframework.beans-3.0.2.RELEASE.jar
        ·파일3 → org.springframework.context-3.0.2.RELEASE.jar
        ·파일4 → org.springframework.core-3.0.2.RELEASE.jar
        ·파일5 → org.springframework.expression-3.0.2.RELEASE.jar

       - 경로2 → C:\s-f-3.0.2-dependencies\org.apache.commons
                  \cohttp://m.springsource.org.apache.commons.logging\1.1.1
        ·파일6 → cohttp://m.springsource.org.apache.commons.logging-1.1.1.jar

    5. 스프링 프레임워크의 환경 설정 파일을 XML 형식으로 생성
       생성 위치는 프로젝트 하위의 src 디렉터리(현재 실습 환경은 콘솔이므로...)
       현재 실습 환경에서의 파일 이름은 사용자가 임의로 부여해서 생성하는 것이 가능
       → 『applicationContext.xml』
    6. 생성한 applicationContext.xml 파일에
       스프링이 참조하게 될 객체에 대한 정보와 DI 설정을 추가하게 되며
       이와 같은 문서의 구성을 위해 스프링에서 제공하는 문서 참조
       - 참조 경로   → C:\s-f-3.0.2-with-docs\docs\spring-framework-reference\htmlsingle
         ·참조 파일 → spring-framework-reference.html
         ·참조 위치 → III. Core Technologies
     3.2.1. Configuration metadata
           → 링크로 이동하면 xml 샘플 파일을 확인할 수 있으며,
              이 내용을 복사하여 applicationContext.xml 에 덮어쓰기(전체 선택 후 붙여넣기)
              

○ 실습 성격 및 주요사항
   1. 콘솔 프로젝트
   2. 성적 처리
      국어, 영어, 수학 점수를 입력받아 총점, 평균을 출력하는 프로그램

○ 물리적 파일 구성
   1. Record.java                 → 인터페이스
      → SpringPrj01 프로젝트의 기존 소스코드 활용
   2. RecordView.java             → 인터페이스
      → SpringPrj01 프로젝트의 기존 소스코드 활용
   3. RecordImpl1.java            → Record 인터페이스를 구현하는 클래스
      → SpringPrj01 프로젝트의 기존 소스코드 활용
   4. RecordImpl2.java            → Record 인터페이스를 구현하는 클래스
      → SpringPrj01 프로젝트의 기존 소스코드 활용
   5. RecordViewImpl.java         → RecordView 인터페이스를 구현하는 클래스
      → SpringPrj01 프로젝트의 기존 소스코드 활용

   6. Main.java                   → 클래스, main() 메소드를 포함하는 테스트 클래스
      → 수정(check~!!!)

   7. applicationContext.xml      
      →  프로젝트 > src 폴더 하위에 생성(현재 파일의 이름은 임의로 지정 가능)

 

 

SpringPrj02


 

`JavaResources > src > com.test.spr` - 스프링 컨테이너(IoC, applicationContext.xml) 이용

 


 

Main.java

 

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

package com.test.spr;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main
{
	public static void main(String[] args)
	{
		/*
		// [스프링이 처리하고 관리하게 될 영역]
		// → 즉, 스프링 컨테이너 안에서 벌어지게 될 상황
		//--------------------------------------------------------------------------------
		
		// ( * 부모를 상속한 자식을... 업캐스팅 하여 Record 로 생성. )
		// ① RecordImpl1(Record) 객체 생성 과정
		//RecordImpl1 rec1 = new RecordImpl1();
		Record rec1 = new RecordImpl1();				//-- dependency (의존 객체)
		
		// ① RecordImpl1(Record) 객체 생성 과정
		//RecordImpl1 rec1 = new RecordImpl1();
		Record rec2 = new RecordImpl2();				//-- dependency (의존 객체)
		
		
		// ( * Record 객체를 setter 매개변수로 받아야만, view를 통해 확인 가능하므로 의존 객체.)
		
		// RecordViewImpl 객체 생성 과정
		//-- Record(의존 객체) 객체 필요 → new RecordViewImpl();
		//RecordViewImpl view = new RecordViewImpl();
		RecordView view = new RecordViewImpl();
		
		
		// check~!!! 
		// 의존 객체 주입
		//-- 의존 객체 주입 방법을 사용하게 되면
		//   느슨한 결합을 구성할 수 있게 되고
		//   한 쪽의 변동 상황이 다른 쪽에 영향을 덜 줄 수 있게 된다.
		view.setRecord(rec2);								//-- setter injection
															//   (setter 를 통한 주입)
		
		// [의존 객체 주입] - 생성자 주입(Constructor Injection) 방식도 존재.
		
		// RecordView 의 매개변수로 무엇을 넣느냐에 따라
		// setRecord(rec1) || setRecord(rec2)
		// 업무 처리가 달라진다.
		
		*/
		//--------------------------------------------------------------------------------
		
		// ※ 스프링 프레임워크에서는
		//    객체 생성 과정 및 DI(의존객체 주입)에 대한 설정은
		//    스프링 환경 설정 파일로 대체된다. (→ applicationContext.xml)
		
		// 스프링 프레임워크에게...
		// 『applicationContext.xml』 파일을 읽어서
		// 객체 생성 및 관리할 객체에 대한 정보를 얻을 수 있도록 해야 한다.
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		// (* 필요에 따라서 생성, 관리해야 할 객체의 가이드라인을 적은 xml 파일을
		//   스프링 컨테이너(IoC)에게 전달. )
		
		// 빈의 정보를 받아올 때는 getBean
		// 『getBean()』 메소드를 이용하여 사용자가 원하는 객체를 얻어낸다.
		// 메소드의 인자값으로 식별자(id)를 통해 구분하여 지정하게 된다.
		
		// view 객체 생성
		//RecordView view = (RecordView)context.getBean("view");
		
		
		// 스프링 3.0 이후 버전부터 사용 가능한 코드
		RecordView view = context.getBean("view", RecordViewImpl.class);
		//=========================================================================
		// * 가져 올 때부터 타입을 바꿔준다. (두 번째 매개변수에 변경할 타입 작성)
		//=========================================================================
		
		
		view.input();
		view.output();
		
		
		//****************************************************************************************
		// 이 파일은 현재 자바 파일이므로... 배포되고 나면 .class 형태가 된다.
		// 따라서, 메인을 다루는 클래스 소스를 수정해야 하는 것이다.
		// 이를 해결하기 위해서는 XML을 이용해서 객체를 밖에서 생성하여 넣어주도록 처리해야 한다.
		//****************************************************************************************
		
		
	}
}

 

applicatonContext.java

 

<?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 파일 샘플 -->
	<!--    → 스프링이 생성하고 관리해야 할 객체들에 대한 정보 전달 -->

	<!-- RecordImpl1 (Record) 클래스에 대한 객체 정보 전달 -->
	<bean id="record1" class="com.test.spr.RecordImpl1"></bean>
	
	<!-- RecordImpl2 (Record) 클래스에 대한 객체 정보 전달 -->
	<bean id="record2" class="com.test.spr.RecordImpl2"></bean>
	
	<!-- id: 변수명, class: 경로 -->
	<!-- RecordViewImpl (RecordView) 클래스에 대한 객체 정보 전달 -->
	<bean id="view" class="com.test.spr.RecordViewImpl">
	
		<!-- ( * RecordViewImpl 내부의 속성변수명과 name을 동일하게 구성 )-->
		<!-- RecordImpl1 또는 RecordImpl2 객체 에 대한 DI 설정 정보 전달 -->
		
		<!-- 『property』 엘리먼트는 setter 메소드에 대한 정의 -->
		<!-- 즉, 『setXxx()』 메소드인 경우 『property name="xxx"』 -->
		<!-- 와 같은 형식으로 기술하여 설정하게 된다. -->
		<property name="record">
		
		<!-- 인터페이스 Record 클래스에 대한 set을 진행한다. 
		→ ref bean="record1" Record1 객체 참조.  -->
			
			<!-- 『ref』 엘리먼트에 의해 DI 객체에 대한 참조 지정 -->
			<ref bean="record1"/>
			<!-- record1이 필요하므로, 위에서 객체를 생성해 준 것. <bean id="record1"> -->
			
		</property>
		
		<!-- ※ 위 구문은(line 26 ~ 31) -->
		<!--    『<property name="record" ref="record1"></property>』 -->
		<!--     와 같은 형태로 작성해도 된다. -->
	
	</bean>
	
	

	<!-- more bean definitions go here -->

</beans>