JAVA/Effective JAVA

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item01 μ™„λ²½κ³΅λž΅. μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬

초보보 ν˜œμ§„ 2023. 1. 4. 11:15
728x90

 

item01. μƒμ„±μž λŒ€μ‹  정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ. 

"p11. μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬λ₯Ό λ§Œλ“œλŠ” 근간이 λœλ‹€."

 

 

μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬λž€? 

: λ‹€μ–‘ν•œ μ„œλΉ„μŠ€ μ œκ³΅μžλ“€μ΄ ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€λ₯Ό κ΅¬μ„±ν•˜λŠ” μ‹œμŠ€ν…œμœΌλ‘œ ν΄λΌμ΄μ–ΈνŠΈλŠ” 세뢀적인 κ΅¬ν˜„ λ‚΄μš©μ„ λͺ¨λ₯΄λ”라도 μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•  수 μžˆλ‹€. 

ex) mysql, oracle λ“±μ˜ μ„œλΉ„μŠ€ μ œκ³΅μžλ“€μ΄ λͺ¨μ—¬ JDBCλΌλŠ” ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€λ₯Ό ꡬ성함. 

-> ν™•μž₯ κ°€λŠ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“œλŠ” 방법 

 

 

μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬ μ£Όμš” ꡬ성 μš”μ†Œ  

- μ„œλΉ„μŠ€ 제곡자 μΈν„°νŽ˜μ΄μŠ€(SPI) 와 μ„œλΉ„μŠ€ 제곡자 (μ„œλΉ„μŠ€ κ΅¬ν˜„μ²΄) 
- μ„œλΉ„μŠ€ 제곡자 등둝 API (μ„œλΉ„μŠ€ μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ₯Ό λ“±λ‘ν•˜λŠ” 방법)
- μ„œλΉ„μŠ€ μ ‘κ·Ό API (μ„œλΉ„μŠ€μ˜ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλΉ„μŠ€ μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€μ Έμ˜¬ λ•Œ μ‚¬μš©ν•˜λŠ” API) 

 

 

μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬μ˜ λ‹€μ–‘ν•œ λ³€ν˜•  

- λΈŒλ¦Ώμ§€ νŒ¨ν„΄ 

: λΈŒλ¦Ώμ§€ νŒ¨ν„΄μ€ 큰 클래슀 λ˜λŠ” λ°€μ ‘ν•˜κ²Œ κ΄€λ ¨λœ ν΄λž˜μŠ€λ“€μ˜ 집합을 λ‘κ°œμ˜ κ°œλ³„ 계측 ꡬ쑰둜 λ‚˜λˆˆ ν›„ 각각 λ…λ¦½μ μœΌλ‘œ κ°œλ°œν•  수 μžˆλ„λ‘ ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.

-> 객체의 ν–₯상성을 ν–₯μƒν•˜κΈ° μœ„ν•œ νŒ¨ν„΄μœΌλ‘œ, κ°μ²΄μ—μ„œ λ™μž‘μ„ μ²˜λ¦¬ν•˜λŠ” κ΅¬ν˜„λΆ€μ™€ ν™•μž₯을 μœ„ν•œ 좔상뢀λ₯Ό λΆ„λ¦¬ν•œ νŒ¨ν„΄μ΄λ‹€. 

λΈŒλ¦¬μ§€ νŒ¨ν„΄μ€ κΈ°μ‘΄ μ‹œμŠ€ν…œμ— λΆ€μˆ˜μ μΈ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ§€μ†μ μœΌλ‘œ μΆ”κ°€ν•  λ•Œ μ‚¬μš©ν•˜λ©΄ μœ μš©ν•˜λ‹€. 

μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•΄μ„œ κΈ°μ‘΄ ν”„λ‘œκ·Έλž¨μ˜ 변경없이 ν™•μž₯ν•  수 μžˆλ‹€. 

 

 

- 의쑴 객체 μ£Όμž… ν”„λ ˆμž„μ›Œν¬ (spring) 

: μŠ€ν”„λ§μœΌλ‘œ μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬λ₯Ό 생각해보면 μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•  μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€κ³ , 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀 즉, μ„œλΉ„μŠ€ μ œκ³΅μžκ°€ μžˆλ‹€. 그리고 이λ₯Ό 등둝할 λ•ŒλŠ” @Bean λ₯Ό 톡해 μ„œλΉ„μŠ€ 제곡자λ₯Ό λ“±λ‘ν•˜κ³ , 이제 μ„œλΉ„μŠ€λ₯Ό μ ‘κ·Όν•  λ•ŒλŠ” @Autowiredλ₯Ό 톡해 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•΄μ„œ μ‚¬μš©ν•˜λ©΄ λœλ‹€. 

 

 

- ServiceLoader 

: μ„œλΉ„μŠ€ λ‘œλ”λŠ” java.util νŒ¨ν‚€μ§€ μ•ˆμ— μžˆλŠ” κ²ƒμœΌλ‘œ, μ„œλΉ„μŠ€ λ‘œλ”λŠ” 주둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€μ—μ„œ ν”ŒλŸ¬κ·ΈμΈμ„ μ œκ³΅ν•  λ•Œ μ‚¬μš©ν•˜λŠ”λ°, νŠΉμ • κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€κ°€ 있고, λ‹€μ–‘ν•œ 벀더 νšŒμ‚¬λ“€μ΄ 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 기반으둜 μžμ‹ λ“€λ§Œμ˜ ꡬ체 μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ²Œ λœλ‹€. 

λ”°λΌμ„œ μ‚¬μš©μžλŠ” μ–΄λ–€ 벀더 νšŒμ‚¬κ°€ λ§Œλ“  ꡬ체 μ„œλΉ„μŠ€μ™€ 상관 없이 곡톡 μΈν„°νŽ˜μ΄μŠ€λ§Œ κ°€μ§€κ³ μžˆμœΌλ©΄, 각 λ²€λ”νšŒμ‚¬λ§Œμ˜ μ„œλΉ„μŠ€ μž₯단점을 κ³ λ €ν•΄μ„œ μ›ν•˜λŠ” κ΅¬ν˜„μ²΄λ₯Ό κ³¨λΌμ„œ μ‚¬μš©ν•˜λ©΄ λœλ‹€. 

-> 즉 ,serviceLoader 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄, κ·Έ κ΅¬ν˜„μ²΄ jar νŒŒμΌμ„ λ°”κΏ”λΌλŠ” κ²ƒλ§ŒμœΌλ‘œ λ‚΄κ°€ μ›ν•˜λŠ” μ μ ˆν•œ κ΅¬ν˜„μ²΄λ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ°”κΏ€ 수 μžˆλ‹€. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90