Everything has an expiration date
[inflearn] 20240106 [스프링-프레임워크] - 6 ~ 7강 필기 본문
[inflearn] 20240106 [스프링-프레임워크] - 6 ~ 7강 필기
Jelly-fish 2024. 1. 7. 15:29
ⓐ 배터리 일체형 : 배터리가 떨어지면 장난감을 새로 구입해야 한다.
→ 배터리를 교체할 수가 없어서
방전되어 기능을 제대로 못하게 되면 버려진다.
ⓑ 배터리 분리형 : 배터리가 떨어지면 배터리만 교체하면 된다.
→ 배터리를 교체할 수 있기 때문에
방전되더라도 배터리를 새로 구입하여
교체해 주기만 하면 된다.
ⓑ 가 훨씬 효과적이다.
객체 하나하나의 기능이 다 엮어져 있다면 (결합력 ↑)
하나의 기능을 교체·수정하려고 할 때
전체를 처음부터 다시 만들어야 한다.
하지만, 객체의 분리가 자유롭다면(결합력 ↓)
하나의 기능을 교체·수정하려고 할 때
필요한 객체만 만들어서 붙여넣기만 하면 된다.
기존의 전체적인 프로젝트의 구조를 바꾸지 않고도
내가 원하는 객체 부분만 새롭게 개발하여 이식해서
프로그램의 개선을 빠르게 완수할 수 있는 것이다.
→ 객체 지향 프로그램의 유연성
객체를 다 독립화 시켜서 인터페이스를 사용하는 것이다.
배터리는 모든 장난감이 필요로 하는 의존 대상이다.
배터리라는 객체에 의존을 해서 완벽한 장난감이 만들어 지는 것.
→ 『Dependency Injection (의존 주입)』
: 모든 장난감이 배터리를 의존하므로
배터리를 장난감에 주입해 주는 것을 의미한다.
이때, 배터리 분리형 장난감처럼
의존 객체인 배터리를 언제든지 교체할 수 있도록 하는 프로그래밍이
유연성이 있고 바람직한 프로그래밍이라고 할 수 있다.
ⓐ 배터리 일체형
public class ElectronicCarToy()
{
private Battery battery;
public ElectronicCarToy()
{
battery = new NormalBattery();
}
}
◎ 생성자에서
배터리 객체를 직접 생성하여 DI 의존 객체 주입
▶ 의존성 ↑ 결합력 ↑ 유연성 ↓
→ 배터리가 떨어지면 장난감을 새로 구입해야 한다.
ⓑ-1 배터리 분리형
(setter를 통한 DI(Dependency Injection, 의존 주입))
public class ElectronicRobotToy()
{
private Battery battery;
// 사용자 정의 defalut 생성자
public ElectronicRobotToy()
{
}
public void setBattery(Battery battery)
{
this.battery = battery;
}
}
◎ setter 에서
배터리 객체를 외부에서 받아 DI 의존 객체 주입
▶ 의존성 ↓ 결합력 ↓ 유연성 ↑
(처음 생성했을 때 배터리가 들어있지 않은 장난감이다.
setter 를 통해 넣어 주어야만 한다.)
→ 배터리가 떨어지면 배터리만 교체하면 된다.
ⓑ-2 배터리 분리형
(생성자 || setter 를 통한 DI(Dependency Injection, 의존 주입))
public class ElectronicRadioToy()
{
private Battery battery;
public ElectronicRadioToy(Battery battery)
{
this.battery = battery;
}
public void setBattery(Battery battery)
{
this.battery = battery;
}
}
◎ 생성자 & setter 에서
배터리 객체를 외부에서 받아 DI 의존 객체 주입
▶ 의존성 ↓ 결합력 ↓ 유연성 ↑
(처음 생성했을 때부터 장난감 내부에 배터리가 존재한다.
변경해 주고 싶다면, setter 를 통해 배터리를 교체하면 된다.)
→ 배터리가 떨어지면 배터리만 교체하면 된다.
ⓐ에서는 생성자에서 배터리를 생성하므로
이후에 변경을 할 수 없기 때문에 바람직하지 못하다.
[applicationContext.xml 에서 의존 주입할 때 방식]
① setter 방식
[BeanViewImpl 에서 TestBean 의존객체를 주입받아야 할 때]
[applicationContext.xml]
<!-- 방법 ① : property 태그 내부에 <ref bean=""> 태그 생성 -->
<bean id="tBean" class="cohttp://m.test.spr.TestBean" />
<bean id="beanView" class="cohttp://m.test.spr.BeanViewImpl">
<!-- BeanViewImpl의 속성 변수명 : "bean" -->
<property name="testBean">
<!-- bean 변수에, TestBean 객체를 set -->
<ref bean="tBean">
</property>
</bean>
<!-- 방법 ② : property 태그 내부에서 ref로 bean id 작성-->
<bean id="tBean" class="cohttp://m.test.spr.TestBean" />
<bean id="beanView" class="cohttp://m.test.spr.BeanViewImpl">
<property name="testBean" ref="tBean"\>
</bean>
② 생성자 방식
[BeanViewImpl 에서 TestBean 의존객체를 주입받아야 할 때]
[BeanViewImpl 생성자]
public BeanViewImpl(TestBean testBean)
{
this.testBean = testBean;
}
[applicationContext.xml]
<bean id="tBean" class="com.test.spr.TestBean" />
<bean id="beanView" class="com.test.spr.BeanViewImpl">
<!-- 생성자의 매개변수값 참조 : 참조할 bean 태그의 id -->
<constructor-arg ref="tBean"></constructor-arg>
</bean>
[7-2 setter 를 통한 의존 객체 주입]
(setXxx() 에서, set을 제거하고 맨 앞의 글자를 소문자로 바꾸어서
<property> 태그의 name 으로 작성한다.)
[Java 클래스 내부 setter 구성]
public class DataBaseConnectionInfo
{
public void setJdbcUrl(String jdbcUrl)
{
this.jdbcUrl = jdbcUrl;
}
}
[applicationContext.xml을 통한 의존 객체 주입]
<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
</bean>
[7-3 List 타입 의존 객체 주입]
[Java 클래스 내부 setter 구성]
public void setDevelopers(List<String> developers)
{
this.developers = developers;
}
[applicationContext.xml 을 이용한 의존 객체 주입]
<property name="developers">
<list>
<value>Cheney.</value>
<value>Eloy.</value>
</list>
</property>
[7-4 Map 타입 객체 주입]
[Java 클래스 내부 setter 구성]
public void setAdministrators(Map<String, String> administrators)
{
this.administrators = administrators;
}
[applicationContext.xml 을 이용한 의존 객체 주입]
<property name="administrators">
<map>
<key>
<value>Cheney</value>
</key>
<value>cheney@springPjt.org</value>
<key>
<value>Eloy</value>
</key>
<value>eloy@springPjt.org</value>
</map>
</property>
'[Inflearn] > 자바 스프링 프레임워크(renew ver.)' 카테고리의 다른 글
[inflearn] 20240106 [스프링-프레임워크] - 10강 필기 (0) | 2024.01.08 |
---|---|
[inflearn] 20240106 [스프링-프레임워크] - 9강 필기 (0) | 2024.01.07 |
[inflearn] 20240106 [스프링-프레임워크] - 8강 필기 (0) | 2024.01.07 |
[inflearn] 20240106 [스프링-프레임워크] - 5강 필기 (0) | 2024.01.07 |
[inflearn] 20240104 [스프링-프레임워크] - 1강 메모장 필기 (0) | 2024.01.04 |