๋ชจ๋ ์ค์ต ์ฝ๋(+์ฃผ์) ๋งํฌ: ํ๋ก์ ํธ๋ช : diexam01
1) Spring์ด๋?
Spring Framework๋?
- ์ํฐํ๋ผ์ด์ฆ๊ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋ ๊ฐ๋ฒผ์ด ์๋ฃจ์ ์ด์, ์์ค-์คํ-์(One-Stop-Shop)
- ์ํ๋ ๋ถ๋ถ๋ง ๊ฐ์ ธ๋ค ์ฌ์ฉํ ์ ์๋๋ก ๋ชจ๋ํ๊ฐ ์ ๋์ด ์์ต๋๋ค.
- IoC ์ปจํ ์ด๋์ ๋๋ค.
- ์ ์ธ์ ์ผ๋ก ํธ๋์ญ์ ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ถ MVC Framework๋ฅผ ์ ๊ณตํฉ๋๋ค.
- AOP ์ง์ํฉ๋๋ค.
- ์คํ๋ง์ ๋๋ฉ์ธ ๋ ผ๋ฆฌ ์ฝ๋์ ์ฝ๊ฒ ๋ถ๋ฆฌ๋ ์ ์๋ ๊ตฌ์กฐ๋ก ๋์ด ์์ต๋๋ค.
ํ๋ ์ ์ํฌ ๋ชจ๋
- ์คํ๋ง ํ๋ ์์ํฌ๋ ์ฝ 20๊ฐ์ ๋ชจ๋๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- ํ์ํ ๋ชจ๋๋ง ๊ฐ์ ธ๋ค ์ฌ์ฉํ ์ ์์ต๋๋ค.
AOP์ ์ธ์คํธ๋ฃจ๋ฉํ ์ด์ (Instrumentation)
- spring-AOP : AOP ์ผ๋ผ์ด์ธ์ค(Alliance)์ ํธํ๋๋ ๋ฐฉ๋ฒ์ผ๋ก AOP๋ฅผ ์ง์ํฉ๋๋ค.
- spring-aspects : AspectJ์์ ํตํฉ์ ์ ๊ณตํฉ๋๋ค.
- spring-instrument : instrumentation์ ์ง์ํ๋ ํด๋์ค์ ํน์ WAS์์ ์ฌ์ฉํ๋ ํด๋์ค๋ก ๋ ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฐธ๊ณ ๋ก BCI(Byte Code Instrumentations)์ ๋ฐํ์์ด๋ ๋ก๋(Load) ๋ ํด๋์ค์ ๋ฐ์ดํธ ์ฝ๋์ ๋ณ๊ฒฝ์ ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋งํฉ๋๋ค.
๋ฉ์์ง(Messaging)
- spring-messaging : ์คํ๋ง ํ๋ ์์ํฌ 4๋ ๋ฉ์์ง ๊ธฐ๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ์ ์๋ Message, MessageChannel, MessageHandler ๋ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ํ, ํด๋น ๋ชจ๋์๋ ๋ฉ์๋์ ๋ฉ์์ง๋ฅผ ๋งตํํ๊ธฐ ์ํ ์ด๋ ธํ ์ด์ ๋ ํฌํจ๋์ด ์์ผ๋ฉฐ, Spring MVC ์ด๋ ธํ ์ด์ ๊ณผ ์ ์ฌํฉ๋๋ค.
Data Access/Integration
- ๋ฐ์ดํฐ ์์ธ์ค/ํตํฉ ๊ณ์ธต์ JDBC, ORM, OXM, JMS ๋ฐ ํธ๋์ญ์ ๋ชจ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- spring-jdbc : ์๋ฐ JDBCํ๋ก๊ทธ๋๋ฐ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. (์ด ๊ณผ์ ์์ ๋ฐฐ์ฐ๋ ๊ฒ. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ฑฐ๋ ์ฝ์ด์ฌ ๋ ์ฌ์ฉํ๋ค)
- spring-tx : ์ ์ธ์ ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. (์ด ๊ณผ์ ์์ ๋ฐฐ์ฐ๋ ๋ชจ๋)
- spring-orm : JPA, JDO๋ฐ Hibernate๋ฅผ ํฌํจํ ORM API๋ฅผ ์ํ ํตํฉ ๋ ์ด์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- spring-oxm : JAXB, Castor, XMLBeans, JiBX ๋ฐ XStream๊ณผ ๊ฐ์ Object/XML ๋งตํ์ ์ง์ํฉ๋๋ค.
- spring-jms : ๋ฉ์์ง ์์ฑ(producing) ๋ฐ ์ฌ์ฉ(consuming)์ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณต, Spring Framework 4.1๋ถํฐ spring-messaging๋ชจ๋๊ณผ์ ํตํฉ์ ์ ๊ณตํฉ๋๋ค.
์น(Web)
- ์น ๊ณ์ธต์ spring-web, spring-webmvc, spring-websocket, spring-webmvc-portlet ๋ชจ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- spring-web : ๋ฉํฐ ํํธ ํ์ผ ์ ๋ก๋, ์๋ธ๋ฆฟ ๋ฆฌ์ค๋ ๋ฑ ์น ์งํฅ ํตํฉ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. HTTPํด๋ผ์ด์ธํธ์ Spring์ ์๊ฒฉ ์ง์์ ์ํ ์น ๊ด๋ จ ๋ถ๋ถ์ ์ ๊ณตํฉ๋๋ค. (์ด ๊ณผ์ ์์ ๋ฐฐ์ฐ๋ ๋ชจ๋)
- spring-webmvc : Web-Servlet ๋ชจ๋์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, Spring MVC ๋ฐ REST ์น ์๋น์ค ๊ตฌํ์ ํฌํจํฉ๋๋ค. (์ด ๊ณผ์ ์์ ๋ฐฐ์ฐ๋ ๋ชจ๋)
- spring-websocket : ์น ์์ผ์ ์ง์ํฉ๋๋ค.
- spring-webmvc-portlet : ํฌํ๋ฆฟ ํ๊ฒฝ์์ ์ฌ์ฉํ MVC ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
2) Spring IoC/DI ์ปจํ ์ด๋
์ปจํ ์ด๋(Container)
์ปจํ ์ด๋๋ ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์์ฑ๋ ์ธ์คํด์ค์๊ฒ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋ฅผ ๋ค์ด, Servlet์ ์คํํด์ฃผ๋ WAS๋ Servlet ์ปจํ ์ด๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๋งํฉ๋๋ค.
WAS๋ ์น ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์๋ธ๋ฆฟ URL์ ํด๋นํ๋ ์์ฒญ์ ๋ฐ์ผ๋ฉด, ์๋ธ๋ฆฟ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฐ ํ ์คํํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์์ฑํ์ง๋ง, ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ณ ์คํํ๋ ๊ฒ์ WAS๊ฐ ๊ฐ์ง๊ณ ์๋ Servlet ์ปจํ ์ด๋์ ๋๋ค.
Servlet์ปจํ ์ด๋๋ ๋์ผํ ์๋ธ๋ฆฟ์ ํด๋นํ๋ ์์ฒญ์ ๋ฐ์ผ๋ฉด, ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ์ง ์๊ณ ๊ธฐ์กด์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ์๋ธ๋ฆฟ์ ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์๊ฒ ์ ๋ฌํฉ๋๋ค.
์ปจํ ์ด๋๋ ๋ณดํต ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์์ฑ๋ ์ธ์คํด์ค๋ค์๊ฒ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
IoC(Inversion of Control)
๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํด์ฃผ๊ณ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ ๊ธฐ๋ฅ
์ปจํ ์ด๋๊ฐ ์ฝ๋ ๋์ ์ค๋ธ์ ํธ์ ์ ์ด๊ถ์ ๊ฐ๊ณ ์์ด IoC(์ ์ด์ ์ญ์ )์ด๋ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ธ๋ฆฟ ํด๋์ค๋ ๊ฐ๋ฐ์๊ฐ ๋ง๋ค์ง๋ง, ๊ทธ ์๋ธ๋ฆฟ์ ๋ฉ์๋๋ฅผ ์๋ง๊ฒ ํธ์ถํ๋ ๊ฒ์ WAS์ ๋๋ค.
์ด๋ ๊ฒ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์ด๋ค ํด๋์ค๋ ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด ๋์ ์คํํด์ฃผ๋ ๊ฒ์ ์ ์ด์ ์ญ์ ์ด๋ผ๊ณ ํฉ๋๋ค.
"๊ณต์ฅ์ ๋งค๋ฒ ๋ด๊ฐ ๋ง๋ค์ด์ผ ๋๋ ๊ฑฐ ๋๊ฒ ๊ท์ฐฎ์ ์ผ์ผ ํ ๋ฐ Spring์ด ๊ทธ ์ผ์ ๋์ ํด์ฃผ๋ ๊ฑฐ์์.
Spring์ด ๊ฐ๊ณ ์๋ Bean Factory๋ผ๋ ๊ฐ Application Context ๊ฐ์ ๊ฒ์ด ์ด๋ฐ ๊ณต์ฅ์ ์ญํ ์ ํด์ค ๊ฑฐ๋ค."
DI(Dependency Injection)
DI๋ ์์กด์ฑ ์ฃผ์ ์ด๋ ๋ป์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํด๋์ค ์ฌ์ด์ ์์กด ๊ด๊ณ๋ฅผ ๋น(Bean) ์ค์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ ๋งํฉ๋๋ค.
๊ณต์ฅ์ด ์์ฑํด์ค ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ์ธ ๊ฑฐ์์ ํ๋ ๊ฒ ์ค์ํ ํ ๋ฐ์. DI๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ค
DI๊ฐ ์ ์ฉ ์ ๋ ์: ๊ฐ๋ฐ์๊ฐ ์ง์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
class ์์ง {
}
class ์๋์ฐจ {
์์ง v5 = new ์์ง();
}
Spring์์ DI๊ฐ ์ ์ฉ๋ ์
์์ง type์ v5๋ณ์์ ์์ง ์ธ์คํด์ค๊ฐ ํ ๋น๋์ง ์์์ต๋๋ค.
์ด๋์์๋ ์์ง์ ๋ํ ์์ฑ์ ํ์ง ์์๋๋ฐ ์ปจํ ์ด๋๊ฐ v5๋ณ์์ ์ธ์คํด์ค๋ฅผ ํ ๋นํด์ฃผ๊ฒ ๋ฉ๋๋ค.
@Component
class ์์ง {
}
@Component
class ์๋์ฐจ {
@Autowired
์์ง v5;
}
Spring์์ ์ ๊ณตํ๋ IoC/DI ์ปจํ ์ด๋
-
BeanFactory : IoC/DI์ ๋ํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
-
ApplicationContext : BeanFactory์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํฌํจํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก BeanFactory๋ณด๋ค ์ถ์ฒ๋ฉ๋๋ค. ํธ๋์ญ์ ์ฒ๋ฆฌ, AOP๋ฑ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค. BeanPostProcessor, BeanFactoryPostProcessor๋ฑ์ ์๋์ผ๋ก ๋ฑ๋กํ๊ณ , ๊ตญ์ ํ ์ฒ๋ฆฌ, ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ฒคํธ ๋ฑ์ ์ฒ๋ฆฌํ ์ ์ต๋๋ค.
-
BeanPostProcessor : ์ปจํ ์ด๋์ ๊ธฐ๋ณธ๋ก์ง์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ธ์คํด์คํ ์ ์์กด์ฑ ์ฒ๋ฆฌ ๋ก์ง ๋ฑ์ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ๋๋ก ๊ตฌํํ ์ ์๋๋ก ํฉ๋๋ค.
-
BeanFactoryPostProcessor : ์ค์ ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์์ต๋๋ค.
3) xmlํ์ผ์ ์ด์ฉํ ์ค์
์๋ฌ์ฌํญ
Maven์ผ๋ก Javaํ๋ก์ ํธ ๋ง๋ค๊ธฐ
Archetype์ Maven ํ๋ก์ ํธ์์ ์ ๊ณตํด์ฃผ๋ ํ ํ๋ฆฟ์ด๋ค.
์ด๋ค ๊ฒ์ ์ง์ ํ๋๋์ ๋ฐ๋ผ์ ํ๋ก์ ํธ ๊ตฌ์กฐ๊ฐ ๋ฌ๋ผ์ง๊ณ ์์ ๋ฑ์ด ๋ค์ด์์ ์ ์์ต๋๋ค.
pom.xml ํ์ผ์ JDK๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํ๋ฌ๊ทธ์ธ ์ค์ ์ ์ถ๊ฐํฉ๋๋ค.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>4.3.14.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<!-- jdk 1.8 ์ฌ์ฉํ๊ธฐ ์ํด. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
App.java๊ณผ AppTest.java์ผ๋ก ์ ์๋ํ๋์ง ํ์ธํด๋ณธ๋ค.
Bean class๋?
์์ ์๋ Visualํ ์ปดํฌ๋ํธ๋ฅผ Bean์ด๋ผ๊ณ ๋ถ๋ ์ง๋ง, ๊ทผ๋ ๋ค์ด์๋ ์ผ๋ฐ์ ์ธ Javaํด๋์ค๋ฅผ Beanํด๋์ค๋ผ๊ณ ๋ณดํต ๋งํฉ๋๋ค.
Beanํด๋์ค์ 3๊ฐ์ง ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ธฐ๋ณธ์์ฑ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ํ๋๋ privateํ๊ฒ ์ ์ธํฉ๋๋ค.
- getter, setter ๋ฉ์๋๋ฅผ ๊ฐ์ง๋๋ค.
- getName() setName() ๋ฉ์๋๋ฅผ name ํ๋กํผํฐ(property)๋ผ๊ณ ํฉ๋๋ค. (์ฉ์ด ์ค์)
Spring์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ๋น(Bean)์ด๋ผ๊ณ ๋งํฉ๋๋ค.
(์ง์ new์ฐ์ฐ์๋ก ์์ฑํด์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ ๋น(Bean)์ด๋ผ๊ณ ๋งํ์ง ์์ต๋๋ค.)
Spring์ ๋น์ ์์ฑํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค(Singleton) ๊ฐ์ฒด๋ก ์์ฑํฉ๋๋ค.
์ฑ๊ธํค์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ํ๋๋ง ์์ฑํ๋ค๋ ๊ฒ์ ๋๋ค.
UserBean.java
public class UserBean {
private String name;
private int age;
private boolean male;
public UserBean() { }
public UserBean(String name, int age, boolean male) {
this.name = name; this.age = age; this.male = male;
}
getter, setter ์๋ต
}
Spring Bean Factory๋ฅผ ์ด์ฉํ์ฌ Bean๊ฐ์ฒด ์ด์ฉํ๊ธฐ
- pom.xml ํ์ผ์ Spring ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
https://mvnrepository.com/artifact/org.springframework/spring-context
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
์ฐธ๊ณ ๋ก context๊ฐ ๊ณต์ฅ์ด๋ค.
maven repository์ ์ํ๋ ์์กด์ฑ(spring context)์ ๊ฒ์ํ๊ณ spring version ์คํ๋ง๋ฒ์ ๊ณผ dependency ๋ถ๋ถ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋๋ค.
- ์ถ๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ธํฉ๋๋ค.
maven dependencies ํด๋์ ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- src/main ํด๋ ๋ฐ์ resources ์์ค ํด๋๋ฅผ ์์ฑํฉ๋๋ค. ํด๋น ํด๋์ applicationContext.xml ํ์ผ์ ์์ฑํฉ๋๋ค.
applicationContext.xml
์ค์ ์ ๋ด๊ณ ์๋ ํ์ผ๋ค์ applicationContext.xml๋ก ํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ context(๊ณต์ฅ)๋ค์๊ฒ ์ค์ ๋ค์ ์๋ ค์ฃผ๋๋ก ํ๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<!-- xml ํ์ผ์ ๋ฐ๋์ ๋ xml์ด๊ณ , ๋ฒ์ ์ ๋ญ๊ณ , ์บ๋ฆญํฐ ์
์ ๋ญ ์ธ ๊ฑฐ์ผ๋ฅผ ์๋ ค์ค์ผํด -->
<!-- ๋ฃจํธ element๋ beans ๋ผ๋ element์์ xml ํ์ผ๋ก Spring ์ค์ ํ์ผ์ ๋ง๋ค๊ฒ ๋๋ฉด ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ํ๊ทธ, ์ด๊ฒ์ ๋ฃจํธ element๋ผ๊ณ ํ๊ฑฐ๋ ์ ์ด๊ฒ ๋ฐ๋์ beans๋ก ๋์ด์์ด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ xml ์คํค๋ง์ ๋ํ ์ค์ ๋ ๋์ด์์ด์ผํด์. ํด๋น ์ค์ ํ์ผ์ spring ์ปจํ
์ด๋๊ฐ ์ฝ์ด๋ค์ด๋๋ฐ beans ํ๊ทธ ์์ ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ๋น์ฐํ ์๋ฌด ์ผ๋ ์ํ๊ฒ ์ฃ . -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
applicationContext.xmlํ์ผ์ ์ด์ด์ bean ํ๊ทธ๋ฅผ ํ๋ ์ ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
<bean id="userBean" class="kr.or.connect.diexam01.UserBean"></bean>
์์ ํ๊ทธ๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
UserBean userBean = new UserBean();
ApplicationContext๋ฅผ ์ด์ฉํด์ ์ค์ ํ์ผ์ ์ฝ์ด๋ค์ฌ ์คํํ๊ธฐ
ApplicationContextExam01.java
main ๋ฐ์ ์๋ resources ํด๋์์ ์์ฑํ xml ํ์ผ์ ์๋์ผ๋ก classpath๋ก ์ง์ ์ด ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ClassPathXmlApplicationContext ๋ก ์ฝ์ด์ ์ฌ์ฉํ ์๊ฐ ์๋ค.
ClassPathXmlApplicationContext ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ ์์ฑ์ ํ๋ผ๋ฏธํฐ๋ก ์ง์ ๋ ์ค์ ํ์ผ์ ์ฝ์ด๋ค์ธ ํ์ ๊ทธ ์์ ์ ์ธ๋ bean๋ค์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์ค๋ค.
DI ํ์ธํ๊ธฐ
์ด๋ฒ์๋ DI ์ฆ ์์กด์ฑ ์ฃผ์ ์ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Car์ Engine์ด๋ผ๋ ํด๋์ค 2๊ฐ๋ฅผ ์์ฑํฉ๋๋ค.
Engine.java
Car.java
์์ Car ํด๋์ค๊ฐ ์ ๋๋ก ๋์ํ๋๋ก ํ๋ ค๋ฉด ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์์ฑ๋์ผ ํฉ๋๋ค.
Engine e = new Engine();
Car c = new Car();
c.setEngine(e);
c.run();
1, 2 ๋ฒ์งธ ์ค์ Spring ์ปจํ ์ด๋์๊ฒ ๋งก๊ธฐ๊ธฐ ์ํด ์ค์ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ ๋ ฅํฉ๋๋ค.
<bean id="e" class="kr.or.connect.diexam01.Engine"></bean>
<bean id="car" class="kr.or.connect.diexam01.Car">
<property name="engine" ref="e"></property>
</bean>
์ฆ, ์์ XML์ค์ ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
Engine e = new Engine();
Car c = new Car();
c.setEngine( e );
์ด๋ฒ์ ์์ ์ค์ ํ์ผ์ ์ฝ์ด๋ค์ฌ ์คํํ๋ ApplicationContextExam02.java๋ฅผ ์์ฑํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextExam02 {
public static void main(String[] args) {
// ClassPath์์ ์ค์ ์ ์ฝ์ด์ด
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) ac.getBean("c"); // ๋ฑ๋กํ๋ bean id ์ฃผ๊ธฐ
car.run();
((ConfigurableApplicationContext)ac).close();
}
}
4) Java Config๋ฅผ ์ด์ฉํ ์ค์
์ฐ๋ฆฌ๋ ์์์ xml์ ์ด์ฉํ ์ค์ ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. ์ด๋ฒ ์๊ฐ์ xml ์ค์ ์ ๋์ฒดํ ์ ์๋ Java Config์ ๋ํด ๋ฐฐ์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Java Config๋ ๋ง๊ทธ๋๋ก ์๋ฐ ํด๋์ค ํ์ผ์ ์ค์ ํ์ผ๋ก ์ฌ์ฉ์ ํ๊ฒ ๋ค๋ ๊ฒ์ ๋๋ค. xml์ค์ ๊ณผ ๋น๊ตํด์ Java Config๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋, ํด๋์ค์ ๊ฒฝ์ฐ ์ดํด๋ฆฝ์ค๋ ์ธํ ๋ฆฌJ์ ๊ฐ์ IDE์์ ์คํ ๋ฑ์ ๋ฐ๊ฒฌํ๊ธฐ ์ฝ๊ณ , ์๋์์ฑ ๋ฑ์ ์ง์ํด์ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์คํ๋ง์์๋ Java Config๋ก ์ฌ์ฉํ๋ ํด๋์ค์๋ @Configuration์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ ํ์๋ฅผ ํฉ๋๋ค.
Java config๋ฅผ ์ด์ฉํ ์ค์ ์ ์ํ ์ด๋ ธํ ์ด์
@Configuration
- ์คํ๋ง ์ค์ ํด๋์ค๋ฅผ ์ ์ธํ๋ ์ด๋ ธํ ์ด์
@Bean
- bean์ ์ ์ํ๋ ์ด๋ ธํ ์ด์
@ComponentScan
- @Controller, @Service, @Repository, @Component ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์ฐพ์ ์ปจํ ์ด๋์ ๋ฑ๋ก
@Component
- ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋ ์ ๋ ธํ ์ด์ ์ค ํ๋๋ก์จ ์ฃผ๋ก ์ ํธ, ๊ธฐํ ์ง์ ํด๋์ค์ ๋ถ์ด๋ ์ด๋ ธํ ์ด์
@Autowired
- ์ฃผ์ ๋์์ด๋๋ bean์ ์ปจํ ์ด๋์ ์ฐพ์ ์ฃผ์ ํ๋(๊ฐ์ฒด์์ฑ) ์ด๋ ธํ ์ด์
Java Config๋ฅผ ์ด์ฉํด ์ค์ ํ๊ธฐ
ApplicationConfig.java
package kr.or.connect.diexam01;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//xml ์ค์ ์ ๋์ฒดํ ์ ์๋ Java Config
//์๋ฐ ํด๋์ค ํ์ผ์ ์ค์ ํ์ผ๋ก ์ฌ์ฉ
@Configuration
public class ApplicationConfig {
@Bean
public Car car(Engine e) {
Car c = new Car();
c.setEngine(e);
return c;
}
@Bean
public Engine engine() {
return new Engine();
}
}
@Configuration ์ ์คํ๋ง ์ค์ ํด๋์ค๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
JavaConfig๋ก ์ค์ ์ ํ ํด๋์ค ์์๋ @Configuration๊ฐ ๋ถ์ด ์์ด์ผ ํฉ๋๋ค.
ApplicationContext์ค์์ AnnotationConfigApplicationContext๋ JavaConfigํด๋์ค๋ฅผ ์ฝ์ด๋ค์ฌ IoC์ DI๋ฅผ ์ ์ฉํ๊ฒ ๋ฉ๋๋ค.
์ด๋ ์ค์ ํ์ผ ์ค์ @Bean์ด ๋ถ์ด ์๋ ๋ฉ์๋๋ค์ AnnotationConfigApplicationContext๋ ์๋์ผ๋ก ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ก ๋ฆฌํดํ๋ ๊ฐ์ฒด๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
ApplicationContextExam03.java
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ApplicationContextExam03 {
public static void main(String[] args) {
// ์ค์ ์ ๊ฐ์ง๊ณ ์๋ ํด๋์ค๋ฅผ ์ฝ์ด๋ค์ด๋ฉด ๋จ. ํด๋์ค ํ์ผ์ ์ฝ๋๋ก.
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Car car = (Car) ac.getBean(Car.class); // "๋ฉ์๋ ์ด๋ฆ" ์๋ Car์ ํด๋์ค๋ฅผ ์ฃผ์ธ์
car.run();
((ConfigurableApplicationContext)ac).close();
}
}
ํ๋ผ๋ฏธํฐ๋ก ์์ฒญํ๋ class ํ์ ์ผ๋ก ์ง์ ๊ฐ๋ฅํฉ๋๋ค.
Car car = ac.getBean(Car.class);
ApplicationConfig2.java
package kr.or.connect.diexam01;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
}
๊ธฐ์กด JavaConfig์์ ๋น์ ์์ฑํ๋ ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ์ต๋๋ค.
๋จ, @Configuration์๋์ @ComponentScan์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํ์ต๋๋ค.
@ComponentScan์ด๋ ธํ ์ด์ ์ ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด์จ ํจํค์ง ์ดํ์์ @Controller, @Service, @Repository, @Component ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด ์๋ ํด๋์ค๋ฅผ ์ฐพ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ชฝ๋ ์ฌ๋ ค์ค๋๋ค.
๊ธฐ์กด์ Carํด๋์ค์ Engineํด๋์ค ์์ @Component๋ฅผ ๋ถ์ด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ ๋ JavaConfig๋ฅผ ์ฝ์ด๋ค์ฌ ์คํํ๋ ํด๋์ค๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ApplicationContextExam04.java
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ApplicationContextExam04 {
public static void main(String[] args) {
// ์ค์ ์ ๊ฐ์ง๊ณ ์๋ ํด๋์ค๋ฅผ ์ฝ์ด๋ค์ด๋ฉด ๋จ. ํด๋์ค ํ์ผ์ ์ฝ๋๋ก.
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig2.class);
Car car = (Car) ac.getBean(Car.class); // "๋ฉ์๋ ์ด๋ฆ" ์๋ Car์ ํด๋์ค๋ฅผ ์ฃผ์ธ์
car.run();
((ConfigurableApplicationContext)ac).close();
}
}
์ ๋ฆฌ:
Spring์์ ์ฌ์ฉํ๊ธฐ์ ์๋ง๊ฒ @Controller, @Service, @Repository, @Component ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด ์๋ ๊ฐ์ฒด๋ค์ ComponentScan์ ์ด์ฉํด์ ์ฝ์ด๋ค์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ณ DI๋ฅผ ์ฃผ์ ํ๋๋ก ํ๊ณ , ์ด๋ฌํ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด ์์ง ์์ ๊ฐ์ฒด๋ @Bean์ด๋ ธํ ์ด์ ์ ์ด์ฉํ์ฌ ์ง์ ์์ฑํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํด๋์ค๋ค์ ๊ด๋ฆฌํ๋ฉด ํธ๋ฆฌํฉ๋๋ค.
'Spring > Boost Course Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
4.1 Spring MVC (0) | 2020.11.19 |
---|---|
3.3 Spring JDBC (0) | 2020.11.19 |
3.2 Spring Test (0) | 2020.11.19 |
2.6 JSTL & EL (0) | 2020.11.19 |
2.5 Scope (0) | 2020.11.19 |
2.4 JSP (0) | 2020.11.19 |