๐ท DI :
์ธ๋ถ์์ ๋ ๊ฐ์ฒด๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฒฐ์ ํด์ฃผ๋ ๋์์ธํจํด
๊ฐํ๊ฒ ๊ฒฐํฉ๋ ํด๋์ค๋ค์ ๋ถ๋ฆฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ๊ฐ์ฒด๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฒฐ์ ํด์ค์ผ๋ก์จ
๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ฐ์ฑ์ ํ๋ณดํด์ฃผ๋ ์ญํ ์ ํจ
๐ ๊ฒฐํฉ๋๊ฐ ๋์๊ฑด ๋ฌด์์ผ๊น?
๊ฒฐํฉ๋๋ ๋ค๋ฅธ ๋ชจ๋๊ณผ์ ์์กด์ฑ์ ๋ปํจ ๋ชจ๋ ์์ ์ ์ํด ๋ค๋ฅธ ๋ชจ๋์ ๋ณ๊ฒฝ์ ์๊ตฌํ๋ ์ ๋
( ๋ชจ๋์ด ๋ค๋ฅธ ๋ชจ๋์ ์์กดํ๋ ์ ๋์ ์ฒ๋ or ๋ชจ๋๊ณผ ๋ชจ๋๊ฐ์ ์ํธ ๊ฒฐํฉ ์ ๋๋ฅผ ๋ํ๋ )
- ๊ฐํ ๊ฒฐํฉ :
- ๊ฐ์ฒด ๋ด๋ถ์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ฐํ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง๋ ๊ตฌ์กฐ
- A ํด๋์ค ๋ด๋ถ์์ B๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๊ณ ์๋ค๋ฉด, B ๊ฐ์ฒด๋ฅผ C ๊ฐ์ฒด๋ก ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ์ Aํด๋์ค๋ ์์ ํด์ผํ๋
๋ฐฉ์
- ๋์จํ ๊ฒฐํฉ
- ์ธ๋ถ์์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ๋ ๊ตฌ์กฐ
- ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๊ณ , ๋ฐํ์์ ์์กด๊ด๊ณ๊ฐ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
๐ DI์ ์ธ๊ฐ์ง ์ฃผ์ ๋ฐฉ์
- ์์ฑ์ ์ฃผ์
@Controller
public class Controller{
private final Service service;
@Autowired
public Controller(Service service){
this.service = service;
}
}
# ์์ฑ์์ @Autowired๋ฅผ ๋ถ์ฌ ์์กด์ฑ์ ์ฃผ์
๋ฐ๋ ๋ฐฉ๋ฒ.
2. ํ๋ ์ฃผ์
@Controller
public class Controller{
@Autowired
private Service service;
}
# ํ๋์ @Autowired๋ฅผ ๋ถ์ฌ ์์กด์ฑ์ ์ฃผ์
๋ฐ๋ ๋ฐฉ๋ฒ.
# ์์ฑ์ ์ฃผ์
๊ณผ ๋ค๋ฅด๊ฒ ํ๋๋ฅผ final๋ก ์ ์ํ ์ ์์.
# ์ฃผ์
์ด ๋์์ ์ผ์ด๋ ๊ฒน์น๋ ๊ฒฝ์ฐ ์ํ์ฐธ์กฐ ์๋ฌ๊ฐ ๋ฐ์ํจ.
3. ์์ ์(Setter) ์ฃผ์
@Controller
public class Controller{
private Service service;
@Autowired
public setService(Service service){
this.service = service;
}
}
# ์ฌ์ฉ์ ์ ์ ๋ฉ์๋๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
# ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ ํ์์ฑ์ด ์์ ๋๋ง ์ฌ์ฉ
# final ํค์๋ ์ ์ธ ๋ถ๊ฐ
# ํจ์์ด๋ฆ์ด setXX์ผ ํ์๋ ์์ง๋ง, ์ผ๊ด์ฑ์ ์ํด ์ฌ์ฉํ๋๊ฒ ์ข์
๐ 3๊ฐ์ง ๋ฐฉ์ ์ค ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํ๋๊ฒ ์ข์๊น?
: ์ฌ๋ฌ ๋ฐฉ์ ์ค ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ด ๊ฐ์ฅ ๊ถ์ฅ๋๋๋ฐ ์์ผ๊นโ
1) ์ํ ์ฐธ์กฐ๋ก ์ธํ ์ค๋ฅ ๊ฐ์ง ๊ฐ๋ฅ
: ์๋ก ๋ค๋ฅธ ๋น๋ค์ด ์๋ก ์ฐธ์กฐ๋ฅผ ๋ง๋ฌผ๋ฆฌ๊ฒ ์ฃผ์ ๋๋ฉด์ ์๊ธฐ๋ ํ์
ex ) Bean A -> Bean B ์ฐธ์กฐ / Bean B -> Bean A๋ฅผ ์ฐธ์กฐํด์ผํ๋ ๊ฒฝ์ฐ ์ํ์ฐธ์กฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋จ
๐ ์คํ๋ง์์ ์ด๋ค ์คํ๋ง ๋น์ ๋จผ์ ๋ง๋ค์ด์ผ ํ ์ง ๊ฒฐ์ ํ ์ ์๊ฒ ๋ ์ํฉ
1-1 ) ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ์ํ ์ฐธ์กฐ ๋ฌธ์
@Component
public class BeanA {
private BeanB beanB;
public void BeanA(BeanB beanB){
this.beanB = beanB;
}
}
@Component
public class BeanB {
private BeanA beanA;
public void BeanB(BeanA beanA){
this.beanA = beanA;
}
}
์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ์ IOC๋ Bean A๋ฅผ ์์ฑํ๊ธฐ ์ํด Bean B๋ฅผ ์ฃผ์ ํด์ค์ผํ๊ธฐ ๋๋ฌธ์ Bean B๋ฅผ ์ฐพ๊ณ ,
Bean B๋ฅผ ์์ฑํ๋ คํ๋ Bean A๊ฐ ํ์ํ์ฌ Bean A๋ฅผ ์ฐพ์ผ๋ฉด์ ๋ฌดํ ๋ฐ๋ณต์ด ์๊ธฐ๊ฒ ๋์ด ์คํ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋จ
1-2 ) ํ๋, Setter ์ฃผ์ ๋ฐฉ์์ ์ํ ์ฐธ์กฐ ๋ฌธ์
@Component
public class BeanA {
@Autowired // ํ๋ ์ฃผ์
๋ฐฉ์
private BeanB beanB;
public void run(){
beanB.run();
}
public void call(){
log.info("called BeanA");
}
}
@Component
public class BeanB {
@Autowired // ํ๋ ์ฃผ์
๋ฐฉ์
private BeanA beanA;
public void run(){
log.info("Called BeanB");
beanA.call();
}
}
@Component
public class BeanA {
private BeanB beanB;
@Autowired
public void setBeanB(BeanB beanB){
this.beanB = beanB;
}
public void run(){
beanB.run();
}
public void call(){
log.info("called BeanA");
}
}
@Component
public class BeanB {
private BeanA beanA;
@Autowired
public void setBeanA(BeanA beanA){
this.beanA = beanA;
}
public void run(){
log.info("Called BeanB");
beanA.call();
}
}
๋ ๋ฐฉ์์ ์์ฑ์ ์ฃผ์ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ๋น์์๋ ํ์ํ ์์กด์ฑ์ด ์์๋๋ Null ์ํ๋ก ์ ์งํ๊ณ ,
์ค์ ๋ก ์ฌ์ฉํ๋ ์์ ์ ์ฃผ์ ์ ํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ๋น์์๋ ์ํ์ฐธ์กฐ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์.
์ํ์ฐธ์กฐ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์์ ์ ๋ฐ์ํ๋ค.
๐ ์์ฑ์ ์ฃผ์
์ ์์ฑ์์์ ์์กด๊ด๊ณ ์ฃผ์
์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ์์ฑ์๊ฐ ์คํ ๋ ๋ ์์กด ๊ฐ์ฒด์ Null ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ฏ๋ก
์ปดํ์ผ์์ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ ๋ฐํ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ํฐ ๋ฌธ์ ๋ฅผ ๋ฏธ์ฐ์ ๋ฐฉ์งํ ์ ์์..!!
( ํ๋, Setter ์ฃผ์
์ ์ค์ ๋ก ์ฌ์ฉํ๋ ์์ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋ฐํ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ )
1-2 ) ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ํ๋๋ฅผ Final๋ก ์ ์ธ ๊ฐ๋ฅ
- ํ๋/Setter ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋๋ฉด Final๋ก ์ ์ธ์ด ๋ถ๊ฐํ์ฌ ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ(Immutable)์ ํ๋ณดํ ์ ์๋ค.
1-3 ) ํ ์คํธ์ฝ๋ ์์ฑ ์ฉ์ด
- ํ๋ ์ฃผ์
์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ํด๋์ค๋ผ๋ฉด, ๋จ์ ํ
์คํธ์ ์์กด ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฃผ์
ํ ์ ์์.
( ์คํ๋ง IOC๊ฐ ์์ฑํด์ ์ฃผ์
ํด์ฃผ๋ ๋ฐฉ์์ด๊ณ , ์ธ๋ถ์ ๋
ธ์ถ๋์ด์๋๊ฒ์ด ํ๋๋ ์๊ธฐ ๋๋ฌธ์ ์์กด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋์ ๋จ์ํ
์คํธ๋ฅผ ์์ฑํ๋ฉด
NullPointException์ด ๋ฐ์ํจ)
โจ ) ์์ฑ์ ์ฃผ์ Code๋ฅผ ์ค์ผ ์ ์๋ ์ ์ฉํ ์ด๋ ธํ ์ด์ ๋ค
@NoArgsConstructor - ๊ธฐ๋ณธ ์์ฑ์ ์์ฑ
@AllArgsConstructor - ๋ชจ๋ ํ๋๋ฅผ ์ด๊ธฐํํ๋ ์์ฑ์ ์์ฑ
@RequiredArgsConstructor - ์ด๊ธฐํ ๋์ง ์์ ๋ชจ๋ final ํ๋ & @NonNull ๋งํฌ๊ฐ ์๋ ํ๋๋ฅผ ์ด๊ธฐํํ๋ ์์ฑ์ ์์ฑ
'๐ฝ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ธฐ์ ๋ฉด์ ์คํฐ๋] Filter / Interceptor / AOP ์ ์์ ์ฐจ์ด์ (0) | 2023.02.23 |
---|---|
|Spring & OAuth2| ์นด์นด์ค ๋ก๊ทธ์ธ/ํ์๊ฐ์ Postman์ผ๋ก ํ ์คํธํ๊ธฐ (3) | 2022.12.26 |
Spring | @Transactional์ด ๋ญ๋ฐ (0) | 2022.12.15 |
Spring | AOP๊ฐ ๋ญ๋ฐ (0) | 2022.12.15 |
Spring | DI, IOC๊ฐ ๋ญ๋ฐ (0) | 2022.12.08 |