
스프링 컨테이너가 의존 관계를 자동 연결해 객체 간 결합도를 낮추는 핵심 메커니즘
// Before: 강결합
class A {
private B b = new B(); // A가 직접 생성 → B 교체 시 A 수정 필요
}
// After: 느슨한 결합
class A {
private B b; // 상위 타입 의존
public A(B b) { this.b = b; } // 외부 주입(생성자)
}
interface B {}
class NewB implements B {}
Account(인터페이스) ← PersonalAccount(구현체)MemberDTO 가 Account 에 의존public interface Account {
String getBalance();
String deposit(int money);
String withDraw(int money);
}
@RequiredArgsConstructor
public class PersonalAccount implements Account {
private final int bankCode;
private final String accNo;
private int balance;
// ... 메서드 생략
}
@Getter @Setter @ToString
@AllArgsConstructor @NoArgsConstructor
public class MemberDTO {
private int sequence;
private String name;
private String phone;
private String email;
private Account personalAccount; // 상위 타입 의존
}
<!-- 구현체로 등록해야 함 (interface X) -->
<bean id="account" class="com.ohgiraffers.common.PersonalAccount">
<constructor-arg index="0" value="20"/>
<constructor-arg index="1" value="110-234-567890"/>
</bean>
<bean id="member" class="com.ohgiraffers.common.MemberDTO">
<constructor-arg name="sequence" value="1"/>
<constructor-arg name="name" value="홍길동"/>
<constructor-arg name="phone" value="010-1234-5678"/>
<constructor-arg name="email" value="hong123@gmail.com"/>
<constructor-arg name="personalAccount">
<ref bean="account"/>
</constructor-arg>
</bean>
<bean id="account" class="com.ohgiraffers.common.PersonalAccount">
<constructor-arg index="0" value="20"/>
<constructor-arg index="1" value="110-234-567890"/>
</bean>
<bean id="member" class="com.ohgiraffers.common.MemberDTO">
<property name="sequence" value="1"/>
<property name="name" value="홍길동"/>
<property name="phone" value="010-1234-5678"/>
<property name="email" value="hong123@gmail.com"/>
<property name="personalAccount" ref="account"/>
</bean>
constructor-arg vs property 만 다를 뿐 동작 결과는 동일@Configuration
public class ContextConfiguration {
@Bean
public Account accountGenerator() {
return new PersonalAccount(20, "110-234-567890");
}
@Bean
public MemberDTO memberGenerator() {
return new MemberDTO(
1, "홍길동", "010-1234-5678", "hong123@gmail.com",
accountGenerator() // 빈 참조 전달
);
}
}
@Configuration
public class ContextConfiguration {
@Bean
public Account accountGenerator() {
return new PersonalAccount(20, "110-234-567890");
}
@Bean
public MemberDTO memberGenerator() {
MemberDTO m = new MemberDTO();
m.setSequence(1);
m.setName("홍길동");
m.setPhone("010-1234-5678");
m.setEmail("hong123@gmail.com");
m.setPersonalAccount(accountGenerator()); // 빈 참조 전달
return m;
}
}
생성자 주입
세터 주입
실무에선 핵심 의존성 = 생성자, 선택 옵션 = 세터 패턴이 안전