-
์คํ๋ง ์ปจํ ์ด๋ ์์กด์ฑ ์ฃผ์ - ์์ฑ์, setter๋ฉ์๋ ์ฌ์ฉJAVA 2020. 11. 8. 17:05
๐ฏ Spring Framework์ ํน์ง๊ณผ ์์กด์ฑ ์ฃผ์ ๋ฐฉ๋ฒ์ ์์๋ณธ๋ค.
์คํ๋ง ํ๋ ์์ํฌ
์๋ฐ ์ํฐํ๋ผ์ด์ฆ(Java EE) ๊ฐ๋ฐ์ ํธํ๊ฒ ํด์ฃผ๋ ์คํ ์์ค ๊ฒฝ๋๊ธ ์ดํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ
*์ํฐํ๋ผ์ด์ฆ๋?
์ํฐํ๋ผ์ด์ฆ ์ดํ๋ฆฌ์ผ์ด์ : ๊ธฐ์ ์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๊ธฐ ์ ํฉํ ์ดํ๋ฆฌ์ผ์ด์
์ด๋ฐ ๊ธฐ์ ์ฉ ํ๋ ์์ํฌ๋ ๋ณดํต ๊ตฌ์กฐ๊ฐ ๋ณต์กํ ํธ์ธ๋ฐ, ์คํ๋ง์ ๊ฐ๋จํ ๊ตฌ์ฑ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋ ๊ฒฝ๋(light-weight) ํ๋ ์์ํฌ์ด๋ค.
์ ์คํ๋ง์ ์ฌ์ฉํ ๊น?
- POJO ๊ฐ๋ฐ์ ์ฝ๊ฒ ํ ์ ์๋ค.
- IoC(Inversion of Control) ์ปจํ ์ด๋: ๊ฐ์ฒด์ ๊ด๋ฆฌ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์๊ฒ ์์์์ฑํ๋ค. ์ปจํ ์ด๋๊ฐ ์ฝ๋ ๋์ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์๋ฉธ์ ๊ด๋ฆฌํ ์ ์์ด์ IoC(์ ์ด์ ์ญ์ )์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. configuration.xml ํ์ผ์ด๋ ์๋ฐ ์์ค์ฝ๋ ์์ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์ค์ ํ๋ค.
- ๋์จํ ์ฐ๊ฒฐ(๋์ปคํ๋ง)์ ์ํ ์์กด์ฑ ์ฃผ์ (Dependency Injection): ํด๋์ค ์ฌ์ด์ ์์กด ๊ด๊ณ๋ฅผ ๋น(Bean) ์ค์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ
- AOP ์ง์ (๊ธฐ๋ฅ๋ณ ๋ชจ๋ํ)
์์กด์ฑ ์ฃผ์
๋ ์ฐจ๊ฐ ํ์ํ๋ค. ์ฐจ ๊ณต์ฅ(configuration.xml)์ ์ฐจ๋ฅผ ํ๋ ๋ฌ๋ผ๊ณ ์์ฒญํ๋ค. ๊ณต์ฅ์์ ๋ชจ๋ ๊ฑธ ๋ง๋ค์ด์ ์ค๊ฑฐ๋ค. ์ฐจ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ์์กด์ฑ(์์ง, ํ์ด์ด, ์ํธ ๋ฑ)์ ๊ณต์ฅ์์ ์ฃผ์ ํด์ค๋ค.
A๊ฐ "๋๋ B๊ฐ ํ์ํด"๋ผ๊ณ ์์กด์ฑ ์ฃผ์ ์ ํธ๋ง ๋ณด๋ด๋ฉด ApplicationContext๋ผ๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํ์ํ B๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฃผ์ ํด์ค๋ค. ์ฌ๊ธฐ์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ Bean ์ด๋ผ๊ณ ๋งํ๋ฉฐ ๋น๊ณผ ๋น์ ์์กด๊ด๊ณ๋ xml ๋๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ค์ ํ๋ค. sts ๋ ๊ฑฐ์ ํ๋ก์ ํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก xml ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ค.
์คํ๋ง ๊ฐ๋ฐ ๊ณผ์
- xml์ beans ์ค์ (๊ฐ์ฒด)
- ์คํ๋ง ์ปจํ
์ด๋ ์์ฑ
- ApplicationContext๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์คํ๋ง ์ปจํ ์ด๋
- ๊ทธ๋ฐ์ GenericWebApplicationContext ๋ฑ์ด ์๋ค.
- main์ ์ด ์ปจํ ์ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ฌ์ฉ
- ์คํ๋ง ์ปจํ
์ด๋์์ beans ์ฐพ๊ธฐ
- context.getBean("๋น์ฆ ์์ด๋", ํด๋์ค์ด๋ฆ.class)
- ์์ด๋๋ฅผ ์๋ชป์ ์ผ๋ฉด ์ด๋ฐ ์๋ฌ๊ฐ ๋ฌ๋ค: "NoSuchBeanDefinitionException: No bean named 'stu1' available"
ApplicationContext ac = new ClassPathXmlApplicationContext( "classpath:applicationContext.xml"); UserBean userBean = (UserBean)ac.getBean("userBean"); userBean.setName("kim"); System.out.println(userBean.getName());
์์กด์ฑ ์ฃผ์ 3๊ฐ์ง ๋ฐฉ๋ฒ
- ์์ฑ์ ์ฃผ์
- setter ์ฃผ์
- ์ด๋ ธํ ์ด์ ์ฌ์ฉ ์คํ ์์ด์ด๋ง
์์ฑ์ ์ฃผ์ ๋ฐฉ๋ฒ
- ์์กด์ฑ ํด๋์ค ์ ์
- ์ฃผ์
์ ์ํด ์์ฑ์ ๋ง๋ค๊ธฐ
- ๋ฉค๋ฒ๋ณ์๋ฅผ ์์ฑ์ ์ธ์์ ๊ทธ๋๋ก ๊ฐ๊ณ ์ค๊ธฐ
- configuration.xml ํ์ผ์ ์์กด์ฑ ์ฃผ์
์ค์ ํ๊ธฐ
- helper Bean ๊ฐ์ฒด ๋จผ์ ์์ฑํ๊ณ , ์ฃผ์ ๋ฐ๋ Bean ๊ฐ์ฒด๋ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ผ๋ก helper ์ฐธ์กฐ
constructor_injection1:
com.dto.Student:
private String name; public Student(String x) { System.out.println("์ธ์์๋ ์์ฑ์"); this.name = x; } public String getInfo() { return name; }
stu.xml:
<bean id="firstStudent" class="com.dto.Student"> <constructor-arg name="x" value="ํ๊ธธ๋" /> </bean>
์ด๊ฑธ ๋ฏ์ด๋ณด๋ฉด Student firstStudent = new Student("ํ๊ธธ๋"); ๊ฐ์ฒด์์ฑ ๋ฐฉ์๊ณผ ๋๊ฐ๋ค.
TestStudent:
Student test = ctx.getBean("firstStudent", Student.class); System.out.println(test.getInfo());
๊ธฐ๋ณธ์์ฑ์๋ฅผ ๋ง๋๋ ์ด์ ?
๊ธฐ๋ณธ์์ฑ์(no-arg constructor)๋ฅผ ์ ์ํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ์ผ๋จ ๊ธฐ๋ณธ์์ฑ์๋ฅผ ๋ง๋ค์ด์ค๋ค. ๊ทผ๋ฐ ๋ด๊ฐ ์๋ฌด ์์ฑ์๋ ์ ์ํด๋์ผ๋ฉด(์ธ์์๋ ์์ฑ์) ์ปดํ์ผ๋ฌ๋ ๋ฐ๋ก ๊ธฐ๋ณธ์์ฑ์๋ฅผ ๋ง๋ค์ด์ฃผ์ง ์๋๋ค.
constructor_injection2: ์ธ์๊ฐ ์ฌ๋ฌ๊ฐ์ธ ์์ฑ์
package com.dto; public class Student { private String name; private int age; public Student() {} public Student(String name) { //์์ฑ์๋ฅผ ์์ฑ this.name = name; System.out.println("1"); } public Student(int age) { //์์ฑ์๋ฅผ ์์ฑ this.age = age; System.out.println("2"); } public Student(String name, int age) { //์์ฑ์๋ฅผ ์์ฑ this.name = name; this.age = age; System.out.println("3"); } public String getInfo() { return name+"\t"+age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } }
์ฌ๋ฌ๊ฐ์ ์์ฑ์๋ฅผ ๋ง๋ค์๋ค. ๋ค์๋ง ๋ค์ด๊ฐ๊ฑฐ, ๋์ด๋ง ๋ค์ด๊ฐ๊ฑฐ, ๋๋ค ๋ค์ด๊ฐ๊ฑฐ
stu.xml:
<bean id="firstStudent" class="com.dto.Student"> <constructor-arg name="name" value="ํ๊ธธ๋" /> </bean> <bean id="secondStudent" class="com.dto.Student"> <constructor-arg name="age" value="20" /> </bean> <bean id="thirdStudent" class="com.dto.Student"> <constructor-arg name="name" value="์ ๋ ธ์คํธ" /> <constructor-arg name="age" value="20" /> </bean>
age๋ฅผ String ํ์ ์ผ๋ก ์ผ๋ก ์จ๋ dto์ ์ง์ ํ ๋๋ก int ํ์ ์ผ๋ก ์๋ ํ๋ณํ๋์ด ๋ค์ด๊ฐ๋ค. ์ด๋ ๊ฒ beans ๊ฐ์ฒด 3๊ฐ๋ฅผ ๋ง๋ค์๋ค. ์์ฑ์ ์ธ์ 2๊ฐ ๋ฐ๋๊ฑด ํ๊ทธ๋ 2๊ฐ ๋ค์ด๊ฐ๋ค.
TestStudent.java:
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("stu.xml"); Student test = ctx.getBean("firstStudent", Student.class); System.out.println(test.getInfo()); Student test2 = ctx.getBean("secondStudent", Student.class); System.out.println(test2.getInfo()); Student test3 = ctx.getBean("thirdStudent", Student.class); System.out.println(test3.getInfo()); System.out.println(test+"\t"+test2+"\t"+test3);
constructor_injection3: ๋ค๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐํ๊ธฐ
package com.dto; public class Cat { private String catName; private int catAge; public Cat(String catName, int catAge) { this.catName = catName; this.catAge = catAge; } public String getCatInfo() { return catName+"\t"+catAge; } }
๊ณ ์์ด ๊ฐ์ฒด ์์ฑ
public class Student { private String name; private int age; private Cat cat; public Student() {} public Student(String name, int age, Cat cat) { //์์ฑ์๋ฅผ ์์ฑ this.name = name; this.age = age; this.cat = cat; }
ํ์์ ๊ณ ์์ด๋ ํ๋ง๋ฆฌ ๊ฐ๊ณ ์๋ค. Cat ๊ฐ์ฒด๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ์์ผํ๋ค.
<bean id="pet01" class="com.dto.Cat"> <constructor-arg name="catAge" value="3" /> <constructor-arg name="catName" value="๋๋น" /> </bean> <bean id="firstStudent" class="com.dto.Student"> <constructor-arg name="name" value="ํ๊ธธ๋" /> <constructor-arg name="age" value="30"></constructor-arg> <constructor-arg name="cat" ref="pet01"></constructor-arg> </bean>
cat์ ์ฐธ์กฐํ๊ธฐ ์ํด ์บฃ ๋น์ฆ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค. ์ฐธ์กฐ๋ ref ์์ฑ์ ์ฌ์ฉํ๋ค.
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("stu.xml"); Student stu = ctx.getBean("firstStudent", Student.class); System.out.println(stu.getInfo()); Cat cat = ctx.getBean("pet01", Cat.class); System.out.println(cat.getCatInfo()); Cat cat1 = stu.getCat(); System.out.println(cat1.getCatInfo());
constructor_injection4: jdbc ์ฐ์ต
DeptDAO.java:
public class DeptDAO { public List<String> list(){ return Arrays.asList("ํ๊ธธ๋", "์ด์์ ", "์ ๊ด์"); } }
dao์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
DeptService.java:
public class DeptService { DeptDAO dao; //new๊ฐ ์ฌ๋ผ์ง๊ณ .xml์์ ์ฃผ์ public DeptService(DeptDAO dao) { this.dao = dao; } public List<String> list(){ return dao.list(); } }
์๋น์ค ๊ฐ์ฒด๋ dao ๊ฐ์ฒด๋ฅผ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ผ๋ก ๋ฐ๋๋ค.
stu.xml:
<bean id="deptdao" class="com.dao.DeptDAO"></bean> <bean id="service" class="com.dao.DeptService"> <constructor-arg name="dao" ref="deptdao"></constructor-arg> </bean>
DAO Bean ๊ฐ์ฒด๋ฅผ ๋จผ์ ์์ฑํ๊ณ service ๊ฐ์ฒด๋ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ํตํด ํ์ํ dao ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
main:
DeptService service = ctx.getBean("service", DeptService.class); List<String> list = service.list(); for (String x : list) { System.out.println(x); }
๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ค.
Setter ์ฃผ์ ๋ฐฉ๋ฒ
-
ํด๋์ค์ ์ฃผ์ ์ ์ํ setter ๋ฉ์๋๋ฅผ ๋ง๋ ๋ค.
-
configuration.xml ํ์ผ์ ์์กด์ฑ์ ์ค์ ํ๋ค
setter_injection1:
public class Student { private String name; public Student() { System.out.println("๊ธฐ๋ณธ์์ฑ์ํธ์ถ======"); } public Student(String name) { this.name = name; } public void setName(String name) { System.out.println("setNameํธ์ถ======"); this.name = name; } public String getInfo() { return name; } }
๋ฉค๋ฒ๋ณ์ name์ ๊ฐ์ ์ ํ ํ ์ ์๋ setter ๋ฉ์๋๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ์ ์ธ์์ ์๋ name ์ด๋ผ๋ ๋ณ์๊ฐ xml์์ ์ฌ์ฉํ name์์ฑ์ ๊ฐ์ด ๋๋ค. (setter ๋ฉ์๋๋ช ์ด๋ผ๊ณ ์๊ฐํด๋ ๋๋ค.)
<bean id="firstStudent" class="com.dto.Student"> <property name="name" value="ํ๊ธธ๋"></property> </bean>
xml ์ค์ ํ์ผ์ ํ์ ๊ฐ์ฒด๋ฅผ ์๋ก ๋ง๋ค์ด์ค๋ค. setter ์ฃผ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒฝ์ฐ bean ๊ฐ์ฒด ์์ <property> ํ๊ทธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์ด ํ๋กํผํฐ ํ๊ทธ๋ setter ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋ค๋ ๋ป์ด๋ค. name์์ฑ์ setterํจ์์ ์ธ์ ๋๋ ์ด๋ฆ! value๋ ๋ด๊ฐ ์ธํ ํ๊ณ ์ถ์ ๊ฐ์ ์ง์ ํ๋ค.
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("stu.xml"); Student stu = ctx.getBean("firstStudent", Student.class); System.out.println(stu.getInfo());
setํ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ getter ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
setter_injection2: setter ํจ์ ์ฌ๋ฌ๊ฐ
public class Student { private String name; private int age; //setter injection public void setAge(int age) { this.age = age; } public void setName(String name) { System.out.println("setNameํธ์ถ======"); this.name = name; } public String getInfo() { return name + "\t" + age; } }
<bean id="firstStudent" class="com.dto.Student"> <property name="name" value="ํ๊ธธ๋"></property> <property name="age" value="20"></property> </bean>
setter ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๊ฐ ์ง์ ํ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ํด๋นํ๋ ํ๋กํผํฐ ํ๊ทธ๋ฅผ ์์ฑํ๋ฉด ๋๋ค. ํ๋กํผํฐ๋ก ์ ํจ์ ํธ์ถํด์ ๋์ด๋ฅผ 20์ผ๋ก ์ธํ ํด์คฌ๋ค.
setter_injection3: ์์ฑ์์ setter ํจ๊ป ์ฌ์ฉ
public class Student { private String name; private int age; //setter injection public void setName(String name) { this.name = name; } //constructor injection public Student(int age) { this.age = age; } public String getInfo() { return name + "\t" + age; } }
์ด๋ฒ์ setํจ์๋ name์๋ง ๋ง๋ค์ด์ฃผ๊ณ age๋ ์์ฑ์๋ก ๋ง๋ค์๋ค.
<bean id="firstStudent" class="com.dto.Student"> <property name="name" value="ํ๊ธธ๋"></property> <constructor-arg name="age" value="20"></constructor-arg> </bean>
์ค์ ํ์ผ์์ Stu ๊ฐ์ฒด๋ property๋ constructor-arg ํ๊ทธ ๋๋ค ํ์ํ๋ค.
setter_injection4: ๋ค๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐํ๊ธฐ
public class Cat { private String catName; private int catAge; public void setCatName(String catName) { this.catName = catName; } public void setCatAge(int catAge) { this.catAge = catAge; } public String getCatInfo() { return catName + "\t" + catAge; } }
cat dto ์์ฑ. setter ํจ์๋ง ๊ฐ๊ณ ์๋ค.
<bean id="pet01" class="com.dto.Cat"> <property name="catName" value="๋๋น"></property> <property name="catAge" value="3"></property> </bean> <bean id="firstStudent" class="com.dto.Student"> <property name="name" value="ํ๊ธธ๋"></property> <property name="age" value="30"></property> <property name="cat" ref="pet01"></property> </bean>
ํ์๊ฐ์ฒด๋ Cat๊ฐ์ฒด๋ฅผ ref ์์ฑ์ผ๋ก ์ฐธ์กฐํ๋ค.
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("stu.xml"); Student stu = ctx.getBean("firstStudent", Student.class); System.out.println(stu.getInfo()); Cat cat = ctx.getBean("pet01", Cat.class); System.out.println(cat.getCatInfo());
setter_injection5: p ๋ค์์คํ์ด์ค ์ฌ์ฉ
property ํ๊ทธ๋ฅผ Bean ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค. p ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด xml ๋ค์์คํ์ด์ค์์ p๋ฅผ ์ฒดํฌํ๋ค.
<bean id="firstStudent" class="com.dto.Student" p:name="ํ๊ธธ๋"/>
property ํ๊ทธ ์์ฐ๊ณ bean ์์ ์ธ๋ผ์ธ์ผ๋ก ์์ฑ.
<bean id="pet01" class="com.dto.Cat" p:catName="๋๋น" p:catAge="2" /> <bean id="firstStudent" class="com.dto.Student" p:name="ํ๊ธธ๋" p:age="20" p:cat-ref="pet01">
๋ค๋ฅธ bean ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ cat๋ name-ref ํ์์ ์ธ๋ผ์ธ์ผ๋ก ์์ฑํ ์ ์๋ค.
๐ NEXT : ์คํ๋ง scope, lifeCycle๊ณผ collection ๊ณต๋ถํ๊ธฐ
๋ฐ์ํ'JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์นด์นด์ค ์ง๋ API๋ก ์๋ธ๋ฆฟ&JSP ๊ฒ์ํ ๊ธ์ฐ๊ธฐ ๊ตฌํํ๊ธฐ (0) 2020.12.04 ์คํ๋ง ํ๋ ์์ํฌ STS3 ์ค์น, ๊ฐ๋ฐํ๊ฒฝ ์ค์ (0) 2020.10.21 Servlet ์๋ธ๋ฆฟ ๊ฐ์ฒด์ ์์ฒญ-์๋ต์ฒ๋ฆฌ (0) 2020.09.20 ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ์ ์๋ธ๋ฆฟ Servlet (0) 2020.09.18 ์ดํด๋ฆฝ์ค tern ์๋ฐ์คํฌ๋ฆฝํธ ์๋์์ฑ ํ๋ฌ๊ทธ์ธ ์ค์ (0) 2020.09.17