๐Ÿ€ etc

SOLID ์›์น™

Kiwi๐Ÿ’ป 2022. 5. 19. 18:36

SOLID๋ž€?

์›์น™์€ ๊ฐ€์น˜๋ฅผ ์ง€ํ‚ค๊ธฐ์œ„ํ•ด์„œ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฐ€์น˜์—๋Š” ๋ฌด์—ˆ์ด ์žˆ์„๊นŒ?

์ฒซ๋ฒˆ์งธ๋กœ๋Š” ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ํ•˜๋ฉฐ, ์ฝ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋Š” ๊ฐ€์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‘๋ฒˆ์งธ๋กœ๋Š” ๋‹จ์ˆœํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์— ๋„์›€์ด ๋˜๊ณ , ๋ฒ„๊ทธ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์ ์–ด์ง€๋ฉฐ, ์ถ”ํ›„ ์ฝ”๋“œ์˜ ์ˆ˜์ •์— ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ์ฝ”๋“œ๋Š” ์œ ์—ฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ฒฝ์ง๋œ ์ฝ”๋“œ๋Š” ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์— ์–ธ๊ธ‰ํ•œ ์Šคํ”„ํŠธ์›จ์–ด์˜ ๊ฐ€์น˜๋“ค์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›์น™์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋•Œ ์ด๋Ÿฌํ•œ ๊ฐ€์น˜๋“ค์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ๊ฒƒ์ด SOLID์›์น™์ด๋‹ค

S: Single Responsiblity Principle (๋‹จ์ผ ์ฑ…์ž„ ์›์น™)
O: Open-Closed Principle (๊ฐœ๋ฐฉ-ํŒจ์‡„ ์›์น™)
L: Liskov Substitution Principle (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)
I: Interface Segregation Principle (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)
D: Dependency Inversion Principle (์˜์กด ์—ญ์ „ ์›์น™)

Single Responsiblity Principle (๋‹จ์ผ ์ฑ…์ž„ ์›์น™)

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋“ค์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ˆ˜์ •๊ณผ์ •์— ์žˆ์–ด์„œ ํ•˜๋‚˜์˜ ์ˆ˜์ •์ด ๋˜ ๋‹ค๋ฅธ ์ˆ˜์ •์„ ์—ฐ์‡„์ ์œผ๋กœ ์•ผ๊ธฐํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(ํด๋ž˜์Šค๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’๊ณ , ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์—). ์ด๋Š” ๊ฒฐ๊ตญ ์œ ์ง€๋ณด์ˆ˜์— ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•˜๋ฏ€๋กœ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚œ์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์‘์ง‘๋„ : ๊ด€๋ จ์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์ด ์–ผ๋งˆ๋‚˜ ์‘์ง‘ํ•ด ์žˆ๋Š”๊ฐ€
๊ฒฐํ•ฉ๋„ : ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋Š”๊ฐ€

  • ์ฝ”๋“œ ์˜ˆ์‹œ

๊ทธ๋ฆผ 1

์œ„์˜ ์˜ˆ๋ฅผ ๋ณด๋ฉด ์ฅฌ์Šค๋งŒ๋“ค๊ธฐ ๋ผ๋Š” class ๊ณผ์ผ์ค€๋น„(), ์ฅฌ์Šค๋งŒ๋“ค๊ธฐ(), ์ฅฌ์Šค๋ฅผ์ค€๋‹ค()์˜ ๋งŽ์€ ์—ญํ• ์„ ์ค‘๊ตฌ๋‚œ๋ฐฉ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ 2

1๋ฒˆ ์˜ˆ์™€ ๋น„๊ตํ•ด์„œ ๊ฐ๊ฐ์˜ ๊ณผ์ผ์ค€๋น„(), ์ฅฌ์Šค๋งŒ๋“ค๊ธฐ(), ์ฅฌ์Šค๋ฅผ์ค€๋‹ค() ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๊ฐ์ž์˜ ์—ญํ• ๋งŒํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋งŒ์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฅฌ์Šค๋งŒ๋“ค๊ธฐ์—์„œ๋Š” ์ด ํ”„๋กœํ† ์ฝœ๋“ค์„ ํ™œ์šฉํ•ด์„œ ์ƒํšจ์ž‘์šฉ๋งŒ์„ ํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋กœ ์ธํ•ด ๊ฐ๊ฐ์˜ ํ”„๋กœํ† ์ฝœ๋“ค์„ ํ™œ์šฉํ•ด์„œ ๋กœ๊ทธ์ธ์— ๊ด€ํ•œ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Open-Closed Principle (๊ฐœ๋ฐฉ-ํŒจ์‡„ ์›์น™)

ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ  ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํ™•์žฅ์„ ํ• ๋•Œ๋Š” ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํ™•์žฅํ•˜๊ณ , ๋งŒ์•ฝ ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์—ฐ์‡„์ ์ธ ์ˆ˜์ •์„ ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์ž๋Š” ๊ฒƒ์ด๋‹ค(๋ณ€๊ฒฝ์ด ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ ์ง€ํ–ฅ).

  • ์ฝ”๋“œ ์˜ˆ์‹œ

๊ทธ๋ฆผ 1

๊ทธ๋ฆผ 2

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๊ตํ†ต์ˆ˜๋‹จ์„ ๊ฐ๊ฐ enum(๊ทธ๋ฆผ 1)๊ณผ protocol(๊ทธ๋ฆผ 2)๋กœ ๊ตฌํ˜„์„ ํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ตฌ์ฒด์ ์ธ ๊ตํ†ต์ˆ˜๋‹จ์˜ ์ข…๋ฅ˜๋ฅผ case์™€ struct๋กœ ํ‘œํ˜„ํ•˜์˜€๋‹ค. ์ด ๋‘˜์€ ์ˆ˜์ •๊ณผ์ •์—์„œ ์ฐจ์ด๋ฅผ ๊ฐ€์ง„๋‹ค.

๊ทธ๋ฆผ 3

๊ทธ๋ฆผ 4

๋งŒ์•ฝ ์™ธ๋ฐœ ์ž์ „๊ฑฐ๋ผ๋Š” ๊ตํ†ต์ˆ˜๋‹จ์„ ์ถ”๊ฐ€ํ•˜๋ ค ํ•œ๋‹ค๋ฉด enumํƒ€์ž…์˜ ๊ฒฝ์šฐ๋Š” ์ „๋ฐ˜์ ์ธ ์ˆ˜์ •์„ ์š”๊ตฌํ•œ๋‹ค(๊ทธ๋ฆผ 3). ๊ทธ๋Ÿฌ๋‚˜ protocol์˜ ๊ฒฝ์šฐ ์™ธ๋ฐœ์ž์ „๊ฑฐ struct๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋˜์–ด์„œ ํ™•์žฅ๋งŒ ์‹ค์‹œํ•˜๋ฉด ๋œ๋‹ค(๊ทธ๋ฆผ 4).

Liskov Substitution Principle (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)

๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์ž‘๋™ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ž์‹ํด๋ž˜์Šค๋กœ ๋Œ€์ฒด ํ•˜์—ฌ๋„ ๋™์ž‘์ด ๊ฐ€๋Šฅ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

  • ์ฝ”๋“œ ์˜ˆ์‹œ

๊ทธ๋ฆผ 1

๊ทธ๋ฆผ 2

๊ทธ๋ฆผ 3

์ •์‚ฌ๊ฐํ˜•์€ ์ง์‚ฌ๊ฐํ˜•์ด๊ธฐ๋„ ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ง์‚ฌ๊ฐํ˜• ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •์‚ฌ๊ฐํ˜•์€ ์–‘๋ณ€์˜ ๊ธธ์ด๊ฐ€ ๋˜‘๊ฐ™๋‹ค๋Š” ์ž์‹ ๋งŒ์˜ ์„ฑ์งˆ์„ ๊ฐ€์ง€๊ธฐ ์œ„ํ•ด ์ง์‚ฌ๊ฐํ˜•์˜ ๋ฉ”์„œ๋“œ๋ฅผ override ํ•ด์ฃผ์—ˆ๊ณ , ์ด๋กœ ์ธํ•ด ์ง์‚ฌ๊ฐํ˜•์˜ ์„ฑ์งˆ์„ ๊ทธ๋Œ€๋กœ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ์ž์‹ ๋งŒ์˜ ์„ฑ์งˆ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.(ํ‡ดํ™” ํ•จ์ˆ˜)

์œ„ ์ฒ˜๋Ÿผ LSP์›์น™์„ ๊นจ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ƒ์†์„ ํ• ๋•Œ๋Š” ๋ณด๋‹ค ์‹ ์ค‘ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋‚˜, ๋ชจ๋“  ์ฝ”๋“œ์—์„œ LSP๋ฅผ ์ง€ํ‚ค๊ธฐ๋Š” ์–ด๋ ค์›€์ด ๋”ฐ๋ฅธ๋‹ค. ๊ฒฐ๊ตญ ์ ์ •์„ ์—์„œ ํƒ€ํ˜‘์„ ๋ณด๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

Interface Segregation Principle (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)

์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ทœ๋ชจ๋ฅผ ๋„ˆ๋ฌด ํฌ๊ฒŒ ๊ตฌํ˜„ํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๊ฐ์ฒด๊ฐ€ ์“ธ๋ฐ ์—†๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋“ค์ง€ ๋ง๊ณ  , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ข€๋” ์„ธ๋ถ„ํ™” ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋ผ๋Š” ๋œป์ด๋‹ค.

  • ์ฝ”๋“œ ์˜ˆ์‹œ

์ƒ์–ด์˜ ๊ฒฝ์šฐ ๋™๋ฌผ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ–ˆ์Œ์—๋„ ๋ฉ”์†Œ๋“œ ๋‘๊ฐœ๋Š” ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ 3๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค(ํ”„๋กœํ† ์ฝœ)๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ๊ฐ ํ•„์š”ํ•œ ํ”„๋กœํ† ์ฝœ๋งŒ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŠน์„ฑ ๋ณ„๋กœ ํ”„๋กœํ† ์ฝœ์„ ์ •๋ฆฌํ•  ๊ฒฝ์šฐ ๊ฐ๊ฐ ํ•„์š”ํ•œ ํ”„๋กœํ† ์ฝœ๋งŒ ์ด์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

Dependency Inversion Principle (์˜์กด ์—ญ์ „ ์›์น™)

๊ฐ์ฒด๋Š” ๊ฐ์ฒด(์ €์ˆ˜์ค€ ๋ชจ๋“ˆ)๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค(๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ - ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ™์€ ์ถ”์ƒ์  ๊ฐœ๋…
์ €์ˆ˜์ค€ ๋ชจ๋“ˆ - ๊ตฌํ˜„๋œ ๊ฐ์ฒด

์ž๋™์ฐจ๋ฅผ ๋งŒ๋“ค๋•Œ ํ•˜๋‚˜์˜ ํƒ€์ด์–ด(์ €์ˆ˜์ค€ ๋ชจ๋“ˆ) ์ข…๋ฅ˜๋งŒ ์˜์กดํ•˜์—ฌ ๋ฐ”ํ€ด๋ฅผ ๋งŒ๋“ค ๊ฒฝ์šฐ ์ดํ›„์— ๋ฐ”ํ€ด๋ฅผ ๊ต์ฒดํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ๊ธฐ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ํƒ€์ด์–ด ์ข…๋ฅ˜์™€ ํ˜ธํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ”ํ€ด(๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ)๋ฅผ ๋งŒ๋“ค์–ด ํƒ€์ด์–ด๋ฅผ ๊ทธ ๋ฐ”ํ€ด์— ์˜์กด ์‹œ์ผœ ์ฃผ๋ฉด๋œ๋‹ค.

  • ์ฝ”๋“œ ์˜ˆ์‹œ

๊ทธ๋ฆผ 1

๊ทธ๋ฆผ 2

๋งŒ์•ฝ ์ž๋™์ฐจ์— ํ•œ๊ตญํƒ€์ด์–ด์— ์˜์กดํ•˜์—ฌ ํ•œ ๊ฐ€์ง€ ํƒ€์ด์–ด๋งŒ ํ˜ธํ™˜๋˜๋„๋ก ํ•œ๋‹ค๋ฉด ๊ทธ๋ฆผ 2์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํƒ€์ด์–ด๋กœ ๊ต์ฒด๋ฅผ ํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๋ฐ”ํ€ด ํ”„๋กœํ† ์ฝœ์— ์˜์กดํ•˜์—ฌ ํƒ€์ด์–ด๋ฅผ ์ƒ์‚ฐํ•  ๊ฒฝ์šฐ ํƒ€์ด์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.