์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ๊ฒ์
- mysql
- https://youtube.com/playlist?list=PLuHgQVnccGMA5836CvWfieEQy0T0ov6Jh&si=FTaYv8m21EhO-A2K
- webpack
- Porject
- Project
- ๋น๋๊ธฐ
- ์ฐธ๊ณ ๋ธ๋ก๊ทธ
- callback
- object
- prj
- JS #ํ๋ก์ ํธ
- sql
- promise
- db
- async
- database
- json
- ํผํ
- https://m.blog.naver.com/tt2t2am1118/221010125300
- addEventListener
- eport
- await
- execCommand
- setTimeout()
- Import
- ajax
- ๋๊ธฐ
- slow and steady
- js
- Today
- Total
C-log
2week ๋ณธ๋ฌธ
* ๋๋ฉด ์์ ๋ด์ฉ
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
์ค์ต
์ค์ต์ ํ๊ธฐ ์ํด์ ํ๋ก์ ํธ ํ์ผ์ ์๋์ ๊ฐ๋ค
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(ํ๋กํ ํ์
) ์ค์ฝํ
ํ๋กํ ํ์
๋น์ ๋งค ์์ฒญ๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
์ด ํ๋กํ ํ์
๋น์ ๋ณดํต์ ๋ฐฉ์์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์
๋ฉ๋๋ค. ์ฆ, ํด๋น ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์์ด์ง ๋ ๊ฐ๋น์ง ์ปฌ๋ ์
๋ฉ๋๋ค.
๊ธฐ๋ณธ ์ค์ฝํ
๋ช
์์ ์ผ๋ก ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ, ๋ชจ๋ ๋น์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์
๋๋ค.
* ์์กด์ฑ ์ฃผ์ ๋ฉ์๋ ์ข ๋ฅ
์์ฑ์ ๊ธฐ๋ฐ ์์กด์ฑ ์ฃผ์
(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๋ก ์ค์ ๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์ ์ํจ๋ค.
@Qulifier(value="tony") : XML์์ scope์ด ์ค์ ๋์ง ์์ 2๊ฐ์ ๊ฐ์ class๊ฐ ์กด์ฌํ๋ค๋ ๊ฐ์ ์์ value๊ฐ "tony"์ธ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๊ฒ ๋ค๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ Annotation
@Resource : Autowired๊ฐ ๋๋ ๋ฐฉ์๊ณผ ๊ฐ์ง๋ง name ์์ฑ์ ํตํด์ bean์ id๋ฅผ ์ฐพ๊ฒ๋๋ค.
'๐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 |