프로그래밍 공부/Spring

[JAVA] Dependency를 직접 Injection 하기

valid_ming 2021. 4. 28. 12:42

 

뉴렉처 강사님의 동영상 강의를 작성한 글입니다.

 

Spring을 사용하지 않고 Dependency를 직접 Injection 해보는 실습

 

코드 구조

Program.java

package spring.di;

import spring.di.entity.Exam;
import spring.di.entity.NewlecExam;
import spring.di.ui.ExamConsole;
import spring.di.ui.GridExamConsole;
import spring.di.ui.InlineExamConsole;

public class Program {

	public static void main(String[] args) {
		
		Exam exam = new NewlecExam();
		ExamConsole console = new InlineExamConsole(exam); // DI
		//ExamConsole console = new GridExamConsole(exam);
		console.print();
		
	}

}

 

Exam.java

package spring.di.entity;

public interface Exam {
	int total();
	float avg();
}

 

NewlecExam.java

package spring.di.entity;

public class NewlecExam implements Exam {

	private int kor;
	private int eng;
	private int math;
	private int com;
	
	@Override
	public int total() {
		// TODO Auto-generated method stub
		return kor+eng+math+com;
	}

	@Override
	public float avg() {
		// TODO Auto-generated method stub
		return total()/4.0f;
	}
}

 

ExamConsole.java

package spring.di.ui;

public interface ExamConsole {
	void print();
}

 

GridExamConsole.java

package spring.di.ui;

import spring.di.entity.Exam;

public class GridExamConsole implements ExamConsole {

	private Exam exam;
	
	public GridExamConsole(Exam exam) {
		this.exam = exam;
	}

	@Override
	public void print() {
		System.out.println("[[Grid Print]]");
		System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());
	}

}

 

InlineExamConsole.java

package spring.di.ui;

import spring.di.entity.Exam;

public class InlineExamConsole implements ExamConsole {

	private Exam exam;
	
	public InlineExamConsole(Exam exam) {
		this.exam = exam;
	}

	@Override
	public void print() {
		System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());
	}

}

 

 

출력방식을 Grid에서 Inline으로 변경하기 위해 Program.java의 소스코드를 수정해야 했다.

외부 파일을 통해 소스코드 수정 없이 DI를 변경할 수 있고

spring은 이 과정을 XML, Annotaiton을 이용하여 더욱 편리하게 지원해준다.