[Spring] DEPENDENCY INJECTION

์„ฑ์žฅ์ผ๊ธฐยท2024๋…„ 8์›” 12์ผ

[SWCAMP] SPRING

๋ชฉ๋ก ๋ณด๊ธฐ
3/6

Dependency Injection

Dependency Injection

๐Ÿ’ก Dependency Injection(์˜์กด์„ฑ ์ฃผ์ž…, ์ดํ•˜ DI)์€ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋นˆ ์„ค์ • ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋กœ ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.

์˜์กด ๊ด€๊ณ„์™€ ๊ฒฐํ•ฉ๋„

public class A {
	
	private B b = new B();

}

public class B {

}

class A ๊ฐ€ class B ๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์งˆ ๋•Œ A๋Š” B์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.

public class A {

	/* ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ */
	private B b = new B();

}

/* ํด๋ž˜์Šค๋ช…์ด B์—์„œ NewB๋กœ ๋ณ€๊ฒฝ */
public class NewB {
	
}
  • ์˜์กด์„ฑ์ด ๊ฐ•ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ํ•œ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ด์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. B๊ฐ€ NewB ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” A ๋„ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๋ฌถ์—ฌ์žˆ์„ ๋•Œ ๊ฒฐํ•ฉ๋„ ๊ฐ€ ๋†’๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.
public class A {

	/* ์ƒ์œ„ ํƒ€์ž…์„ ํ•„๋“œ๋กœ ์„ค์ • */
	private B b;

	/* ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ ๋ฐ›์Œ */
	public A(B b) {
		this.b = b;
	}

}

/* ์ƒ์œ„ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ธํ„ฐํŽ˜์ด์Šค */
public interface B {

}

/* ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค */
public class NewB implements B {

}
  • ์ด์ „์˜ ์ฝ”๋“œ์™€ ๋น„๊ตํ•˜๋ฉด NewB ๋ผ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด์˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  B ๋ผ๋Š” ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ํ•„๋“œ๋ฅผ ์„ ์–ธํ–ˆ๋‹ค. ๋˜ํ•œ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ๋ฌธ๋„ ์—†์–ด์กŒ๊ณ  ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ ๋ฐ›๋„๋ก ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ NewB ์—์„œ ๋˜ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ ๋˜๋”๋ผ๋„ A ์˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ ๋  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์˜์กด ๊ด€๊ณ„๊ฐ€ ๋А์Šจํ•ด์ง€๊ณ  ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์กŒ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

DI ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

  • ์•„๋ž˜ ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ ํ•  Account, PersonalAccount, MemberDTO ํด๋ž˜์Šค์ด๋‹ค.

  • Account

    public interface Account {
    
        /* ์ž”์•ก ์กฐํšŒ */
        String getBalance();
    
        /* ์ž…๊ธˆ */
        String deposit(int money);
    
        /* ์ถœ๊ธˆ */
        String withDraw(int money);
    
    }
  • PersonalAccount

    @Data
    public class PersonalAccount implements Account {
    
        private final int bankCode;       //์€ํ–‰์ฝ”๋“œ
        private final String accNo;       //๊ณ„์ขŒ๋ฒˆํ˜ธ
        private int balance;              //์ž”์•ก
    
        @Override
        public String getBalance() {
    
            return this.accNo + " ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ " + this.balance + "์› ์ž…๋‹ˆ๋‹ค.";
        }
    
        @Override
        public String deposit(int money) {
    
            String str = "";
    
            if(money >= 0) {
                this.balance += money;
                str = money + "์›์ด ์ž…๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.";
            } else {
                str = "๊ธˆ์•ก์„ ์ž˜๋ชป ์ž…๋ ฅํ•˜์…จ์Šต๋‹ˆ๋‹ค.";
            }
    
            return str;
        }
    
        @Override
        public String withDraw(int money) {
    
            String str = "";
    
            if(this.balance >= money) {
                this.balance -= money;
                str = money + "์›์ด ์ถœ๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.";
            } else {
                str = "์ž”์•ก์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์ž”์•ก์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.";
            }
    
            return str;
        }
    
    }
  • MemberDTO

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class MemberDTO {
    	
        private int sequence;                 //ํšŒ์›๋ฒˆํ˜ธ
        private String name;                  //์ด๋ฆ„
        private String phone;                 //ํœด๋Œ€ํฐ๋ฒˆํ˜ธ
        private String email;                 //์ด๋ฉ”์ผ
        private Account personalAccount;      //๊ฐœ์ธ๊ณ„์ขŒ
    
    }
  • โ‡’ Account(๊ณ„์ขŒ) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ PersonalAccount(๊ฐœ์ธ๊ณ„์ขŒ) ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ  MemberDTO ๋Š” Account ํƒ€์ž…์„ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (MemberDTO ๋Š” Account ํƒ€์ž…์— ์˜์กดํ•œ๋‹ค.)

XML Configuration

์ƒ์„ฑ์ž(Constructor) ์ฃผ์ž…

<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 ํƒœ๊ทธ์˜ ํด๋ž˜์Šค ์†์„ฑ์€ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์ด ์•„๋‹Œ ๊ตฌํ˜„ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ account ๋นˆ ๋“ฑ๋ก ์‹œ class ์†์„ฑ์—๋Š” Account ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ PersonalAccount ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • MemberDTO ๋Š” Account ํƒ€์ž…์„ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— member ๋นˆ ๋“ฑ๋ก ์‹œ account ๋นˆ์„ ์ฐธ์กฐํ•˜๋„๋ก <constructor-arg> ํƒœ๊ทธ์˜ ref ์†์„ฑ์„ ์ž‘์„ฑํ•œ๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ƒ์„ฑ์ž ์ฃผ์ž… ์ด๋ผ ํ•œ๋‹ค.

/* XML ์„ค์ • ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ApplicationContext ๊ฐ์ฒด ์ƒ์„ฑ */
ApplicationContext context 
	= new GenericXmlApplicationContext("section01/xmlconfig/spring-context.xml");

/* MemberDTO ํƒ€์ž…์˜ ๋นˆ ๊ฐ€์ ธ์˜ค๊ธฐ */
MemberDTO member = context.getBean(MemberDTO.class);

/* MemberDTO์˜ PersonalAccount ๊ฐ์ฒด ์ถœ๋ ฅ */
System.out.println(member.getPersonalAccount());
/* 10000์› ์ž…๊ธˆ */
System.out.println(member.getPersonalAccount().deposit(10000));
/* ์ž”์•ก ์ถœ๋ ฅ */
System.out.println(member.getPersonalAccount().getBalance());
/* 5000์› ์ถœ๊ธˆ */
System.out.println(member.getPersonalAccount().withDraw(5000));
/* ์ž”์•ก ์ถœ๋ ฅ */
System.out.println(member.getPersonalAccount().getBalance());
  • ์‹คํ–‰ ๊ฒฐ๊ณผ
    PersonalAccount(bankCode=20, accNo=110-234-567890, 
    	balance=110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 0์› ์ž…๋‹ˆ๋‹ค.)
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 0์› ์ž…๋‹ˆ๋‹ค.
    10000์›์ด ์ž…๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 10000์› ์ž…๋‹ˆ๋‹ค.
    5000์›์ด ์ถœ๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 5000์› ์ž…๋‹ˆ๋‹ค.

์„ธํ„ฐ(Setter) ์ฃผ์ž…

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

<property> ํƒœ๊ทธ๋Š” setter ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋นˆ ๊ฐ์ฒด์˜ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์„ค์ •์ด๋‹ค.

  • name : ํ•„๋“œ๋ช…
  • value : ํ•„๋“œ์— ๋‹ด์„ ๊ฐ’
  • ref : ์ฐธ์กฐํ•  ๋นˆ์˜ id

MemberDTO ๋Š” Account ํƒ€์ž…์„ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— member ๋นˆ ๋“ฑ๋ก ์‹œ account ๋นˆ์„ ์ฐธ์กฐํ•˜๋„๋ก <property> ํƒœ๊ทธ์˜ ref ์†์„ฑ์„ ์ž‘์„ฑํ•œ๋‹ค. Setter ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์„ธํ„ฐ ์ฃผ์ž… ์ด๋ผ ํ•œ๋‹ค.

  • ์‹คํ–‰ ๊ฒฐ๊ณผ
    PersonalAccount(bankCode=20, accNo=110-234-567890, 
    	balance=110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 0์› ์ž…๋‹ˆ๋‹ค.)
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 0์› ์ž…๋‹ˆ๋‹ค.
    10000์›์ด ์ž…๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 10000์› ์ž…๋‹ˆ๋‹ค.
    5000์›์ด ์ถœ๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 5000์› ์ž…๋‹ˆ๋‹ค.
  • ๋นˆ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ์„ฑ์ž ๋˜๋Š” setter ๋ฉ”์†Œ๋“œ๋ผ๋Š” ์ฐจ์ด๋Š” ์žˆ์œผ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค.

Java Configuration

์ƒ์„ฑ์ž(Coustructor) ์ฃผ์ž…

@Bean
public Account accountGenerator() {

		return new PersonalAccount(20, "110-234-567890");
}

@Bean
public MemberDTO memberGenerator() {

		/* MemberDTO ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด Account๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฆฌํ„ด ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ bean์„ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๋‹ค. */
		return new MemberDTO(1, "ํ™๊ธธ๋™", "010-1234-5678", "hong123@gmail.com", accountGenerator());
}
  • MemberDTO ๋Š” Account ํƒ€์ž…์„ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— memberGenerator ๋นˆ ๋“ฑ๋ก ์‹œ accountGenerator ๋นˆ์„ ์ฐธ์กฐํ•˜๋„๋ก MemberDTO ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ accountGenerator ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ(PersonalAccount bean ๊ฐ์ฒด)๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ƒ์„ฑ์ž ์ฃผ์ž… ์ด๋ผ ํ•œ๋‹ค.
/* Java ์„ค์ • ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ApplicationContext ๊ฐ์ฒด ์ƒ์„ฑ */
ApplicationContext context 
	= new AnnotationConfigApplicationContext(ContextConfiguration.class);

/* MemberDTO ํƒ€์ž…์˜ ๋นˆ ๊ฐ€์ ธ์˜ค๊ธฐ */
MemberDTO member = context.getBean(MemberDTO.class);

/* MemberDTO์˜ PersonalAccount ๊ฐ์ฒด ์ถœ๋ ฅ */
System.out.println(member.getPersonalAccount());
/* 10000์› ์ž…๊ธˆ */
System.out.println(member.getPersonalAccount().deposit(10000));
/* ์ž”์•ก ์ถœ๋ ฅ */
System.out.println(member.getPersonalAccount().getBalance());
/* 5000์› ์ถœ๊ธˆ */
System.out.println(member.getPersonalAccount().withDraw(5000));
/* ์ž”์•ก ์ถœ๋ ฅ */
System.out.println(member.getPersonalAccount().getBalance());
  • ์‹คํ–‰ ๊ฒฐ๊ณผ
    PersonalAccount(bankCode=20, accNo=110-234-567890, 
    	balance=110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 0์› ์ž…๋‹ˆ๋‹ค.)
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 0์› ์ž…๋‹ˆ๋‹ค.
    10000์›์ด ์ž…๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 10000์› ์ž…๋‹ˆ๋‹ค.
    5000์›์ด ์ถœ๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 5000์› ์ž…๋‹ˆ๋‹ค.

์„ธํ„ฐ(Setter) ์ฃผ์ž…

@Bean
public Account accountGenerator() {

		return new PersonalAccount(20, "110-234-567890");
}

@Bean
public MemberDTO memberGenerator() {

    MemberDTO member = new MemberDTO();
    member.setSequence(1);
    member.setName("ํ™๊ธธ๋™");
    member.setPhone("010-1234-5678");
    member.setEmail("hong123@gmail.com");
		/* setter๋ฅผ ํ†ตํ•ด Account๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฆฌํ„ด ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ bean์„ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๋‹ค. */
    member.setPersonalAccount(accountGenerator());

    return member;
}
  • MemberDTO ๋Š” Account ํƒ€์ž…์„ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— memberGenerator ๋นˆ ๋“ฑ๋ก ์‹œ accountGenerator ๋นˆ์„ ์ฐธ์กฐํ•˜๋„๋ก setPersonalAccount ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ accountGenerator ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ(PersonalAccount bean ๊ฐ์ฒด)๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. setter๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์„ธํ„ฐ ์ฃผ์ž… ์ด๋ผ ํ•œ๋‹ค.

  • ์‹คํ–‰ ๊ฒฐ๊ณผ

    PersonalAccount(bankCode=20, accNo=110-234-567890, 
    	balance=110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 0์› ์ž…๋‹ˆ๋‹ค.)
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 0์› ์ž…๋‹ˆ๋‹ค.
    10000์›์ด ์ž…๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 10000์› ์ž…๋‹ˆ๋‹ค.
    5000์›์ด ์ถœ๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    110-234-567890 ๊ณ„์ขŒ์˜ ํ˜„์žฌ ์ž”์•ก์€ 5000์› ์ž…๋‹ˆ๋‹ค.
  • ๋นˆ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ์„ฑ์ž ๋˜๋Š” setter ๋ฉ”์†Œ๋“œ๋ผ๋Š” ์ฐจ์ด๋Š” ์žˆ์œผ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค.

์ •๋ฆฌ

  • DI๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋นˆ ์„ค์ • ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋กœ ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.

  • XML ๋นˆ ์„ค์ • ์‹œ์—๋Š” <constructor-args> ๋˜๋Š” <property> ํƒœ๊ทธ์˜ ref ์†์„ฑ์— ์˜์กด์„ฑ ์ฃผ์ž…ํ•  bean์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค.

  • Java ๋นˆ ์„ค์ • ์‹œ์—๋Š” ์ƒ์„ฑ์ž, setter ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž ๊ฐ’์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…ํ•  bean์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.

profile
์—”์ง€๋‹ˆ์–ด๋กœ์˜ ์„ฑ์žฅ์ผ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€