스프링 | DI / IoC

2023. 2. 7. 14:35·Spring

java의 class 상속 / Interface 를 이용한 추상화를 기반으로 하는 개발 방법

Spring은 아래 DI/IoC를 강력하게 지원하는 프레임워크

 

IoC : Inversion of Control

프로그램을 제어하는 패턴 중 하나.
DI
는 IoC패턴의 구현방법 중 하나.
DI
에 따라 프로그램의 흐름이 완전히 변경됨.

- 스프링 프레임워크가 동작할 때 프로그램이 필요로 하는 객체들을 전부 생성한 뒤 관리하는 곳이다.

- 자바에서는 new키워드를 사용해서 직접 만들어 사용했지만, 스프링에서는 필요한 객체를 미리 만들어 놓는다.

- 그 다음 자바 코드에서 미리 생성된 객체를 꺼내어 쓰는 형태다.

- 대표적인 클래스는 application-context 이다. 

- bean은 xml파일에 만든다.

 


DI : Dependency Injection (의존성 주입)

스프링 Container 에 만들어둔 각종 클래스(bean)들은 서로 의존적이다

(A객체가 B객체 없이 동작이 불가능한 상황 / 즉 객체 안에 객체가 저장되는 형태)

스프링은 DI를 기준으로 많은 프레임워크모듈 들이 만들어짐.

Spring 은 DI Framework 혹은 IoC Framework 라고 부름.

 

DI (의존성 주입) 설정 방법 2가지

( 1 ) 생성자를 통한 의존성 주입

객체를 집어넣어줄 때 사용하는 속성 ref

<constructor-arg ref="빈id"></constructor-arg>

( 2 ) setter를 통한 의존성 주입

<property name = "변수명" value="값"/>
<property name = "변수명" ref="객체"/>

 

예제 1번.

 

더보기

Chef

package ex02;

public class Chef {
	public void cooking() {
		System.out.println("요리");
	}
}

Hotel

package ex02;

public class Hotel {
	
	//생성자
	private Chef chef;
	
	public Hotel(Chef chef) {
		this.chef = chef;
	}
	
	public Chef getChef() {
		return chef;
	}
	
}

DatabaseDev

package ex02;

public class DatabaseDev {
	
	private String url;
	private String uid;
	private String upw;
	
	
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getUpw() {
		return upw;
	}
	public void setUpw(String upw) {
		this.upw = upw;
	}
	
	
	
	
}

MemberDAO

package ex02;

public class MemberDAO {
	
	private DatabaseDev databaseDev;

	public DatabaseDev getDatabaseDev() {
		return databaseDev;
	}

	public void setDatabaseDev(DatabaseDev databaseDev) {
		this.databaseDev = databaseDev;
	}
	
}

MainClass

package ex02;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	
	public static void main(String[] args) {
		
		GenericXmlApplicationContext ctx =
				new GenericXmlApplicationContext("application-context.xml");
		
		//생성자를 통한 주입 확인
		Hotel hotel = ctx.getBean(Hotel.class);
		hotel.getChef().cooking();
		
		//세터를 통한 주입 확인
		MemberDAO dao = (MemberDAO)ctx.getBean("dao");
		System.out.println(dao.getDatabaseDev().getUid());
		
	}
	
}

예제 2번.

더보기

Customer

package ex03;

import java.util.List;
import java.util.Map;

public class Customer {
	
	//List or Map의 의존성 주입
	private List<String> list;
	private List<Person> person;
	private Map<String, Object> map;
	
	public List<String> getList() {
		return list;
	}
	public void setList(List<String> list) {
		this.list = list;
	}
	public List<Person> getPerson() {
		return person;
	}
	public void setPerson(List<Person> person) {
		this.person = person;
	}
	public Map<String, Object> getMap() {
		return map;
	}
	public void setMap(Map<String, Object> map) {
		this.map = map;
	}

}

Person

package ex03;

public class Person {
	
	
	private String name;
	private String id;
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	
	
}

Main

package ex03;

import java.util.Map;

import org.springframework.context.support.GenericXmlApplicationContext;

public class Main {
	
	public static void main(String[] args) {
		
		GenericXmlApplicationContext ctx = 
				new GenericXmlApplicationContext("Collection-context.xml");
		Customer customer = ctx.getBean("customer", Customer.class);
		Map<String, Object> map = customer.getMap();
		System.out.println(map.get("name"));
		System.out.println(map.get("id"));
	}
	
}

예제 3번.

더보기

Car

package ex04;

public class Car {
		
	private IBattery battery;
	
	//생성자 주입
	public Car(IBattery battery) {
		this.battery = battery;
	}
	
	//getter
	public IBattery getBattery() {
		return battery;
	}
	
}

Airplane

package ex04;

public class Airplane {
	
	private IBattery battery;
	
	//getter
	public IBattery getBattery() {
		return battery; 
	}
	
	//setter
	public void setBattery(IBattery battery) {
		this.battery = battery;
	}
	
}

IBattery (인터페이스)

package ex04;

public interface IBattery {
	
	public void energy();
	
}

Battery1 

package ex04;

public class Battery1 implements IBattery {

	@Override
	public void energy() {
		System.out.println("자동차 배터리");
		
	}

}

Battery2

package ex04;

public class Battery2 implements IBattery{

	@Override
	public void energy() {
		System.out.println("비행기 배터리");
	}

}

MainClass

package ex04;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	
	public static void main(String[] args) {
		
		//Car, Airplane 빈을 생성하고, 의존성 주입
		//각 객체 안에 있는 배터리를 자바클래스에서 출력.
		
		GenericXmlApplicationContext ctx
		 = new GenericXmlApplicationContext("Battery-context.xml");
		
		Airplane airplane = ctx.getBean("airplane", Airplane.class);
		Car car = ctx.getBean("car", Car.class);
		airplane.getBattery().energy();
		car.getBattery().energy();
		
	}
	
}

 

빈의 범위

'Spring' 카테고리의 다른 글

스프링 MVC Controller객체 구현  (0) 2023.02.23
스프링 부트 | 개발환경 구축  (0) 2023.02.10
스프링 | 의존객체 자동주입 태그  (0) 2023.02.07
스프링 | 스프링 개발 환경 세팅  (0) 2023.01.30
'Spring' 카테고리의 다른 글
  • 스프링 MVC Controller객체 구현
  • 스프링 부트 | 개발환경 구축
  • 스프링 | 의존객체 자동주입 태그
  • 스프링 | 스프링 개발 환경 세팅
개발 공부
개발 공부
  • 개발 공부
    개발 공부
    개발 공부
  • 전체
    오늘
    어제
    • 전체보기 (163)
      • 프로젝트 (1)
      • JavaScript (46)
      • Node.js (3)
      • Next.js (5)
      • React (17)
      • NoSQL (0)
      • HTML,CSS (3)
      • CS (6)
      • Java (35)
      • Spring (6)
        • Spring의 정석 (1)
      • Spring boot (1)
      • MySQL (1)
      • 리눅스 (16)
      • JSP (9)
      • AWS (0)
      • git (2)
      • 알고리즘 (1)
      • ect (7)
      • Project (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    Java의 정석
    자바의 정석
    티스토리챌린지
    Java
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발 공부
스프링 | DI / IoC
상단으로

티스토리툴바