[Spring Boot] [3] [๐Ÿ“ŒSOLID ์›์น™] 1. ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง (2)

์œค๊ฒฝยท2021๋…„ 8์›” 13์ผ
1

Spring Boot

๋ชฉ๋ก ๋ณด๊ธฐ
19/79
post-thumbnail

[Spring Boot] [3] 1. ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง (1)


4๏ธโƒฃ ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™(SOLID)

โญ๏ธ ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™(SOLID)

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ผ ๋ฉด์ ‘์—์„œ๋„ ๋งŽ์ด ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ!

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

  • SRP: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(single reponsibility principle)
  • OCP: ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(Open/closed principle)
  • LSP: ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™(Liskov substitution principle)
  • ISP: ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(Interface segregation principle)
  • DIP: ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™(Dependency inversion principle)

SRP ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

: Single responsibility principle

  • ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด๋ผ๋Š” ๊ฒƒ์€ ๋ชจํ˜ธํ•˜๋‹ค.
    • ๋ฌธ๋งฅ๊ณผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.
    • ํด ์ˆ˜๋„ ์žˆ๊ณ , ์ž‘์„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ์ด๋‹ค. ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ์œผ๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ์ด๋‹ค.
  • ์˜ˆ) UI ๋ณ€๊ฒฝ, ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์„ ๋ถ„๋ฆฌ

โญ๏ธ OCP ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™

: Open/closed principle

  • ์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • โžก๏ธ ๋‹คํ˜•์„ฑ ํ™œ์šฉ
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„
  • ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

OCP ๊ฐœ๋ฐฉ-ํŽ˜์‡„ ์›์น™ _๋ฌธ์ œ์ 

  • MemberService ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒ
    • MemberRepository m = new MemoryMemberRepository(); // ๊ธฐ์กด ์ฝ”๋“œ
    • MemberRepository m = new JdbcMemberRepository(); // ๋ณ€๊ฒฝ ์ฝ”๋“œ
  • ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค!
  • ๋ถ„๋ช… ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ OCP ์›์น™์„ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค.
  • ๐Ÿค” ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ?
  • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

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

: Liskov substitution principle

  • ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋‹คํ˜•์„ฑ์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ทœ์•ฝ์„ ๋‹ค ์ง€์ผœ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ, ๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ ํ•œ ์›์น™, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋Š” ๋ฏฟ๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์ด ์›์น™์ด ํ•„์š”ํ•˜๋‹ค.
  • ๋‹จ์ˆœํžˆ ์ปดํŒŒ์ผ์— ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ๋Š” ์ด์•ผ๊ธฐ
  • ์˜ˆ) ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—‘์…€์€ ์•ž์œผ๋กœ ๊ฐ€๋ผ๋Š” ๊ธฐ๋Šฅ, ๋’ค๋กœ ๊ฐ€๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด LSP ์œ„๋ฐ˜, ๋Š๋ฆฌ ๋”๋ผ๋„ ์•ž์œผ๋กœ ๊ฐ€์•ผํ•จ (๋ฌผ๋ก  ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋„ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง„ ์•Š๊ฒ ์ง€๋งŒ! ๊ทธ๋ž˜๋„ ์•ž์œผ๋กœ ๊ฐ€๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ง€์ผœ์•ผ ํ•จ.)

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

: Interface segregation principle

  • ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค.
    (์ ๋‹นํ•œ ํฌ๊ธฐ๋กœ ์ž˜ ์ชผ๊ฐœ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ. ๐Ÿ™ƒ)
  • ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค -> ์šด์ „ ์ธํ„ฐํŽ˜์ด์Šค, ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌ
  • ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ -> ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ, ์ •๋น„์‚ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ„๋ฆฌ
  • ๋ถ„๋ฆฌํ•˜๋ฉด ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด๊ฐ€ ๋ณ€ํ•ด๋„ ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ , ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

โญ๏ธ DIP ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™

: Dependency inversion principle

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” โ€œ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.โ€ ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™ ์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ - ํ•˜๋‚˜๋‹ค.
  • ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•ด์„œ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ผ๋Š” ๋œป
  • ์•ž์—์„œ ์ด์•ผ๊ธฐํ•œ โ€ผ๏ธ ์—ญํ• (Role)์— ์˜์กดํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค(๋กœ๋ฏธ์˜ค๋ฅผ ๋งก์€ ์›๋นˆ์ด ์ค„๋ฆฌ์—ฃ์„ ๋งก์€ ๊น€ํƒœํฌ๋ž‘๋งŒ ์—ฐ์Šต์„ ํ•˜๋ฉด ์†กํ˜œ๊ต๋กœ ๊ต์ฒด๋˜์—ˆ์„ ๋•Œ ๊ณต์—ฐ์„ ํ•  ์ˆ˜ ์—†์Œ. ์ฆ‰ ๋กœ๋ฏธ์˜ค๋Š” ์ค„๋ฆฌ์—ฃ์ด ๋ˆ„๊ตฌ๋“  ์—ญํ• ์—๋งŒ ์˜์กดํ•˜์—ฌ์•ผ ํ•จ.). ๊ฐ์ฒด ์„ธ์ƒ๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค! ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ์ด ์•„์ฃผ ์–ด๋ ค์›Œ์ง„๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ OCP์—์„œ ์„ค๋ช…ํ•œ MemberService๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€๋งŒ, ๊ตฌํ˜„ ํด๋ž˜์Šค๋„ ๋™์‹œ์— ์˜์กดํ•œ๋‹ค.
  • MemberService ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒ
    - MemberRepository m = new MemoryMemberRepository();
  • โžก๏ธ DIP ์œ„๋ฐ˜

์ •๋ฆฌ

  • ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ์€ ๋‹คํ˜•์„ฑ
  • ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” ์‰ฝ๊ฒŒ ๋ถ€ํ’ˆ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” OCP, DIP๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค.
  • ๐Ÿ˜ง ๊ฒฐ๋ก : ๋ญ”๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค !!

5๏ธโƒฃ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง

๐Ÿ˜Ÿ: ์Šคํ”„๋ง ์ด์•ผ๊ธด๋ฐ ์™œ ๊ฐ์ฒด ์ง€ํ–ฅ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜์‹œ์ฃ ?

  • ์Šคํ”„๋ง์€ ๋‹ค์Œ ๊ธฐ์ˆ ๋กœ ๋‹คํ˜•์„ฑ + OCP, DIP๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ง€์›
    - DI(Dependency Injection): ์˜์กด๊ด€๊ณ„, ์˜์กด์„ฑ ์ฃผ์ž…
    - DI ์ปจํ…Œ์ด๋„ˆ ์ œ๊ณต
  • ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด! ๊ธฐ๋Šฅ ํ™•์žฅ
  • ์‰ฝ๊ฒŒ ๋ถ€ํ’ˆ ๊ต์ฒดํ•˜๋“ฏ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

์Šคํ”„๋ง์ด ์—†๋˜ ์‹œ์ ˆ์—”,,?

  • ์˜›๋‚  ์–ด๋–ค ๊ฐœ๋ฐœ์ž๊ฐ€ ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด OCP, DIP ์›์น™์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ˆ ํ•  ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค. (๋ฐฐ๐Ÿ›ณ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ํฌ๋‹ค!) ๊ทธ๋ž˜์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ ธ๋‹ค.
  • ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ž๋ฐ”๋กœ OCP, DIP ์›์น™๋“ค์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด๋ฉด, ๊ฒฐ๊ตญ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. (๋” ์ •ํ™•ํžˆ๋Š” DI ์ปจํ…Œ์ด๋„ˆ)
  • DI ๊ฐœ๋…์€ ๋ง๋กœ ์„ค๋ช…์ด ์ž˜ ์•ˆ๋˜๋ฏ€๋กœ ์ฝ”๋“œ๋กœ!!

โžก๏ธ ์ด์ œ ์™œ ์Šคํ”„๋ง์ด ๋งŒ๋“ค์–ด์กŒ๋Š”๊ฐ€ ์ฝ”๋“œ๋กœ ์ดํ•ดํ•ด๋ณด์ž.

์ •๋ฆฌ

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

๐Ÿ“Œ (์‹ค๋ฌด ๊ณ ๋ฏผ)

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

ํ™”์ดํŒ… !! ( ยฐฬฅฬฅฬฅฬฅฬฅฬฅฬฅฬฅโ—กอยฐฬฅฬฅฬฅฬฅฬฅฬฅฬฅฬฅ)

profile
๊ฐœ๋ฐœ ๋ฐ”๋ณด ์ด์‚ฌ ์ค‘

0๊ฐœ์˜ ๋Œ“๊ธ€