국비

[ 42일차 2 ] 수업 정리 - Spring

코딩하는냥이 2025. 6. 16. 15:28
반응형

📌 학습 주제: 생성자 주입(Constructor Injection)을 활용한 Spring DI 심화

이번 수업에서는 Spring Framework의 생성자 의존성 주입 방식을 활용하여, 다양한 구현체를 유연하게 연결하는 실습을 진행했습니다. 특히 TV 클래스와 Speaker 클래스 간의 의존 관계 설정, 다형성 활용, XML 기반의 빈 구성 방식에 중점을 두고 학습하였습니다.


📦 구성 클래스

1. 📺 TV 인터페이스

public interface TV {
	public void powerOn();
	public void powerOff();
	public void volumeUp();
	public void volumeDown();
}

2. 🔊 Speaker 인터페이스 및 구현체들

public interface Speaker {
	public void volumeUp();
	public void volumeDown();
}

3. 🔊 AppleSpeaker / BossSpeaker 클래스

public class AppleSpeaker implements Speaker {
	public AppleSpeaker() { System.out.println("AppleSpeaker 객체 생성"); }
	public void volumeUp() { System.out.println("AppleSpeaker 볼륨 업"); }
	public void volumeDown() { System.out.println("AppleSpeaker 볼륨 다운"); }
}
public class BossSpeaker implements Speaker {
	public BossSpeaker() { System.out.println("BossSpeaker 객체 생성"); }
	public void volumeUp() { System.out.println("BossSpeaker 볼륨 업"); }
	public void volumeDown() { System.out.println("BossSpeaker 볼륨 다운"); }
}

4. 📺 SamsungTv / LgTv 클래스 (생성자 주입)

public class SamsungTv implements TV {
	private Speaker speaker;
	private int price;

	public SamsungTv(Speaker speaker, int price) {
		System.out.println("SamsungTv 객체 생성 3");
		this.speaker = speaker;
		this.price = price;
	}
	public void powerOn() { System.out.println("SamsungTv 전원을 켭니다 : " + price); }
	public void powerOff() { System.out.println("SamsungTv 전원을 끕니다."); }
	public void volumeUp() { speaker.volumeUp(); }
	public void volumeDown() { speaker.volumeDown(); }
}
public class LgTv implements TV {
	private Speaker speaker;
	private int price;

	public LgTv(Speaker speaker, int price) {
		System.out.println("LgTv 객체 생성 3");
		this.speaker = speaker;
		this.price = price;
	}
	public void powerOn() { System.out.println("LgTv 전원을 켭니다 : " + price); }
	public void powerOff() { System.out.println("LgTv 전원을 끕니다."); }
	public void volumeUp() { speaker.volumeUp(); }
	public void volumeDown() { speaker.volumeDown(); }
}

 

5. 🛠️ applicationContext.xml 설정

<bean class="example.SamsungTv" id="stv">
	<constructor-arg ref="apple"/>
	<constructor-arg value="2700000"/>
</bean>

<bean class="example.LgTv" id="ltv">
	<constructor-arg ref="boss"/>
	<constructor-arg value="2700000"/>
</bean>

<bean class="example.AppleSpeaker" id="apple"/>
<bean class="example.BossSpeaker" id="boss"/>

6. 🚀 실행 클래스 TvUser

public class TvUser {
	public static void main(String[] args) {
		AbstractApplicationContext factory =
				new GenericXmlApplicationContext("applicationContext.xml");

		TV tv = (TV) factory.getBean("stv");
		tv.powerOn(); tv.volumeUp(); tv.volumeDown(); tv.powerOff();

		tv = (TV) factory.getBean("ltv");
		tv.powerOn(); tv.volumeUp(); tv.volumeDown(); tv.powerOff();
	}
}

💡 정리하자면, 42일차 수업에서는 생성자 주입(Constructor Injection)을 통해 TV 객체에 다양한 Speaker 객체를 동적으로 연결하는 구조를 실습했습니다. 이를 통해 다형성, 객체 간 의존성 관리, 유연한 설정이 가능해짐을 직접 체험했으며, XML 설정을 통해 손쉽게 의존 객체와 값을 주입할 수 있는 Spring DI의 핵심 원리를 익혔습니다.