Everything has an expiration date
[Spring] 20240105 - [프로그램 소스] 본문
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>
'[Spring] > Program source (Spring)' 카테고리의 다른 글
[SpringMVC] 20240110 [프로그램 소스] (2) | 2024.01.10 |
---|---|
[Spring] 20240109 [프로그램 소스] (1) | 2024.01.09 |
[Spring] 20240108 [프로그램 소스] (1) | 2024.01.08 |