DevLog ๐Ÿ˜ถ

[Spring] ์Šคํ”„๋ง๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ƒ๊ด€๊ด€๊ณ„ - DI๋ž€ ๋ฌด์—‡์ผ๊นŒ? ๋ณธ๋ฌธ

Back-end/Spring

[Spring] ์Šคํ”„๋ง๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ƒ๊ด€๊ด€๊ณ„ - DI๋ž€ ๋ฌด์—‡์ผ๊นŒ?

dolmeng2 2023. 4. 18. 17:38

๋ ˆ๋ฒจ 2 ์ˆ˜์—… ์‹œ๊ฐ„์— ์˜์กด์„ฑ ์ฃผ์ž… ๊ด€๋ จ ๋‚ด์šฉ์„ ๋“ค์œผ๋ฉด์„œ ์กฐ๊ธˆ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

๊ทธ๋™์•ˆ ์Šคํ”„๋ง์€ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์ข‹์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ๋ง์€ ๋“ค์–ด๋ดค์ง€๋งŒ, ์ •ํ™•ํ•˜๊ฒŒ ์™œ์ธ์ง€๋Š” ์ดํ•ดํ•œ ์ ์ด ์—†์—ˆ๋‹ค.

์ •๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์กฐ๊ธˆ ๋” ๋จธ๋ฆฌ์—... ๋‹ด์•„๋‘๊ณ ์ž ํ•œ๋‹ค!

 

 


โœ”๏ธ ๊ฐ์ฒด์ง€ํ–ฅ์  ์„ค๊ณ„๊ณผ ๋””์ž์ธ ํŒจํ„ด

์šฐ์„ , ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์œผ๋กœ ๋งŽ์ด๋“ค ์–ธ๊ธ‰ํ•˜๋Š” SOLID์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์ž.

 

- SRP (๋‹จ์ผ ์ฑ…์ž„ ์›์น™): ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๋Š” ์˜ค์ง ํ•˜๋‚˜๋ฟ์ด์–ด์•ผ ํ•œ๋‹ค.

- OCP (๊ฐœ๋ฐฉ ํ์‡„ ์›์น™): ์ž์‹ ์˜ ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ์ฃผ๋ณ€์˜ ๋ณ€ํ™”์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค.

- LSP (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™): ์„œ๋ธŒ ํƒ€์ž…์€ ํ•ญ์ƒ ์ž์‹ ์˜ ๊ธฐ๋ฐ˜ ํƒ€์ž…์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

- ISP (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™): ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

- DIP (์˜์กด ์—ญ์ „ ์›์น™): ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ถ”์ƒํ™”๋œ ํด๋ž˜์Šค์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

 

Spring์—๋Š” ์ด๋Ÿฌํ•œ SOLID๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์–‘ํ•œ ๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

๊ฐ ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ๋ฉด ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋žตํ•˜๊ฒŒ๋งŒ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 

1. ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด : ํ˜ธ์ถœ๋‹นํ•˜๋Š” ์ชฝ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์˜ ์ฝ”๋“œ์— ๋Œ€์‘ํ•˜๋„๋ก, ์ค‘๊ฐ„์— ๋ณ€ํ™˜๊ธฐ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๋Š” ํŒจํ„ด

์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ๋‘ ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํŒจํ„ด์ด๋‹ค.

 

์Šคํ”„๋ง์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- JDBC ์‚ฌ์šฉ ์‹œ DB ์—ฐ๋™์„ ์œ„ํ•ด DataSource ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋•Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ๋งˆ๋‹ค dataSource ๊ตฌํ˜„์ฒด๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์—์„œ๋Š” ๊ฐ๊ฐ์— ๋Œ€ํ•ด DataSource ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž๋„๋ก ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

- JMS (Java Message Service) API ํ™œ์šฉ ์‹œ JMS Adapter๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‘˜ ์ด์ƒ์˜ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ Java ๋ฉ”์‹œ์ง• API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

2. ํ”„๋ก์‹œ ํŒจํ„ด : ์ œ์–ด ํ๋ฆ„์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ, ์ค‘๊ฐ„์— ๋Œ€๋ฆฌ์ž๋ฅผ ๋‘๋Š” ํŒจํ„ด

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ์— ๋Œ€๋ฆฌ์ž ๊ฐ์ฒด๋ฅผ ํˆฌ์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›๋Š” ๊ฒŒ ์‹ค์ œ ๊ฐ์ฒด์ธ์ง€, ๋Œ€๋ฆฌ์ž ๊ฐ์ฒด์ธ์ง€๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.

 

์ด๋•Œ, ๋Œ€๋ฆฌ์ž๋Š” ์‹ค์ œ ์„œ๋น„์Šค์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

์‹ค์ œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” Composition์˜ ํ˜•ํƒœ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ,

๋Œ€๋ฆฌ์ž๋Š” ์‹ค์ œ ์„œ๋น„์Šค์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ ๊ฐ’์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋Œ๋ ค์ค€๋‹ค, 

๋˜ํ•œ, ์‹ค์ œ ์„œ๋น„์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „ํ›„์— ๋ณ„๋„์˜ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

-> OCP์™€ DIP๋ฅผ ๋งŒ์กฑํ•˜๊ฒŒ ๋œ๋‹ค.

 

์Šคํ”„๋ง์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- AOP : ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „-ํ›„์˜ ๋กœ๊น…, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ์˜ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์‹œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

- ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ: ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒํ•˜๋Š” ๋“ฑ์˜ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

- Lazy Loading: ๋นˆ ๋“ฑ๋ก ์‹œ Lazyํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋ฉด, ์‹ค์ œ๋กœ ํ•ด๋‹น ๋นˆ์ด ์‚ฌ์šฉ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋•Œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋นˆ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์  ์ด์ „๊นŒ์ง€๋Š” ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€, ์‚ฌ์šฉ ์‹œ ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

 

3. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด: ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ๋ฐ˜ํ™˜๊ฐ’์— ๋ณ€ํ™”๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„์— ์žฅ์‹์ž๋ฅผ ๋‘๋Š” ํŒจํ„ด

ํ”„๋ก์‹œ ํŒจํ„ด๊ณผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ๋™์ผํ•˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฃผ๋Š” ๋ฐ˜ํ™˜๊ฐ’์„ ์กฐ์ž‘ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

4. ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด: ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฑ 1๊ฐœ๋งŒ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด

Connection pool, Thread Pool ๊ฐ™์€ ๊ฐ์ฒด๋“ค์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” new๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก private ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ , ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ผ ๊ฐ์ฒด (private static)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋‹จ์ผ ๊ฐ์ฒด๋Š” ๊ณต์œ  ๊ฐ์ฒด์™€ ๋‹ค๋ฆ„์—†๊ธฐ ๋•Œ๋ฌธ์—, ์†์„ฑ์„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ ๋œ๋‹ค. (์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์€ ๊ดœ์ฐฎ๋‹ค)

: ์ด๋Š” ์‹ฑ๊ธ€ํ„ด ๋นˆ์ด ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด๊ธฐ๋„ ํ•˜๋‹ค.

 

5. ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด: ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํŒจํ„ด

์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•ด๋‘๊ณ , ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์ฒด๋“ค์ด ๊ณต๋™์œผ๋กœ ํ•  ํ–‰์œ„์— ๋Œ€ํ•ด ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

ํ•ด๋‹น ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋งŒ๋“ค์–ด์„œ ํ•ด๋‹น ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ (๋ฐ˜๋“œ์‹œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•จ) ๊ฐœ๋ณ„ ํŠน์„ฑ์— ๋งž๋Š” ๋™์ž‘์„ ํ•˜๋„๋ก ํ•ด์„œ, ๊ณตํ†ต์ ์ธ ๋™์ž‘ + ๊ฐœ๋ณ„์ ์ธ ๋™์ž‘์„ ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. (DIP ๋งŒ์กฑ)

 

6. ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด: ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒจํ„ด

์Šคํ”„๋ง์—์„œ๋Š” ๋นˆ ์ƒ์„ฑ ์‹œ ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

BeanFactory์™€ ์ด๋ฅผ ์ƒ์†๋ฐ›์€ ApplicationContext๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”๋Š” ๋นˆ ํŒฉํ„ฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

 

7. ์ „๋žต ํŒจํ„ด: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „๋žต์„ ์ƒ์„ฑํ•ด, ์ „๋žต์„ ์‹คํ–‰ํ•  ์ปจํ…์ŠคํŠธ์— ์ฃผ์ž…ํ•˜๋Š” ํŒจํ„ด

์ „๋žต ํŒจํ„ด์—์„œ๋Š” ์ „๋žต ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด์™€, ์ „๋žต ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…์ŠคํŠธ, ๊ทธ๋ฆฌ๊ณ  ์ „๋žต ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ปจํ…์ŠคํŠธ์— ์ฃผ์ž…ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ „๋žต์— ๋”ฐ๋ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ์ž…ํ•˜๋Š”๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

8. ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด: ์ „๋žต์„ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•œ ์ „๋žต ํŒจํ„ด

DI์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ์ „๋žต ํŒจํ„ด๊ณผ ๋™์ผํ•˜์ง€๋งŒ ์ „๋žต์„ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

 

์Šคํ”„๋ง์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ ๋””์ž์ธ ํŒจํ„ด + SOLID ์ ์šฉ์„ ํ†ตํ•ด ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 


โœ”๏ธ IoC์™€ DI

์ด์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ '์˜์กด๋„' ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

 

์˜์กด์„ฑ์„ ๋งบ๋Š”๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ๋งํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ํ˜น์€ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ์˜์กด์„ฑ์„ ๋งบ๋Š”๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์˜ ๊ด€์ ์— ์ฃผ๋ชฉํ•ด๋ณด์ž.

 

์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

public interface Animal {
    String sayHi();
}

๋™๋ฌผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ธ์‚ฌํ•˜๋Š” ํ–‰์œ„๋ฅผ ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

public class Cat implements Animal {
    @Override
    public String sayHi() {
        return "๋ƒฅ๋ƒฅ";
    }
}
public class Dog implements Animal {
    @Override
    public String sayHi() {
        return "๋ฉ๋ฉ";
    }
}

๊ทธ๋ฆฌ๊ณ , ๊ทธ์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๋กœ ๊ณ ์–‘์ด์™€ ๊ฐ•์•„์ง€ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค.

 

public class Zoo {
    private final Animal animal;

    public Zoo() {
        this.animal = new Cat();
    }

    public void sayHello() {
        System.out.println(animal.sayHi());
    }
}

๊ทธ ๋‹ค์Œ, ๋™๋ฌผ์› ๊ฐ์ฒด์—์„œ ๋™๋ฌผ์„ ์ƒ์„ฑํ•ด์„œ ์ธ์‚ฌ๋ฅผ ํ•˜๋„๋ก ์‹œ์ผฐ๋‹ค.

์œ„์˜ ํด๋ž˜์Šค๋ฅผ ๋ณด๋ฉด, Zoo ํด๋ž˜์Šค๋Š” Cat ํด๋ž˜์Šค์˜ ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉ๊ณผ ์ƒ์„ฑ์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ํ•œ ๋ฒˆ์— ํ•œ๋‹ค๋ฉด ๋ฌด์Šจ ์ผ์ด ์žˆ์„๊นŒ?

 

1. ๊ฒฐํ•ฉ๋„๊ฐ€ ๊ฐ•ํ•ด ์„œ๋กœ์˜ ๋ณ€ํ™”์— ๋ฏผ๊ฐํ•ด์ง„๋‹ค (OCP ์œ„๋ฐ˜)

๋งŒ์•ฝ Cat์˜ sayHi๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์–ด์ง„๋‹ค๋ฉด?

ํ˜น์€, sayHi๋ผ๋Š” ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ํ˜•์ด String ๋Œ€์‹  void๊ฐ€ ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

= Cat์˜ ๋ณ€ํ™”๊ฐ€ Zoo๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋˜๋ฉด์„œ ๋ณ€๊ฒฝ์— ์—ด๋ ค์žˆ๊ฒŒ ๋œ๋‹ค. (+ ์œ ์ง€-๋ณด์ˆ˜ ๊ด€์ ์—์„œ๋„ ์ข‹์ง€ ์•Š๋‹ค)

์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ - SOLID์—์„œ OCP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

2. SRP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค

Zoo๋Š” Cat์— ๋Œ€ํ•ด ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„ ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ฑ…์ž„๊นŒ์ง€, ์ด 2๊ฐ€์ง€์˜ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค.

์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ - SOLID์—์„œ SRP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 


 

๐ŸŒฑ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ฃผ๊ธฐ

Zoo ํด๋ž˜์Šค์—์„œ Animal์— ๋Œ€ํ•ด์„œ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

public class Zoo {
    private final Animal animal;

    public Zoo(final Animal animal) {
        this.animal = animal;
    }

    public void sayHello() {
        System.out.println(animal.sayHi());
    }
}

์™ธ๋ถ€์—์„œ Animal์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก, ์ฃผ์ž…ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

public class Driver {
    public static void main(String[] args) {
        Animal cat = new Cat();
        Zoo zoo = new Zoo(cat);

        System.out.println(zoo.sayHi());
    }
}

์˜์กด์„ฑ ์ฃผ์ž…์„ ์ ์šฉํ•˜๋ฉด, Zoo๋Š” ๊ทธ๋ƒฅ Animal ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

๋งŒ์•ฝ Cat์ด ์ œ๊ฑฐ๋˜๊ณ , Duck์ด ๋“ค์–ด์˜ค๋”๋ผ๋„ Zoo์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค. 

์ด๋ ‡๊ฒŒ ์™ธ๋ถ€์˜ ๋ณ€ํ™”๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์ง€๋งŒ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ์ƒ๊ด€ ์—†์–ด์„œ ํ™•์žฅ์— ์—ด๋ ค์žˆ๊ฒŒ ๋œ๋‹ค.

๊ทธ์ €, Animal์—์„œ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋””์ž์ธ ํŒจํ„ด์˜ ๊ด€์ ์—์„œ ๋ณด์•˜์„ ๋•Œ๋„ ์ „๋žต ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ „๋žต์€ Animal์„ ๊ตฌํ˜„ํ•œ Cat, Dog์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ณ , ์ปจํ…์ŠคํŠธ๋Š” Cat์˜ sayHi๊ฐ€ ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” Driver์˜ main ๋ฉ”์„œ๋“œ๊ฐ€ ๋œ๋‹ค.

 


๐ŸŒฑ setter๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๊ธฐ

๋™๋ฌผ์›์— ์กด์žฌํ•˜๋Š” ๋™๋ฌผ์„ ๊ต์ฒด(ใ… ใ… )ํ•œ๋‹ค๋Š” ๋Š๋‚Œ์œผ๋กœ, ์ˆ˜์ •์ž๋ฅผ ํ†ตํ•ด์„œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

public class Zoo {
    private Animal animal;

    public void setAnimal(final Animal animal) {
        this.animal = animal;
    }

    public void sayHello() {
        System.out.println(animal.sayHi());
    }
}
public class Driver {
    public static void main(String[] args) {
        Animal cat = new Cat();

        Zoo zoo = new Zoo();
        zoo.setAnimal(cat);

        zoo.sayHello();
    }
}

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


 

๐ŸŒฑ Spring - @Autowired ํ™œ์šฉํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ฃผ์ž…์„ ์™„์ „ํžˆ ์™ธ๋ถ€์—๊ฒŒ ๋„˜๊ธฐ๊ณ  ์‹ถ๋‹ค. ์Šคํ”„๋ง์˜ IoC - ์ œ์–ด์˜ ์—ญ์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

@Component
public class Cat implements Animal {
    @Override
    public String sayHi() {
        return "๋ƒฅ๋ƒฅ";
    }
}
@Component
@Primary
public class Dog implements Animal {
    @Override
    public String sayHi() {
        return "๋ฉ๋ฉ";
    }
}

@Autowired๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ผํ•œ ํƒ€์ž…์˜ ๊ฒฝ์šฐ @Qualifier๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์„ ์ฃผ๊ฑฐ๋‚˜, @Primary๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Dog์— Primary๋ฅผ ๊ฑธ์—ˆ๋‹ค.

 

@Component
public class Zoo {
    private final Animal animal;

    @Autowired
    public Zoo(final Animal animal) {
        this.animal = animal;
    }

    public String sayHello() {
        return animal.sayHi();
    }
}

์ด๋ ‡๊ฒŒ ๋˜๋ฉด Zoo์— ๋Œ€ํ•ด์„œ ์„ ์–ธํ•  ๋•Œ Animal ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์ž๋™์œผ๋กœ Dog ํƒ€์ž…์ด ์ฃผ์ž…๋  ๊ฒƒ์ด๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค๋ณด์ž.

@SpringBootTest
class ZooTest {

    @Autowired
    private Zoo zoo;

    @Test
    void test() {
        String expected = zoo.sayHello();
        assertThat(expected)
                .isEqualTo("๋ฉ๋ฉ");
    }
}

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ, ์„ฑ๊ณต์œผ๋กœ ๋‚˜์˜จ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐ ์ฃผ์ž… ์ž์ฒด๋ฅผ ์Šคํ”„๋ง์—๊ฒŒ ์ฑ…์ž„์„ ๋„˜๊ฒจ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค!

 

๋˜ํ•œ, ์˜์กด ๊ด€๊ณ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ ๋“ฑ์„ ์„œ๋ฒ„ ๊ตฌ๋™ ์‹œ์ ์— ๋ง‰์•„์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๊ธฐ์ˆ ์  ์žฅ์ ์ด๊ธฐ๋„ ํ•˜๋‹ค :D

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค์–‘ํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ํŠน์ง•์„ ์ •๋ฆฌํ•˜๋ฉฐ ๊ธ€์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

1. ์ƒ์„ฑ์ž ์ฃผ์ž…
- ํ˜ธ์ถœ ์‹œ์ ์— 1ํšŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๋ฉฐ, ์ƒ์„ฑ์ž๊ฐ€ ํ•œ ๊ฐœ๋ผ๋ฉด @Autowired ์ƒ๋žต ๊ฐ€๋Šฅ

2. ์ˆ˜์ •์ž ์ฃผ์ž… (setter)
- ์ฃผ์ž… ๋ฐ›๋Š” ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ 

3. ํ•„๋“œ ์ฃผ์ž…
- ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค. (DI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค)

 

๐ŸŒฑ ์ƒ์„ฑ์ž ์ฃผ์ž…์˜ ์žฅ์ 

1. ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ (final๋กœ ์„ ์–ธ - ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์— ์ดˆ๊ธฐํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์—†์•ค๋‹ค)
+ ๋กฌ๋ณต์„ ์‚ฌ์šฉํ•˜๋ฉด @RequiredArgsConsturctor๋ฅผ ํ†ตํ•ด ๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
2. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์šฉ์ดํ•จ (์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ mock ๊ฐ์ฒด ์ฃผ์ž…์ด ์šฉ์ดํ•จ)

์‚ฌ์‹ค ๋ถˆ๋ณ€์„ฑ์ด ๊ฐ€์žฅ ํฐ ๊ฒƒ ๊ฐ™๋‹ค!

2.6 ์ดํ•˜ ๋ฒ„์ „์—์„œ๋Š” ํ•„๋“œ ์ฃผ์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ƒ์„ฑ์ž ์ฃผ์ž…์—์„œ๋Š” ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ์„œ๋ฒ„ ๊ตฌ๋™ ์‹œ ๋ฐœ์ƒํ–ˆ์—ˆ๋Š”๋ฐ, 2.6๋ถ€ํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ง‰์•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค์ง ์ƒ์„ฑ์ž ์ฃผ์ž…๋งŒ์˜ ์žฅ์ ์ด๋ผ๊ณ  ๋ณด๊ธฐ๋Š” ์–ด๋ ค์›Œ์กŒ๋‹ค. (๊ธฐ์กด์—๋Š” ํ•„๋“œ ์ฃผ์ž…์—์„œ๋Š” ํ˜ธ์ถœ์ด ๋˜์–ด์•ผ๋งŒ ์žก์„ ์ˆ˜ ์žˆ์—ˆ์Œ)

Comments