The Debugging Chronicles : "코드의 미학"

[Spring] 의존성(Dependency) - Setter 주입 본문

Spring

[Spring] 의존성(Dependency) - Setter 주입

sweetseonah1004 2024. 10. 2. 11:22

의존성 주입하는데는 두가지 방법이 있다.

 

1. 생성자 주입 

- handler mapper

2. Setter 주입

- DTO


2. setter 주입

 

멤버 변수 두개를 가지고 

getter setter는 맨 마지막에 두는 것이 보편적이다.

 

applicationContext.xml로 넘어가서

생성자 주입은 무엇을 넣겠다면 설정하면 되지만

Setter 주입은 이름까지 넣어 주어야 한다.

로그를 보면

아이폰 객체 생성 01이 먼저 나온다.

이 이야기는 기본 생성자를 호출했다는 뜻이다.

 

setter 호출은

기본 생성자 먼저 호출하고

의존 주입 대상 setter 호출한다.

생성자 주입은 

의존 주입 대상 생성자 먼저 호출되고 생성자가 호출된다.

 

그럼 이 둘의 차이는 뭘까?

 

생성자 주입은

의존 주입을 해야하는 것이 하나라도 없으면 만들어 지지 않는다.

예를 들어 생체 데이터 분석을 하는 프로젝트를 참여 했는데 라이센스 등을 보여주고 싶지 않은 제한적인 상황일때 사용한다.

 

반면 setter 주입은

애플 워치가 문제가 생겼어도 아이폰이 나온다.

일단은 객체를 생성한다.

기본 생성자를 다쓰기 때문에 에러가 잘 나지 않는다.

그래서 웹 프로그램밍에서는 사용자가 사용 중에 에러가 나는 것을 좋아하지 않기 때문에 보편적으로 더 많이 사용한다.

 

 


 

Iphone.java

package test;

public class Iphone implements Phone {
	private Watch watch;
	private int num;
	
	public Iphone() {
		System.out.println("아이폰 객체 생성 01");
	}
//	public Iphone(Watch watch) {
//		this.watch=watch;
//		System.out.println("아이폰 객체 생성 02");
//	}
//	public Iphone(Watch watch,int num) {
//		this.watch=watch;
//		this.num=num;
//		System.out.println("아이폰 객체 생성 03");
//	}

	@Override
	public void powerOn() {
		this.watch.powerOn();
		System.out.println("num = "+this.num);
	}
	@Override
	public void powerOff() {
		this.watch.powerOff();
	}

	public Watch getWatch() {
		return watch;
	}

	public void setWatch(Watch watch) {
		this.watch = watch;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
	
	
}

 

applicationContext.xml

<?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.xsd">
	
	<bean class="test.Iphone" id="apple">
		<property name="watch" ref="aw"/>
		<property name="num" value="1234"/>
	</bean>
	<bean class="test.GalaxyPhone" id="samsung">
		<constructor-arg ref="gw" />
	</bean>
	
	<bean class="test.appleWatch" id="aw" />
	<bean class="test.GalaxyWatch" id="gw" />
	
</beans>