๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring๐Ÿ€/Spring ๊ธฐ๋ณธ๐Ÿ€๐Ÿ€

์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™(SOLID)+๊ฐ์ฒด์ง€ํ–ฅ์„ค๊ณ„์™€ ์Šคํ”„๋ง

by @ENFJ 2022. 9. 24.

์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™

solid ๋ž€ ๋ฌด์—‡์ธ๊ฐ€

 ใ„ด ํด๋ฆฐ์ฝ”๋“œ๋กœ ์œ ๋ช…ํ•œ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ์„ค๊ณ„์˜ 5๊ฐ€์ง€๋ฅผ ์ •๋ฆฌ๋ฅผ ํ–ˆ๋Š”๋ฐ 

์•„๋ž˜์™€ ๊ฐ™์ด ์•ž๊ธ€์ž๋งŒ ๋”ฐ์„œ SOLID ๋ผ๊ณ  ํ•œ๋‹ค .

 

1. SRP : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (single resposibility principle)

2. OCP : ๊ฐœ๋ฐœ -ํ์‡„ ์›์น™ (open/closed principle)

3. LSP : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ ( Liskov substitution Principle)

4. ISP : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (interface segregation principle)

5. DIP : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ ( Dependency inversion principle)

 

 


1. SRP : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (single resposibility principle)

ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผํ•œ๋‹ค.

์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ์ด๋‹ค. ๋ณ€๊ฒฝ์ด ์žˆ์„๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ์œผ๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ.

ex) UI ๋ณ€๊ฒฝ, ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์„ ๋ถ„๋ฆฌ

 

2. OCP : ๊ฐœ๋ฐœ -ํ์‡„ ์›์น™ (open/closed principle)

์ •๋ง ์ค‘์š”ํ•œ ์›์น™์ด๋‹ค. 

์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๐Ÿค”์—ฅ.. ์ด๊ฒŒ ๋ฌด์Šจ๋ง์ด์ง€?

์—ด๋Ÿฌ์žˆ์œผ๋‚˜? ๋‹ซํ˜€์žˆ์–ด์•ผํ•œ๋‹ค..?

 

๋‹คํ˜•์„ฑ์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋ณด์ž.

์—ฌ๊ธฐ์„œ ํ™•์žฅ์— ์—ด๋ ค์žˆ๊ณ  ๋ณ€๊ฒฝ์— ๋‹ซํ˜€์žˆ๋‹ค ๋ผ๋Š” ์˜๋ฏธ๋Š” ๋‹คํ˜•์„ฑ์˜ ์˜๋ฏธ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด์„œ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค...?...

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž๋™์ฐจ ์šด์ „๋ฐฉ๋ฒ• ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด ๊ฐ‘์ž๊ธฐ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์œ„์— k3 , ์•„๋ฐ˜ํ…Œ ๋“ ๊ฐ„์— ์ž๋™์ฐจ ์šด์ „์— ์žˆ์–ด ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค...?....๐Ÿ˜‘ ๊ทธ์น˜๋งŒ ์ฝ”๋“œ ์ˆ˜์ •..๋ณ€๊ฒฝ...์€ ํ•ด์•ผ๋˜์ง€ ์•Š์„๊นŒ..?

๋ถ„๋ช… ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ OCP์›์น™์„ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค.

 ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.๐Ÿ˜ฃ๐Ÿค”

<์ผ๋‹จ ๋‚˜์ค‘์— ์ด ๋ถ€๋ถ„์—๋Œ€ํ•ด ์ถ”๊ฐ€ ์„ค๋ช…ํ•œ ๊ธ€์„ ์˜ฌ๋ ค์•ผ๊ฒ ๋‹ค. ์ผ๋‹จ PASS>

 

3. LSP : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ ( Liskov substitution Principle)

 

ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—‘์…€์€ ์•ž์œผ๋กœ ๊ฐ€๋ผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์—‘์…€์„ ๋ฐŸ์œผ๋ฉด ๋’ค๋กœ๊ฐ€๊ฒŒ ๋œ๋‹ค๋ฉด..๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜์›์น™์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋œ๋‹ค.๋Š๋ฆฌ๊ฒŒ ๊ฐ€๋”๋ผ๋„ ์•ž์œผ๋กœ ๊ฐ€์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์ด๋‹ค.

 

4. ISP : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (interface segregation principle)

ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค.

 

์ž๋™์ฐจ๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ,, 

(1)์šด์ „ ์ธํ„ฐํŽ˜์ด์Šค , (2)์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค ๋กœ ๋ถ„๋ฆฌ ํ•ด๋ณด์ž

 

์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค ๋Š” ๋„ˆ๋ฌด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ๋ถ„๋ฆฌํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ๋Š” (1)์šด์ „์ž ํด๋ผ์ด์–ธํŠธ (2) ์ •๋น„์‚ฌ ํด๋ผ์ด์–ธํŠธ ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

5. DIP : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ ( Dependency inversion principle)

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค. // ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜์ด๋‹ค.

=> ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ผ๋Š” ๋œป์ด๋‹ค.

๋‹ค์‹œ ์œ„ ๊ทธ๋ฆผ์„ ๊ฐ€์ง€๊ณ  ์„ค๋ช…ํ•˜์ž๋ฉด  ์šด์ „์ž๋Š” ์ž๋™์ฐจ์˜ ์—ญํ• ์— ๋Œ€ํ•ด์„œ๋งŒ ์•Œ์•„์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์šด์ „์ž๊ฐ€ k3 , ์•„๋ฐ˜๋–ผ์— ๋Œ€ํ•ด ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

์—ฌ๊ธฐ์„œ MemberService ๋Š” MemberRepository ๋งŒ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ MemorymemberRepository ๊นŒ์ง€ ์•„๋Š”๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ MemoryMemberRepository๋ฅผ ๋”ด๊ฑธ๋กœ ๋ฐ”๊พธ๋ ค๊ณ  ํ• ๋•Œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค.

๐Ÿค” DIP ์œ„๋ฐ˜..??   ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค..๐Ÿ˜ฃ๐Ÿ˜ฃ

DIP๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” MemberService  ๊ฐ€ MemberRepository ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๋„๋ก ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•ด์•ผํ•˜๋Š”๋ฐ..

 

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€  <๋‹ค์Œ ๊ธ€์— ์ •๋ฆฌ>

 

์ •๋ฆฌ:

- ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ์€ ๋‹คํ˜•์„ฑ

- ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” ์‰ฝ๊ฒŒ ๋ถ€ํ’ˆ์„ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์—†๋‹ค.

- ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ• ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.

- ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” OCP DIP๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค. ===> ๋ญ”๊ฐ€ ๋” ํ•„์š”ํ•จ!!


๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง

์˜›๋‚ ์—๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ์œ„ํ•ด OCP(๊ฐœ๋ฐœ-ํ์‡„), DIP(์˜์กด๊ด€๊ฒŒ ์—ญ์ „)์›์น™์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด๋‹ˆ ๋„ˆ๋ฌด ํ• ์ผ์ด ๋งŽ์•˜๋‹ค.  ===> ๊ทธ๋ž˜์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ ธ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ˆœ์ˆ˜ํ•˜๊ฒŒ JAVA ๋กœ OCP,DIP ์›์น™๋“ค์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด๋ฉด ๊ฒฐ๊ตญ์—๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

(==DI ์ปจํ…Œ์ด๋„ˆ)  // 

 

์ •๋ฆฌ

1. ๋ชจ๋“ ์„ค๊ณ„์— ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ

2. ์•ž์„œ ์ •๋ฆฌํ•œ ๊ธ€์—์„œ ์ž๋™์ฐจ, ๊ณต์—ฐ์„ ๋น„์œ ๋กœ ํ–ˆ๋˜๊ฒƒ์„ ๋– ์˜ฌ๋ ค๋ณด์ž.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„๋„ ๊ณต์—ฐ์„ ์„ค๊ณ„ํ•˜๋“ฏ์ด ๋ฐฐ์—ญ๋งŒ ๋งŒ๋“ค์–ด๋‘๊ณ , ๋ฐฐ์šฐ๋Š” ์–ธ์ œ๋“ ์ง€ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š”๊ฒƒ์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์ด๋‹ค.

3. ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ์„ค๊ณ„์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ€์—ฌํ•˜์ž

 

์‹ค๋ฌด ๊ณ ๋ฏผ

-> ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ถ”์ƒํ™”๋ผ๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. // ์ถ”์ƒํ™”๊ฐ€ ๋˜๋ฉด ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ๋“ค์—ฌ๋‹ค ๋ณด์•„์•ผ ํ•จ.

-> ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๋ฉด,  ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ , ํ–ฅํ›„ ๊ผญ ํ•„์š”ํ•  ๋•Œ ๋ฆฌํŒฉํ„ฐ๋งํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋Š”๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๋‹ค.