๊ด€๋ฆฌ ๋ฉ”๋‰ด

C-log

2week ๋ณธ๋ฌธ

๐Ÿ“•JAVA/Spring

2week

4:Bee 2024. 3. 12. 22:08
728x90

* ๋Œ€๋ฉด ์ˆ˜์—… ๋‚ด์šฉ

๋”๋ณด๊ธฐ

DI ์˜์กด์„ฑ ์ฃผ์ž… ๊ฐœ๋… ๋ณต๊ธฐ

  • object Dependncies
    petOwner class ์ฝ”๋“œ ์ฐธ๊ณ  -> ์ƒ์„ฑ์ž ๊ธฐ์ค€์œผ๋กœ new๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์ฆ‰ ํ•ด๋‹น ํด๋ž˜์Šค์™€ ์ƒ์„ฑ์ž๋Š” ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ์ข€ ๋” ์œ ์—ฐํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ DI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • DI
    Bean Container๋ฅผ ํ†ตํ•ด์„œ cat๊ณผ dog๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฃผ์ž…ํ•ด์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ cat๊ณผ dog ๋ชจ๋‘๋ฅผ ์†Œ์œ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์„ค์ • xml config๋ฅผ ํ†ตํ•ด์„œ ๋™์ž‘์„ ์ž˜ ํ•œ๋‹ค.

DI์˜ ๋””์ž์ธ ํŒจํ„ด

๋™์ ์œผ๋กœ ์ฃผ์ž…์„ ํ•œ๋‹ค. ์ปดํŒŒ์ผ๋งˆ๋‹ค๊ฐ€ ์•„๋‹ˆ๋ผ onetime๋งˆ๋‹ค ์ด๋ฃจ์–ด์ง„๋‹ค.

์„ค์ • ํ•˜๋Š” ๋ฐฉ๋ฒ•

-xml
-java annotations
-java-based configuration

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ข…๋ฅ˜

-BeanFactory
-ApplicationContext

bean์—๋Š” id๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Spring Container and DI

xml bean์œผ๋กœ java์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ปจ๋“œ๋กค ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Advantage of DI

์žฅ์  4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

โ˜• ์ธํ„ฐํŽ˜์ด์Šค vs ์ถ”์ƒํด๋ž˜์Šค ์šฉ๋„ ์ฐจ์ด์  - ์™„๋ฒฝ ์ดํ•ด

์ธํ„ฐํŽ˜์ด์Šค vs ์ถ”์ƒํด๋ž˜์Šค ๋น„๊ต ์ด ๊ธ€์„ ์ฐพ์•„๋ณด๋Š” ๋…์ž๋ถ„๋“ค์€ ์•„๋งˆ๋„ ์ด๋ฏธ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒํด๋ž˜์Šค ๊ฐœ๋…์„ ํ•™์Šตํ•œ ๋’ค์— ์ด ๋‘˜์— ๋Œ€ํ•˜์—ฌ ์ฐจ์ด์˜ ๋ชจํ˜ธํ•จ ๋•Œ๋ฌธ์— ๋ฐฉ๋ฌธ ํ–ˆ๊ฒ ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ๋‹ค์‹œํ•œ๋ฒˆ

inpa.tistory.com


์‹ค์Šต

์‹ค์Šต์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค

animals ํด๋” ์•ˆ์— class์™€ interface ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋‹ค.

AnimalType์˜ interface ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

* AnimalType.java

package kr.ac.hansung.cse.animals;

public interface AnimalType {
    void sound();
}

package๋ฅผ ์‚ดํŽด๋ณด๋ฉด kr.ac.hansung.cse์ด๋ž€ package์˜ aminals package๋ฅผ ์ง€์ •ํ•จ์œผ๋กœ์จ ํด๋ž˜์Šค๋ฅผ ํŠน์ • ํŒจํ‚ค์ง€์— ์†ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ importํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ํ•จ๊ป˜ ๋ช…์‹œํ•จ์œผ๋กœ์จ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

๋”๋ณด๊ธฐ

## interface๋ž€?

Java์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์˜ ๋ช…์„ธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ(๋ฉ”์„œ๋“œ ์„ ์–ธ๋งŒ ์žˆ๊ณ  ๊ตฌํ˜„์€ ์—†๋Š” ๋ฉ”์„œ๋“œ)์™€ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ AnimalType์ด๋ž€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ Cat๊ณผ Dog class๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

* Cat.java

package kr.ac.hansung.cse.animals;

public class Cat implements AnimalType{
    String myName;

    public void setMyName(String myName) {
        this.myName = myName;
    }
    @Override
    public void sound() {
        System.out.println("Cat name=" + myName + ":" + "Meow");
    }
}

* Dog.java

package kr.ac.hansung.cse.animals;

public class Dog implements AnimalType{
    String myName;

    public void setMyName(String myName) {
        this.myName = myName;
    }

    @Override
    public void sound() {
        System.out.println("Dog name=" + myName + ":" + "Bow Wow");
    }
}

 

์šฐ๋ฆฐ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ dog๊ณผ cat์— ์ƒ์†์„ ํ•  ๊ฒƒ์ด๋‹ค. ์ด๋กœ ์šฐ๋ฆฌ๋Š” ์ถ”์ƒํด๋ž˜์Šค์˜ ์›์น™์„ ๋”ฐ๋ผ sound๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ ํด๋ž˜์Šค์— ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. ์ด๋ฅผ annotation ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ override๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œ๊ธฐ ํ•œ๋‹ค. (์—ฌ๊ธฐ์„œ ์ƒ์„ฑ์ž๋Š” ์—†๋‹ค.) ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ๋“ค์„ ๊ฐ๊ธฐ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด์•ผ ํ•  ์Šคํ”„๋ง์„ ์ž‘์„ฑํ•  ๊ฒƒ์ด๋‹ค. ํ˜•์‹์€ xmlํŒŒ์ผ ํ˜•์‹์ด๋‹ค.

* animal.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 https://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="catId" class="kr.ac.hansung.cse.animals.Cat">
        <qualifier value="qf_cat"/>
        <property name="myName" value="bella"/>
    </bean>

    <bean id="dogId" class="kr.ac.hansung.cse.animals.Cat">
        <qualifier value="qf_dog"/>
        <property name="myName" value="poodle"/>
    </bean>

    <bean id="petOwnerId" class="kr.ac.hansung.cse.animals.PetOwner">
<!--        <constructor-arg ref="dogId"/>-->
    </bean>
<!--    annotation ํ™œ์„ฑํ™”-->
    <context:annotation-config/>
</beans>

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ ์‚ดํŽด๋ณด์ž. 

* <bean>

<bean> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. id ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋นˆ์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ์ง€์ •ํ•˜๊ณ  class ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋นˆ์ด ์–ด๋–ค ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€๋ฅผ ์ง€์ •ํ•˜๊ณ  ์žˆ๋‹ค. petOwnerId ๋นˆ์ด ์ •์˜๋˜์–ด ์žˆ๋Š” ๋นˆ์„ ์‚ดํŽด๋ณด๋ฉด kr.ac.hansung.cse.animals.PetOwner ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

* <qualifier>

<qualifier> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. <qualifier>๋ฅผ ํ†ตํ•ด์„œ <bean> ์š”์†Œ๋กœ catId์™€ dogId ๋นˆ์— ๊ฐ๊ฐ qf_cat์™€ qf_dog๋ผ๋Š” ํ•œ์ •์ž(qualifier)๋ฅผ ์ง€์ •ํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ petOwnerId ๋นˆ์—๋Š” <qualifier> ์š”์†Œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋นˆ์€ ํ•œ์ •์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด petOwnerId ๋นˆ์€ ํ•œ์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ ํด๋ž˜์Šค kr.ac.hansung.cse.animals.PetOwner์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

* <constructor-arg>

์ฃผ์„ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์žˆ๋Š” <constructor-arg ref="dogId"/> ๋ถ€๋ถ„์€ <constructor-arg> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ์ž ์ธ์ž๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ref๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹จ์ˆœ ์ฐธ์กฐ๋งŒ ํ•˜๊ณ  ์žˆ๋‹ค. ref๋Š” ๋‹จ์ˆœํžˆ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ฐธ์กฐ ํ”„๋กœํผํ‹ฐ๋กœ petOwnerId ๋นˆ์ด ์ƒ์„ฑ๋  ๋•Œ dogId ๋นˆ์ด ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜์–ด ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ญ”์ง€ ์•„๋ž˜ ๋”๋ณด๊ธฐ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

๋”๋ณด๊ธฐ

##์ปจํ…Œ์ด๋„ˆ๋ž€?

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋นˆ(Bean)์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐ์ฒด๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•˜๊ณ , ๊ตฌ์„ฑํ•˜๋ฉฐ, ๊ด€๋ฆฌํ•œ๋‹ค. ๋˜ํ•œ, ์ปจํ…Œ์ด๋„ˆ๋Š” ๋นˆ๋“ค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋นˆ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์†Œ๋ฉธ์‹œํ‚จ๋‹ค.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณดํ†ต ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์œ ํ˜•์ด ์žˆ๋‹ค:

BeanFactory: ์Šคํ”„๋ง์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํ…Œ์ด๋„ˆ๋กœ, ๋นˆ์˜ ์ƒ์„ฑ, ์˜์กด์„ฑ ์ฃผ์ž…, ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋“ฑ์„ ๋‹ด๋‹นํ•œ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์ฒด๋กœ๋Š” XmlBeanFactory๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ApplicationContext: BeanFactory๋ฅผ ํ™•์žฅํ•œ ๊ฒƒ์œผ๋กœ, ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋” ๋งŽ์€ ๊ธฐ๋Šฅ ์ค‘์—๋Š” ๋ฉ”์‹œ์ง€ ์†Œ์Šค ์ฒ˜๋ฆฌ, ์ด๋ฒคํŠธ ๋ฐœํ–‰, AOP ์ง€์›, ํ™˜๊ฒฝ ์„ค์ •, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ์ด ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, AnnotationConfigApplicationContext ๋“ฑ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ๋‹ค.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ XML ํŒŒ์ผ์ด๋‚˜ Java Config์™€ ๊ฐ™์€ ์„ค์ •์„ ํ†ตํ•ด ๋นˆ์„ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ค์ •์„ ๋กœ๋“œํ•˜๊ณ , ๋นˆ๋“ค์„ ์ดˆ๊ธฐํ™”ํ•˜๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋นˆ๋“ค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ณ , ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

* <property>

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ <bean>์— ์กด์žฌํ•˜๋Š” <property> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋นˆ์˜ ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ  ์žˆ๋‹ค. "myName" ํ”„๋กœํผํ‹ฐ์— ๊ฐ๊ฐ "bella"์™€ "poodle" ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์žˆ๋‹ค.

* <context:annotation-config>

์ด ์š”์†Œ๋Š” ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์—์„œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ @Autowired, @Component, @Qualifier ๋“ฑ๊ณผ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ”„๋ง์˜ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์‹ค์งˆ ์ ์œผ๋กœ PetOwner๋ฅผ ํ†ตํ•ด์„œ ๋ˆ„๊ตฌ๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ •ํ•ด์•ผํ•œ๋‹ค. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection) ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ์™„๋™๋ฌผ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๊ณ  ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

* PetOwner.java

package kr.ac.hansung.cse.animals;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class PetOwner {
    @Qualifier("qf_cat")
    @Autowired
    AnimalType animal;

//    public PetOwner(AnimalType animal){
//        this.animal = animal;
//    }

    public void play(){
        animal.sound();
    }
}

 

* @Qualifier

@Qualifier ์–ด๋…ธํ…Œ์ด์…˜์€ ์ฃผ์ž…๋  ๋นˆ์„ ์„ธ๋ถ€์ ์œผ๋กœ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋™์ผํ•œ ํƒ€์ž…์˜ ๋นˆ์ด ์กด์žฌํ•  ๋•Œ, ์–ด๋–ค ๋นˆ์„ ์ฃผ์ž…ํ• ์ง€ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ @Qualifier("qf_cat")๋Š” AnimalType ํƒ€์ž…์˜ ๋นˆ(animal.xml) ์ค‘์—์„œ <qualifier> value๊ฐ’์ด "qf_cat"์ธ ๋นˆ์„ ์ฐพ์•„ ์ฃผ์ž…๋ฐ›๋„๋ก ์ง€์ •ํ•œ๋‹ค.

* @Autowired

@Autowired ์–ด๋…ธํ…Œ์ด์…˜์€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž๋™ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋œ๋‹ค. ์—ฌ๊ธฐ์„œ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์€ AnimalType ํƒ€์ž…์˜ ๋นˆ์„ ์ฃผ์ž…๋ฐ›๋„๋ก ์ง€์ •๋˜์–ด ์žˆ๋‹ค.

* AnimalType animal;

@Autowired ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ํ•„๋“œ๋กœ, AnimalType ํƒ€์ž…์˜ ๋นˆ์ด ์ž๋™์œผ๋กœ ์ฃผ์ž…๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์˜๋ฌธ์€ ๊ฐ ์• ์™„๋™๋ฌผ๋“ค์„ AnimalType๋“ค์„ implements๋ฅผ ํ†ตํ•ด ์ƒ์†์„ ๋ฐ›๊ณ  ์žˆ๋Š”๋ฐ ์™œ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ๋ง์ด๋‹ค. ' @Autowired ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ํ•„๋“œ๋กœ, AnimalType ํƒ€์ž…์˜ ๋นˆ์ด ์ž๋™์œผ๋กœ ์ฃผ์ž…๋œ๋‹ค.' ๋ผ๋Š” ๊ฒƒ์€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•ด๋‹น ํƒ€์ž…์˜ ๋นˆ์„ ์ฐพ์•„์„œ ์ฃผ์ž…ํ•œ๋‹ค๋Š” ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ๊ฐ ์• ์™„๋™๋ฌผ(Cat,Dog)๋“ค์˜ ํƒ€์ž…์€ ์ƒ์†์„ ๋ฐ›์€ AnimalType์œผ๋กœ ๊ตฌ๋ถ„์ด ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์ด ์‚ฌ์šฉ๋œ ํ•„๋“œ์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ์„ ์ฃผ์ž…๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ํƒ€์ž…์— ๋งž๋Š” ๋นˆ์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒ€์ฆ์„ ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

๋”๋ณด๊ธฐ

## @Autowired๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฉด..

    public PetOwner(AnimalType animal){
        this.animal = animal;
    }

์œ„ ์ฝ”๋“œ๋Š” PetOwner ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด ์ƒ์„ฑ์ž๋Š” AnimalType ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ์ด๋ฅผ animal ํ•„๋“œ์— ํ• ๋‹นํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒ์„ฑ์ž๋Š” AnimalType ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— PetOwner ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด ์ƒ์„ฑ์ž์— ์ „๋‹ฌ๋œ AnimalType ํƒ€์ž…์˜ ๋นˆ์„ ์ฃผ์ž…ํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, main์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ PetOwner์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ AnimalType์ธ ๋นˆ(Cat, Dog)์„ ํ•ญ์ƒ ์˜์‹ํ•˜๊ณ  ๊ธฐ์ž…์„ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. @Autorwired๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์˜ˆ์ƒ๋˜๋Š” mian ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•„

public class Main {
    public static void main(String[] args) {
        // AnimalType์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ
        AnimalType animal = new Cat(); // ์˜ˆ์‹œ๋กœ Cat ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ

        // PetOwner ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•˜์—ฌ PetOwner ๊ฐ์ฒด ์ƒ์„ฑ
        PetOwner person = new PetOwner(animal);

        // PetOwner ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ์ˆ˜ํ–‰
        person.play();
    }
}

๊ฒฐ๋ก ์ ์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ฝ”๋“œ๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

* person.play();

animal ๊ฐ์ฒด์˜ sound() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์• ์™„๋™๋ฌผ์˜ sound๋ฅผ ์žฌ์ƒํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์Šคํ”„๋ง์€ PetOwner ํด๋ž˜์Šค๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  AnimalType ํƒ€์ž…์˜ ๋นˆ์„ ์ฃผ์ž…ํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋กœ xml์„ ํ†ตํ•œ ์ปจํ…Œ์ด๋„ˆ๋“ค๊ณผ ํด๋ž˜์Šค๋“ค์„ ์‚ดํŽด๋ณด์•˜๋‹ค. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ XML ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ˆ˜ํ–‰ main ์ฝ”๋“œ๋“ค์„ ์‚ดํŽด๋ณด์ž.

* main.java

package kr.ac.hansung.cse;

import kr.ac.hansung.cse.animals.PetOwner;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("conf/animal.xml");

        PetOwner person = (PetOwner) context.getBean("petOwnerId");
        person.play();

        context.close();
    }
}

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด kr.ac.hansung.cse ํŒจํ‚ค์ง€์— Main ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ณ  PetOwner ํด๋ž˜์Šค์™€ ClassPathXmlApplicationContext ํด๋ž˜์Šค๋ฅผ import ํ•˜๊ณ  ์žˆ๋‹ค.

* ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("conf/animal.xml");

ClassPathXmlApplicationContext๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ xml ์„ค์ • ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ xml ์„ค์ • ํŒŒ์ผ์€ conf/animal.xml์ด๋‹ค. animal.xml์— ๊ด€ํ•œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์•ž์„œ ์šฐ๋ฆฌ๊ฐ€ ์‚ดํŽด๋ดค๋‹ค.

*  PetOwner person = (PetOwner) context.getBean("petOwnerId");

context.getBean("petOwnerId")๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ petOwnerId ๋นˆ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์ด๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…์ด Object์ด๊ธฐ ๋•Œ๋ฌธ์— (PetOwner)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ PetOwner ํƒ€์ž…์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์•ผ ํ•œ๋‹ค.

*  person.play();

PetOwner ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํด๋ž˜์Šค์— ์ •์˜๋œ play() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์• ์™„๋™๋ฌผ ์†Œ์œ ์ฃผ์˜ ํ”Œ๋ ˆ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

* context.close();

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์Šคํ”„๋ง์˜ ๋นˆ๊ณผ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฐœ๋…์„ ์‚ดํŽด๋ณด์•˜๋‹ค. ์•„์ง์€ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ์ค‘๊ฐ„์ค‘๊ฐ„ ๋‚ฏ์„ค๊ฒŒ ๋Š๊ปด์ง„๋‹ค. ์ด์— ์šฐ๋ฆฌ๋Š” ๋นˆ๊ณผ ์ปจํ…Œ์ด๋„ˆ ๊ฐœ๋…์„ ๊ณ„์†ํ•ด์„œ ์‚ดํŽด๋ณด๋ฉฐ ๊ฐ•์˜๋ฅผ ์ด์–ด๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค. ๋‹ค์Œ์—๋Š” MVCํŒจํ„ด์— ๊ด€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ˆ ์ž˜ ๋“ฃ๊ณ  ์ž˜ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ข‹์„ ๋“ฏํ•˜๋‹ค.


## ์Šค์Šค๋กœ ์‹ค์Šตํ•˜๊ธฐ

์—ฌ๊ธฐ์„œ ๋๋‚ด๊ธฐ ์•„์‰ฌ์›Œ์„œ ์Šค์Šค๋กœ ์‹ค์Šต์„ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” sound์— ๊ด€๋ จ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ค๊ณ ๊ฐ€๋ฉฐ ์˜์กด์„ฑ ์ฃผ์ž… ์ˆ˜์—…์„ ํ†ตํ•ด ํ•™์Šต ํ•ด๋ณด์•˜๋‹ค. ๋”ฐ๋ผ์„œ ์Šค์Šค๋กœ ํ•™์Šต์„ ํ•ด๋ณผ ๋•Œ AnimalType ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด์„œ ๋‚˜๋งŒ์˜ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด ์ข‹์„ ๋“ฏํ•˜๋‹ค.


## ์ค‘๊ฐ„๊ณ ์‚ฌ๋ฅผ ์œ„ํ•œ ์ด๋ก  ์ •๋ฆฌ

๋นˆ(Bean)์ด๋ž€?

POJO๋ฅผ ๊ฐ€์ง€๊ณ  ๋นˆ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ด๋‹ค.
๋นˆ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์Šคํ”„๋ง ์ปค๋„ค์ด๋„ˆ๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค.
Configuration Metadata๋ฅผ ์•ž์œผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

๋”๋ณด๊ธฐ

* XML ํŒŒ์ผ: ์˜ˆ๋ฅผ ๋“ค์–ด, Spring Framework์—์„œ๋Š” XML ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ Bean ์ •์˜, ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐ ๋‹ค์–‘ํ•œ ์„ค์ •์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
* ์–ด๋…ธํ…Œ์ด์…˜: ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Spring Framework์—์„œ๋Š” @Bean, @Autowired, @ComponentScan ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

XML

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(configuration metadata)๋ฅผ XML๋กœ ํ‘œํ˜„์„ ํ•œ๋‹ค.

Spring Bean Definition

Spring Bean Definition์€ Spring Framework์—์„œ ๋นˆ(Bean)์„ ์ •์˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ด๋‹ค. Spring์—์„œ ๋นˆ(Bean)์˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. 

scope : ๊ฐ์ฒด๊ฐ€ ํ•˜๋‚˜์ธ๊ฒฝ์šฐ ์‹ฑ๊ธ€ํ†ค ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ํ”„๋กœํ† ํƒ€์ž… ์Šคํ”„๋ง์—์„œ๋Š” ์‹ฑ๊ธ€ํ†ค์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ๋ณธ๋ž˜์—๋Š” ์‹ฑ๊ธ€ํ†ค์„ ์ง์ ‘๊ตฌํ˜„ ํ•˜์ง€๋งŒ scope์„ ์„ค์ •ํ•˜๋ฉด ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•  ํ•„์š”์—†์ด ์•Œ์•„์„œ ์Šคํ”„๋ง์—์„œ ๋งŒ๋“ค์–ด์ค€๋‹ค.

<bean id="myBean" class="com.example.MyBean" scope="singleton">
    <!-- ๋นˆ ์„ค์ • -->
</bean>
<bean id="myBean" class="com.example.MyBean" scope="prototype">
    <!-- ๋นˆ ์„ค์ • -->
</bean>

Singleton(์‹ฑ๊ธ€ํ†ค) ์Šค์ฝ”ํ”„
์‹ฑ๊ธ€ํ†ค ๋นˆ์€ Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
์ด ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์ฐธ์กฐ๋  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์ด ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.
Prototype(ํ”„๋กœํ† ํƒ€์ž…) ์Šค์ฝ”ํ”„
ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ๋ณดํ†ต์˜ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์—†์–ด์งˆ ๋•Œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ์Šค์ฝ”ํ”„
๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋ชจ๋“  ๋นˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์ž…๋‹ˆ๋‹ค.

(์ขŒ)์‹ฑ๊ธ€ํ†ค : accountDao์ฐธ์กฐ - ๋™์ผ (์šฐ)ํ”„๋กœํ† ํƒ€์ž… : accountDao์ฐธ์กฐ - ์ฐธ์กฐ ํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ
์‹ฑ๊ธ€ํ†ค์ด๊ธฐ์— ๊ฐ™์€ ๊ฒƒ์„ ์ฐธ์กฐํ•œ๋‹ค.๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ณ€๊ฒฝ์„ ์ฃผ๋ ค๋ฉด setUserName์„ ์ฃผ์–ด์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ฑ๊ธ€ํ†ค์€ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ํ•˜๊ฒŒ๋œ๋‹ค๋ฉด ๊ฐ๊ธฐ ๋‹ค๋ฅด๊ฒŒ ๊ฐ’์ด ๋‚˜์˜ค์ง€๋งŒ setUserName์„ ์ฃผ์ง€ ์•Š์€ ๊ฐ์ฒด๋Š” Null์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

* ์˜์กด์„ฑ ์ฃผ์ž… ๋ฉ”์„œ๋“œ ์ข…๋ฅ˜

์ƒ์„ฑ์ž ๊ธฐ๋ฐ˜ ์˜์กด์„ฑ ์ฃผ์ž…(Constructor-based Injection) - constructor-arg
์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.


์„ธํ„ฐ ๊ธฐ๋ฐ˜ ์˜์กด์„ฑ ์ฃผ์ž…(Setter-based Injection) - property
ํ”„๋กœํผํ‹ฐ ์„ธํ„ฐ(Property Setter)๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์„ค์ •ํ•˜๋Š” Setter ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

constructor-arg : ์ƒ์„ฑ์ž๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.(๋นˆ์„ ์ƒ์„ฑํ•  ๋•Œ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์ธ์ž๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. XML ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ์ƒ์„ฑ์ž ์ธ์ž์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.)

<bean id="myBean" class="com.example.MyBean">
    <constructor-arg value="value1"/>
    <constructor-arg value="value2"/>
</bean>


property : setter์— ๋„˜๊ฒจ์ค„ ์ธ์ž๋ฅผ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.(๋นˆ์„ ์ƒ์„ฑํ•œ ํ›„์— Setter ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ ๊ฐ’์„ ์ฃผ์ž…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. XML ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ์ฃผ์ž…ํ•œ๋‹ค.)

<bean id="myBean" class="com.example.MyBean">
    <property name="propertyName1" value="value1"/>
    <property name="propertyName2" value="value2"/>
</bean>


init, destory : (๋นˆ์˜ ์ดˆ๊ธฐํ™”์™€ ์†Œ๋ฉธ ์‹œ ์‹คํ–‰ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.)

<bean id="myBean" class="com.example.MyBean" init-method="init" destroy-method="destroy">
    <!-- ๋นˆ ์„ค์ • -->
</bean>

singleton: scope์— ๋ช…์‹œ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด default๋กœ ์„ค์ • ๋œ๋‹ค.
prototype:
request:
session:
global-session:
<์‹ฑ๊ธ€ํ†ค ๋™์ž‘ ์ด๋ฏธ์ง€ ์ฐธ์กฐ about 10:00>
<14:00 sigletone๊ณผ prototype์˜ ์ฐจ์ด ์„ค๋ช…>


Spring Annotation Based Configuration

Old wine in new bottle -> xml์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Annotation์„ ์‚ฌ์šฉํ•ด์„œ (๋ฌด์—‡์„?)์„ค์ •ํ•œ๋‹ค. Annotation์€ ํด๋ž˜์Šค์— ์ง์ ‘ ์„ค์ •์„ ํ•œ๋‹ค. xml์€ ์„ค์ •ํ•ด์•ผํ•  ์–‘์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ Annotation์„ ์‚ฌ์šฉ, Annotation์˜ ๋™์ž‘์€ XML์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์ ์šฉ๋œ๋‹ค.

Enabled Spring Annotation(Annotation ์„ค์ • ํ•˜๋Š” ๋ฐฉ๋ฒ•)

xmlns:context="...", etc, need config
context:annotaion-config

Kind Of Annotation

@Required : ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ์ •๋ณด๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๊ณ  ์ ๊ฒ€ํ•˜๋Š” ์—ญํ• , Boy๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ XML๋กœ ๋ถ€ํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ name๊ณผ value๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น @Required๊ฐ€ ์„ค์ • ๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ๋Š” name๊ณผ value๊ฐ€ ์กด์žฌํ•ด์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ age์™€ ๊ฐ™์ด @Required์— ์„ค์ •๋˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜ @Required๋กœ ๋ถ€ํ„ฐ ์ •์˜๋œ ํ…Œ์ดํ„ฐ ํƒ€์ž…์— ๋งž์ง€ ์•Š๋Š” ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ํ‘œ์ถœํ•œ๋‹ค.

์•„๋ž˜๋Š” ์ž˜๋ชป๋œ ๊ฒƒ

@Autorwired : ์ž๋™์œผ๋กœ ๊ฐ์ฒด์™€ ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. ์ฆ‰, ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. scope์ด ์„ค์ •๋˜์ง€ ์•Š์€ singletone์ด default๋กœ ์„ค์ •๋œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ฃผ์ž…์‹œํ‚จ๋‹ค.

@Autowired๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒ์„ฑํ•˜๋ฉด property๋ฅผ ์„ค์ •ํ•ด์•ผํ•จ ํ•˜์ง€๋งŒ  @Autowired๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋”ฐ๋กœ property๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ College์˜ property๋Š” ๋” ์ด์ƒ setter๊ธฐ๋ฐ˜์œผ๋กœ ์˜์กดํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

@Qulifier(value="tony") : XML์—์„œ scope์ด ์„ค์ •๋˜์ง€ ์•Š์€ 2๊ฐœ์˜ ๊ฐ™์€ class๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฐ€์ •์—์„œ value๊ฐ€ "tony"์ธ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๊ฒ ๋‹ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Annotation

@Resource : Autowired๊ฐ€ ๋˜๋Š” ๋ฐฉ์‹๊ณผ ๊ฐ™์ง€๋งŒ name ์†์„ฑ์„ ํ†ตํ•ด์„œ bean์˜ id๋ฅผ ์ฐพ๊ฒŒ๋œ๋‹ค.

728x90

'๐Ÿ“•JAVA > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

6week  (0) 2024.04.21
5week  (0) 2024.04.20
4week  (0) 2024.04.04
3week - MVC  (0) 2024.03.20
OT - 1week  (0) 2024.03.05
Comments