반응형
이번 글에서는 XML 설정 없이 어노테이션만으로 객체를 주입받는 방식, 즉 Annotation 기반 DI를 실습합니다. 코드 위주 설정으로 간결해지고, 유지보수가 쉬워지는 특징이 있습니다.
📦 Speaker.java
package example;
public interface Speaker {
public void volumeUp();
public void volumeDown();
}
📦 TV.java
package example;
public interface TV {
public void powerOn();
public void powerOff();
public void volumeUp();
public void volumeDown();
}
📦 AppleSpeaker.java
package example;
import org.springframework.stereotype.Component;
@Component("apple")
public class AppleSpeaker implements Speaker {
public AppleSpeaker() {
System.out.println(getClass().getSimpleName() + " 객체 생성");
}
public void volumeUp() {
System.out.println(getClass().getSimpleName() + " 볼륨 업");
}
public void volumeDown() {
System.out.println(getClass().getSimpleName() + " 볼륨 다운");
}
}
📦 BossSpeaker.java
package example;
import org.springframework.stereotype.Component;
@Component("boss")
public class BossSpeaker implements Speaker {
public BossSpeaker() {
System.out.println(getClass().getSimpleName() + " 객체 생성");
}
public void volumeUp() {
System.out.println(getClass().getSimpleName() + " 볼륨 업");
}
public void volumeDown() {
System.out.println(getClass().getSimpleName() + " 볼륨 다운");
}
}
📦 SamsungTv.java
package example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("stv")
public class SamsungTv implements TV {
@Autowired
@Qualifier("apple")
private Speaker speaker;
private int price;
public SamsungTv() {
System.out.println(getClass().getSimpleName() + " 객체 생성");
}
public void powerOn() {
System.out.println(getClass().getSimpleName() + "전원을 켭니다 : " + price );
}
public void powerOff() {
System.out.println(getClass().getSimpleName() + "전원을 끕니다.");
}
public void volumeUp() {
speaker.volumeUp();
}
public void volumeDown() {
speaker.volumeDown();
}
}
📦 LgTv.java
package example;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component("ltv")
public class LgTv implements TV {
@Resource(name="boss")
private Speaker speaker;
private int price;
public LgTv() {
System.out.println(getClass().getSimpleName() + " 객체 생성");
}
public void powerOn() {
System.out.println(getClass().getSimpleName() + "전원을 켭니다 : " + price );
}
public void powerOff() {
System.out.println(getClass().getSimpleName() + "전원을 끕니다.");
}
public void volumeUp() {
speaker.volumeUp();
}
public void volumeDown() {
speaker.volumeDown();
}
}
📌 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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 어노테이션이 붙은 클래스들을 자동 스캔 -->
<context:component-scan base-package="example"/>
</beans>
📌 TvUser.java
package example;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
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();
}
}
💻 실행 결과 (예시)
AppleSpeaker 객체 생성
BossSpeaker 객체 생성
SamsungTv 객체 생성
LgTv 객체 생성
SamsungTv전원을 켭니다 : 0
AppleSpeaker 볼륨 업
AppleSpeaker 볼륨 다운
SamsungTv전원을 끕니다.
LgTv전원을 켭니다 : 0
BossSpeaker 볼륨 업
BossSpeaker 볼륨 다운
LgTv전원을 끕니다.
💬 코드 설명
- @Component 어노테이션을 클래스에 붙이면 Spring이 자동으로 객체를 생성하고 관리합니다.
- @Autowired는 타입(Type) 기준으로 객체를 주입합니다.
- @Qualifier("beanName")를 함께 사용하면 이름 기준으로 특정 bean을 지정할 수 있습니다.
- @Resource(name="beanName")는 이름 기반으로 주입되며, JSR-250 표준 어노테이션입니다.
- applicationContext.xml에서는 <context:component-scan>으로 지정된 패키지 내의 어노테이션을 가진 클래스를 자동 등록합니다.
💡 포인트 정리
- 어노테이션 기반 DI는 XML 설정을 최소화하고 코드 중심으로 관리 가능.
- @Component + @Autowired, @Qualifier, @Resource 조합으로 다양한 방식의 주입 가능.
- 자동화된 의존성 관리, 유지보수 편의성 향상.
📌정리하자면, 이번 강의에서는 어노테이션 기반 DI 방식을 배웠습니다. XML 설정이 최소화되고, 어노테이션을 통해 클래스 간의 의존성을 자동으로 해결함으로써 더욱 간결하고 유지보수하기 쉬운 코드 구성이 가능해졌습니다. 앞으로 어노테이션 방식은 스프링에서 많이 사용되므로, 확실히 익혀두는 것이 좋습니다!
'Spring > 실습 정리' 카테고리의 다른 글
Spring 7강 - UserDAO & UserService 구성 (1) | 2025.06.18 |
---|---|
Spring 6강 - BoardService 계층 구성과 실행 테스트 (0) | 2025.06.18 |
Spring 5강 - BoardDAO 클래스와 CRUD 기능 구현 (0) | 2025.06.18 |
Spring 4강 - BoardVO와 JDBCUtil 클래스 구성 (0) | 2025.06.17 |
Spring 2강 - 생성자 주입과 다형성 객체 활용 (1) | 2025.06.16 |
Spring 1강 - DI(의존성 주입) 기초 예제 (1) | 2025.06.12 |