Annotation์ด๋? ์ด๋
ธํ
์ด์
์ ์ฌ์ ์ ์๋ฏธ๋ ์ฃผ์์ด๋ ๋ป์ผ๋ก, ์๋ฐ์์์ Annotation์ ์ฝ๋ ์ฌ์ด์ ์ฃผ์์ฒ๋ผ ์ฐ์ด๋ฉฐ ํน๋ณํ ์๋ฏธ, ๊ธฐ๋ฅ์ ์ํํ๋๋ก ํ๋ ๊ธฐ์ ์ด๋ค.
@xxx ํํ๋ก ์์ฑํ๋ฉฐ ์ธ๋ถ ์ํํธ์จ์ด์ ํ์ํ ์ฒ๋ฆฌ ๋ด์ฉ์ ์ ๋ฌํ๋ค.
DI๋ xml์ ์์กด์ ์ด๋ค. ํ์ง๋ง, Annotation์ ์ด๋ค๋ฉด xml์ ์ญํ ์ ์ถ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ฑ ๋ฐ ์ ๊ฑฐ๊ฐ ํธ๋ฆฌํ๋ค๊ณ ํ ์ ์๋ค. Annotation ๋ณด๋ค init.xml์ด ์ฐ์ ์์๊ฐ ๋จผ์ ์ด๋ค.
annotation์ ์ฌ์ฉํ๊ธฐ์ ์์ ์ถ๊ฐํด์ผํ ๋ด์ฉ์ด ์๋ค.
pom.xml
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
init.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 http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="anno1_auto"/> <!-- ์ฌ์ฉํ ํจํค์ง์ ์ด๋ฆ -->
</beans>
์์ค์ฝ๋ - https://github.com/junghyeyoun/spring
๋ ์ด์ด | ๋ ์ด์ด ๊ฐ์ | ์ด๋ ธํ ์ด์ | ์ด๋ ธํ ์ด์ ๊ฐ์ |
---|---|---|---|
Application Layer | ํด๋ผ์ด์ธํธ์์ ๋ฐ์ดํฐ ์ ์ถ๋ ฅ์ ์ ์ดํ๋ ๋ ์ด์ด | @Controller | ์ ํ๋ฆฌ์ผ์ด์ ๋ ์ด์ด์ ์ปจํธ๋กค๋ฌ์ ๋ถ์ฌ |
Domain Layer | ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ฌ์ด ๋๋ ๋ ์ด์ด๋ก์ ์ ๋ฌด ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๋ ์ด์ด | @Service | ๋๋ฉ์ธ ๋ ์ด์ด์ ์ ๋ฌด์ฒ๋ฆฌ์ ๋ถ์ฌ |
Infrastructure Layer | ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ฐ์ดํฐ ์์์ฑ๋ฑ์ ๋ด๋นํ๋ ๋ ์ด์ด | @Repository | ์ธํ๋ผ ๋ ์ด์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ธ์ค ์ฒ๋ฆฌ์ ๋ถ์ฌ |
๋จ์ํ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ annotation์ด๋ค.
class ์ด๋ฆ์ด Sender์ธ class๊ฐ @Component ์ฌ์ฉํ๋ค๋ฉด,
Sender sender = new Sender(); ์ ๊ฐ์ ๋ป์ด๋ค. Sender ๊ฐ์ฒด๊ฐ Singleton type์ผ๋ก ๋ง๋ค์ด ์ง๋ค.
@Component("abc") ์ฒ๋ผ class ๋ด์ฉ๊ณผ ์๊ด์์ด ์ด๋ฆ์ ์์๋ก ์ ํด๋ ๋๋ค. ์ ์ง ์์ ๊ฒฝ์ฐ class ์ด๋ฆ์ผ๋ก ์ง์ ๋๋ค. (โ ์๊ธ์๋ ์๋ฌธ์๋ก ์
๋ ฅ๋จ)
@Service
public class SenderProcess {
@Autowired
@Qualifier("sender")
private SenderInter inter;
public SenderInter getInter() {
return inter;
}
public void displayData() {
inter.show();
}
}
๋ค์์ @Autowired์ @Qualifier ํ์ฉํ ์ฝ๋์ด๋ค. Sender๋ผ๋ ๋น์ ์ฃผ์ ํด ์ธ๋ถ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
ํด๋์ค์ ํฌํจ ๊ด๊ณ๋ฅผ ์ฌ์ฉํด์ ํ์ํ ์์กด ๊ฐ์ฒด์ โํ์
"์ ํด๋นํ๋ ๋น์ ์ฐพ์ ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์์ฑ์, setter, ํ๋ 3๊ฐ์ง์ ๊ฒฝ์ฐ ํด๋นํ ๋ @Autowired๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
type์ด ๋๊ฐ ์ด์์ผ๋๋ ๋งคํํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ @Qualifier๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด์ ์ด๋ฆ์ ์ ํํ๊ฒ ์ ๋ ฅํด์ ๋งคํํ๋ ๊ฒ์ด๋ค.
@Service("ap")
public class AbcProcess {
@Resource
private Abc1 abc1;
@Resource(name="kbs")
private Abc2 abc2;
}
@Resource๋ ์ด๋ฆ์ ์ํ ๋งคํ์ด๋ผ๊ณ ํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด @Resource๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, abc2์ kbs์ ์ด๋ฆ์ ๊ฐ์ง Bean ๊ฐ์ฒด์ ์์กด์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.
abc1๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ๊ฐ์ด name ์์ฑ์ ์๋ตํ๋ฉด, @Resource ์ด๋
ธํ
์ด์
์ด ์ ์ฉ๋ ํ๋๋ ์ค์ ๋ฉ์๋์ ํ์
์ ์ฌ์ฉํ๋ค.
@Value๋ ์ ๋
ธํ
์ด์
์ด ํ๋๋ ๋ฉ์๋(ํน์ ์์ฑ์)์ ํ๋ผ๋ฏธํฐ ์์ค์์ ํํ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ์ฃผ์
ํด์ฃผ๋ ์ ๋
ธํ
์ด์
์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก SpEL(Spring Expression Language)(ex: #{ํํ์})์ด๋ ์คํ์ผ ์์ฑ ์๋ฆฌํ์์(ex: ${ํํ์})๋ก ๊ฐ์ ์ฃผ์
ํ ์ ์๋ค. ๋ํ ๋ฐฐ์ด ๋ฑ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ด ์ ๋
ธํ
์ด์
์ ์ฒ๋ฆฌํ๋ ๊ณณ์ BeanPostProcessor ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์์ ์ฒ๋ฆฌ๋๋ค.
public class MyProcess {
@Value("#{dataInfo.name}")
private String name;
private String part;
public MyProcess() {
}
@Value("1,2,3,4,5")
private int arr[];
@Value("#{dataInfo.job}")
private String myJob;
์ฐธ๊ณ
์คํ๋ง ํ๋ ์์ํฌ ์ฒซ๊ฑธ์ - ์ฃผ์ํ์ฌ ๋ฃจ๋ค์ค ํค๋
ธ์ํ ๋ง์ฌ์ํค์ง์ ์ ๋ฏผ์ ์ฎ๊น
https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC#cacheput(annotation ๊ฐ๋
)
https://catsbi.oopy.io/379afd0c-d956-4133-b585-20d13d823c1a(@Value)