πŸ’» BackEnd/🟒 Spring | SpringBoot

🟒 [Spring] μŠ€ν”„λ§ μ˜μ‘΄μ„± μ£Όμž…(DI) - [2]

Dbswnstjd 2023. 7. 7. 17:36


🚩 μƒμ„±μž μ˜μ‘΄μ„± μ£Όμž… [ DI ] 을 μ¨μ•Όν•˜λŠ” 이유

μ €λ²ˆ κΈ€μ—μ„œ μ˜μ‘΄μ„± μ£Όμž…μ— λŒ€ν•΄ μ„€λͺ…ν•˜μ˜€λ‹€. ν•„λ“œ μ£Όμž…, μˆ˜μ •μž μ£Όμž…, μƒμ„±μž μ£Όμž…μ„ μ„€λͺ…ν•˜μ˜€λŠ”λ° 이 쀑 μƒμ„±μž μ£Όμž…μ„ μ¨μ•Όν•˜λŠ” 이유λ₯Ό μ„€λͺ…ν•  것이닀. 

μƒμ„±μž μ£Όμž…(Constructor Injection)은 μƒμ„±μžλ₯Ό 톡해 의쑴 관계λ₯Ό μ£Όμž…ν•˜λŠ” 방법이닀.

@Controller
public class ControllerTest{
	IServiceTest service;
    
    @Autowired
    public Controller(IServiceTest service){
    	this.service = service;
    }

μ™œ μƒμ„±μž μ£Όμž…μ„ μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

μƒμ„±μž μ£Όμž…μ€ μƒμ„±μžμ˜ 호좜 μ‹œμ μ— 1회 호좜 λ˜λŠ” 것이 보μž₯λœλ‹€. κ·ΈλŸ¬λ―€λ‘œ μ£Όμž…λ°›μ€ 객체가 λ³€ν•˜μ§€ μ•Šκ±°λ‚˜ λ°˜λ“œμ‹œ 객체의 μ£Όμž…μ΄ ν•„μš”ν•œ κ²½μš°μ— κ°•μ œν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆλ‹€. 그리고 Spring ν”„λ ˆμž„μ›Œν¬ 4.x λ²„μ „μ—μ„œλŠ” μƒμ„±μžκ°€ 1개 μžˆμ„κ²½μš° @Autowiredλ₯Ό μƒλž΅ν•΄λ„ μ£Όμž…μ΄ κ°€λŠ₯ν•˜λ‹€.

@Service
public class UserService{
	
    private IUserRepository userRepository;
    private IProductService productService;
    
    // @Autowired μƒλž΅ κ°€λŠ₯
    public UserService(IUserRepository userRepository, IProductService productService){
    	this.userRepository = userRepository;
        this.productService = productService;
    }

μœ„μ˜ μ½”λ“œλŠ” μƒμ„±μžλ₯Ό ν†΅ν•œ μ˜μ‘΄μ„± μ£Όμž… μ½”λ“œμ΄λ‹€. 

이와 같은 μ½”λ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ°€μž₯ 큰 μ΄μœ λŠ” μ—λŸ¬λ₯Ό 방지할 수 있기 λ•Œλ¬Έμ΄λ‹€.

κ·Έ 외에도 객체의 λΆˆλ³€μ„± 확보, ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±, final ν‚€μ›Œλ“œ μž‘μ„± 및 Lombok 과의 κ²°ν•©, μˆœν™˜ μ°Έμ‘° μ—λŸ¬ 방지 등이 μžˆλ‹€.


1. 객체의 λΆˆλ³€μ„± 확보

μ‹€μ œ κ°œλ°œμ„ ν•˜λ‹€ 보면 의쑴 κ΄€κ³„μ˜ 변경이 ν•„μš”ν•œ 상황은 거의 μ—†λ‹€. ν•˜μ§€λ§Œ μˆ˜μ •μž μ£Όμž…μ΄λ‚˜ 일반 λ©”μ„œλ“œ μ£Όμž…μ„ μ΄μš©ν•˜λ©΄ λΆˆν•„μš”ν•˜κ²Œ μˆ˜μ •μ˜ κ°€λŠ₯성을 열어두어 μœ μ§€λ³΄μˆ˜μ„±μ„ λ–¨μ–΄λœ¨λ¦°λ‹€. 즉 개발자의 μ˜λ„μ™€λŠ” 관계없이 μˆ˜μ •λ˜λŠ” 상황이 λ°œμƒν•  수 μžˆλ‹€λŠ” 것이닀. κ·ΈλŸ¬λ―€λ‘œ μƒμ„±μž μ£Όμž…μ„ 톡해 λ³€κ²½μ˜ κ°€λŠ₯성을 λ°°μ œν•˜κ³  λΆˆλ³€μ„±μ„ 보μž₯ν•˜λŠ” 것이 μ’‹λ‹€. 


2. ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±

ν…ŒμŠ€νŠΈκ°€ νŠΉμ • ν”„λ ˆμž„μ›Œν¬μ— μ˜μ‘΄ν•˜λŠ” 것은 쒋지 μ•Šλ‹€. κ·ΈλŸ¬λ―€λ‘œ κ°€λŠ₯ν•œ μžλ°”λ‘œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜λŠ” 것이 κ°€μž₯ 쒋은데, μƒμ„±μž μ£Όμž…μ΄ μ•„λ‹Œ λ‹€λ₯Έ μ£Όμž…μœΌλ‘œ μž‘μ„±λœ μ½”λ“œλŠ” μˆœμˆ˜ν•œ μžλ°” μ½”λ“œλ‘œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κΈ° μ–΄λ ΅λ‹€. 


3. final ν‚€μ›Œλ“œμ™€ Lombok의 κ²°ν•©

μƒμ„±μž μ£Όμž…μ„ μ‚¬μš©ν•˜λ©΄ ν•„λ“œ 객체에 final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. λ”°λΌμ„œ μ΄λŠ” 컴파일 μ‹œμ μ— λˆ„λ½λœ μ˜μ‘΄μ„±μ„ 확인할 수 μžˆλ‹€.

반면 λ‹€λ₯Έ μ£Όμž… 방법듀은 객체의 생성(μƒμ„±μž 호좜) 이후에 ν˜ΈμΆœλ˜λ―€λ‘œ final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. λ˜ν•œ final ν‚€μ›Œλ“œλ₯Ό 뢙이면 Lombokκ³Ό κ²°ν•©λ˜μ–΄ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ‹€. Lombokμ—λŠ” final λ³€μˆ˜λ₯Ό μœ„ν•œ μƒμ„±μžλ₯Ό λŒ€μ‹  μƒμ„±ν•΄μ£ΌλŠ” @RequiredArgsConstructorλ₯Ό μ‚¬μš©ν•œλ‹€.

컴파일 μ‹œμ μ— λˆ„λ½λœ μ˜μ‘΄μ„±μ„ ν™•μΈν•˜λŠ” 것이 맀우 μ€‘μš”ν•œ 이유인데 μ΄λŠ” μ‹€μ œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜κ³  도쀑에 였λ₯˜κ°€ λ°œμƒν•œλ‹€λ©΄ 맀우 μœ„ν—˜ν•œ 상황이닀. ν•˜μ§€λ§Œ μƒμ„±μž μ£Όμž…μ„ 톡해 컴파일 μ‹œ μ˜μ‘΄μ„±μ„ ν™•μΈν•˜κ³  λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ‚˜μ§€ μ•Šλ„λ‘ 미연에 λ°©μ§€ν•˜λŠ” 것이닀. κ°œλ°œμžλŠ” 신이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— λΆ„λͺ…νžˆ μ‹€μˆ˜λ₯Ό ν•  수 있고 이λ₯Ό 사전에 λ°©μ§€ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•œ 방법이라고 λ³Ό 수 μžˆλ‹€. 

 

예λ₯Ό λ“€μ–΄μ„œ 보자

@Service
public class UserService{
	
    private IUserRepository userRepository;
   	
    @Autowired
    public void setIUserRepository(){
    	// biz()
    }
    
    public void hello(){
    	setIUserRepository~
    }

λ‚˜ λ˜ν•œ μ²˜μŒμ— μ™œ μƒμ„±μž μ£Όμž…μ„ μ‚¬μš©ν•΄μ•Όν•˜κ³  κ·Έ 이유λ₯Ό 잘 λͺ°λžλ‹€. ν•˜μ§€λ§Œ μ˜ˆμ‹œλ₯Ό λ“€μ–΄μ„œ 보닀보면 이해가 쉬웠닀. 

μœ„λŠ” set 으둜 μƒμ„±μž μ£Όμž…μ„ ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ μœ„μ˜ μ½”λ“œλŠ” helloλΌλŠ” λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „μ—λŠ” μ˜μ‘΄μ„±μ„ μ•Œμ§€ λͺ»ν•œλ‹€. λ§Œμ•½ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 배포가 λ˜μ—ˆκ³  λ©°μΉ  후에 hello λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜μ—ˆλ‹€κ³  κ°€μ •ν•˜μž. 그러면 κ·Έ λ•Œ λ°œμƒν•œ 였λ₯˜λŠ” μ‚¬μš©μžμ—κ²Œ λŒμ•„κ°€λŠ” 것이닀. μ΄λŸ¬ν•œ 사고λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 컴파일 μ—λŸ¬λ‘œ κΌ­ μž‘μ•„μ£Όμ–΄μ•Ό ν•˜κ³  μ‚¬μ†Œν•œ μ‹€μˆ˜κ°€ 더 큰 상황이 λ˜λŠ” 것을 λ°©μ§€ν•˜λ„λ‘ ν•œλ‹€.