Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[inflearn] 20240106 [스프링-프레임워크] - 6 ~ 7강 필기 본문

[Inflearn]/자바 스프링 프레임워크(renew ver.)

[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>