๐Ÿ’ป Software Engineering/Java Spring

Spring 101 - #3 ๊ฐ์ฒด์ง€ํ–ฅ์„ค๊ณ„ 5์›์น™ SOLID

MayKim51 2020. 7. 23. 12:34

 

ํฌ์ŠคํŠธ ์ œ๋ชฉ ๊ทธ๋Œ€๋กœ Spring ๊ธฐ์ดˆ๋ฅผ ๋‹ค์น˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” TIL ์„ฑ๊ฒฉ์˜ ์Šคํ”„๋ง ๊ธฐ์ดˆ ์š”์•ฝ ์‹œ๋ฆฌ์ฆˆ์ž…๋‹ˆ๋‹ค. 
Java๋Š” ์•„๋Š”๋ฐ Spring์€ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋Š” ์ดˆ๋ณด์ž๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋„๋ก ์š”์ ๋งŒ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Spring 101 ์‹œ๋ฆฌ์ฆˆ

Spring 101 - #1 ์ž๋ฐ”์™€ ์ ˆ์ฐจ์ /๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ
Spring 101 - #2 ์ž๋ฐ” ํ‚ค์›Œ๋“œ์™€ OOP ํŠน์„ฑ 4๊ฐ€์ง€
Spring 101 - #3 ๊ฐ์ฒด์ง€ํ–ฅ์„ค๊ณ„ 5์›์น™ SOLID
Spring 101 - #4 ์Šคํ”„๋ง ๋””์ž์ธ ํŒจํ„ด Spring Design Pattern

 


 

#SOLID

Single Responsibility Principal 
๋‹จ์ผ์ฑ…์ž„์›์น™
์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์˜ค์ง ํ•˜๋‚˜๋‹ค ๋ชจ๋ธ ์ถ”์ƒํ™”๋•Œ ๊ณตํ†ต์ ์„ ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ธฐ
Open Close Principal
๊ฐœ๋ฐฉํ์‡„์›์น™
์ž์‹ ์˜ ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ  ๋ณ€ํ™”์—๋Š” ๋‹ซํ˜€์žˆ๋‹ค ๊ณตํ†ต์  -> ์ธํ„ฐํŽ˜์ด์Šค
Liskov Substitution Principal
๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™
์„œ๋ธŒ ํƒ€์ž…์€ ์–ธ์ œ๋‚˜ ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ๊ต์ฒด ๊ฐ€๋Šฅ  
Interface Segregation Principal
์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™
ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” method์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค ํ’์„ฑํ•œ ์ƒ์œ„ํด๋ž˜์Šค + ์ถ”์ƒ ๋ฉ”์†Œ๋“œ
Dependency Introversion Principal
์˜์กด ์—ญ์ „ ์›์น™ 
์ž์‹ ๋ณด๋‹ค ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค ์ƒ์œ„ ํด๋ž˜์Šค
์ธํ„ฐํŽ˜์ด์Šค
์ถ”์ƒ ํด๋ž˜์Šค

 

#๋ชฉ์ 

  • High Cohesion ๋†’์€ ์‘์ง‘๋„ & Loose Coupling ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„
  • OOP 4๋Œ€ ํŠน์„ฑ ๊ธฐ๋ฐ˜, ๋””์ž์ธ ํŒจํ„ด์˜ ๋ผˆ๋Œ€, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ทผ๊ฐ„

 

#SRP ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ - ๋ชจ๋ธ ์ถ”์ƒํ™”์™€ ๊ฐ€์žฅ ๊ด€๋ จ์ด ๊นŠ๋‹ค Encapsulation

  • ๋‹ค์–‘ํ•œ ์—ญํ• ์˜ ๊ณตํ†ต์ ์ด ๋งŽ๋‹ค -> ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ๊ณตํ†ต์ ์„ ๋ฌถ๊ณ  ๊ฐ๊ฐ ์ƒ์†ํ•ด์„œ ๊ณตํ†ต์ด ์•„๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•œ๋‹ค
    • (์‚ฌ๋žŒ-> ๋‚จ์ž/์—ฌ์ž ; ๊ฐ•์•„์ง€ -> ์ˆ˜์ปท/์•”์ปท)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๊ทœํ™” ๊ณผ์ •๋„ ๋‹จ์ผ์ฑ…์ž„ ์›์น™
  • if ๋ฌธ ๋‚จ๋ฐœ -> ๋‹จ์ผ์ฑ…์ž„์›์น™์„ ์ง€ํ‚ค์ง€ ์•Š์€ ๊ฒฝ์šฐ์ผ ๊ฐ€๋Šฅ์„ฑ

 

#OCP ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™ 

  • ์˜ˆ: JDBC ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์˜ค๋ผํด, MySQL, MS-SQL
  • ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ณตํ†ต์ ์„ ๋ฌถ์–ด์„œ ๊ตฌ๋งค ํ–‰์œ„์—๋Š” ๋‹ซํ˜€์žˆ๋˜ ์ง์› ๊ด€๋ฆฌ์—๋Š” ๊ฐœ๋ฐฉ๋œ ์˜ˆ์‹œ

ํ˜„์‹ค ์„ธ๊ณ„์˜ ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™ ์‚ฌ๋ก€

 

#LSP ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

ํ•˜์œ„ ํด๋ž˜์Šค is a kind of ์ƒ์œ„ํด๋ž˜์Šค
๊ตฌํ˜„ ํด๋ž˜์Šค is able to ์ธํ„ฐํŽ˜์ด์Šค

 

#ISP ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

  • ๋นˆ์•ฝํ•œ ์ƒ์œ„ ํด๋ž˜์Šค ๋ณด๋‹ค๋Š” ํ’์„ฑํ•œ ์ƒ์œ„ ํด๋ž˜์Šค + ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ข‹๋‹ค
  • ์ธํ„ฐํŽ˜์ด์Šค ์ตœ์†Œ์ฃผ์˜ ์›์น™
  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค (๋‚จ์ž๋ฅผ ๋‚จ์ž์นœ๊ตฌ/์•„๋“ค/์†Œ๋Œ€์›/์ง์› ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ)

 

#DIP ์˜์กด ์—ญ์ „ ์›์น™

  • ์—ญ์ „๋œ  ์˜์กด์€ ์ƒ์œ„ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์˜์กดํ•œ๋‹ค (๊ณ ์ฐจ์›-์ €์ฐจ์› / ์ถ”์ƒํ™”-๊ตฌ์ฒดํ™”)
  • ์ž์‹ ๋ณด๋‹ค ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ƒ์œ„ ํด๋ž˜์Šค์— ๋‘”๋‹ค
    • ๊ณ ์ฐจ์› ๋ชจ๋“ˆ์€ ์ €์ฐจ์› ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋‘ ๋ชจ๋“ˆ ๋ชจ๋‘ ๋‹ค๋ฅธ ์ถ”์ƒํ™”๋œ ๊ฒƒ์— ์˜์กดํ•œ๋‹ค.
    • ์ถ”์ƒํ™”๋œ ๊ฒƒ์€ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์ด ์ถ”์ƒํ™” ๋œ ๊ฒƒ์— ์˜์กดํ•œ๋‹ค.
    • ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” concrete ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

์˜์กด ์—ญ์ „ ์›์น™ ์ ์šฉ ํ›„

 

#์ถ”์ฒœ ์ฑ…

  • Clean Software, by Robert C Martin 
  • ๊ฐ์ฒด ์ง€ํ–ฅ SW ์„ค๊ณ„์˜ ์›์น™ - ZDnet ๊ธฐ์‚ฌ
  • Head First Design Pattern
  • ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1
  • ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๋ž€ ๋ฌด์—‡์ธ๊ฐ€?  (์ธ์‚ฌ์ดํŠธ, 2011)
  • ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„ (์œ„ํ‚ค๋ถ์Šค, 2011)

 

 

 

#์ฐธ๊ณ  ๋ฆฌ์†Œ์Šค

์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด, ๊น€์ข…๋ฏผ, ์œ„ํ‚ค๋ถ์Šค