ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๊น€์˜ํ•œ๋‹˜์˜ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ๊ธฐ๋ณธํŽธ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

SOLID

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

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

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

Single responsibility principle

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

-> ๋ฒ”์œ„๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์ด ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ ๋ฌ˜๋ฏธ, ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์˜ ํ•˜๋‚˜์˜ ๋ถ€๋ถ„๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ์„ค๊ณ„๋ผ๋ฉด SRP๋ฅผ ์ž˜ ์ง€ํ‚จ ๊ฒƒ!

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

Open/closed principle

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

๋ฌธ์ œ์ 

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

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

Liskov substitution principle

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

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

Interface segregation principle

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

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

Dependency inversion principle

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” "์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค." ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.
  • ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•ด์„œ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ผ๋Š” ๋œป!
  • ex) ์—ญํ• (Role)์— ์˜์กดํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋ง(๋ฐฐ์šฐ์™€ ๋ฐฐ์—ญ, ๋ฐฐ์šฐ๊ฐ€ ๋ฐฐ๊ปด๋„ ๋ฐฐ์—ญ์€ ๋ณ€ํ•˜์ง€ ์•Š์Œ)๊ณผ ๊ฐ™๋‹ค.
  • ๊ฐ์ฒด ์„ธ์ƒ๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ. ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ์ด ์•„์ฃผ ์–ด๋ ค์›Œ์ง!!!!

์•„๋ž˜ ์ฝ”๋“œ์˜ MemberService๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€๋งŒ, ๊ตฌํ˜„ ํด๋ž˜์Šค๋„ ๋™์‹œ์— ์˜์กดํ•œ๋‹ค.

  • ์˜์กดํ•œ๋‹ค = ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๊ทธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ DIP ์œ„๋ฐ˜!
  • MemberService ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒํ•˜๊ณ  ์žˆ์Œ...
@Service
class MemberService {
    MemberRepository repository = new JpaMemberRepository();
}

์ •๋ฆฌ

  • ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ์€ ๋‹คํ˜•์„ฑ
  • ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋ผ.
  • ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๋‹ค.
  • ์ด์ƒ์ ์œผ๋กœ ๋ชจ๋“  ์„ค๊ณ„์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ€์—ฌํ•˜์ž.
  • ํ•˜์ง€๋งŒ, ๋‹คํ˜•์„ฑ๋งŒ์œผ๋กœ๋Š” ์‰ฝ๊ฒŒ ๋ถ€ํ’ˆ์„ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์—†๋‹ค..
  • ๋‹คํ˜•์„ฑ๋งŒ์œผ๋กœ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ๋‹คํ˜•์„ฑ๋งŒ์œผ๋กœ๋Š” OCP, DIP๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์—†๊ณ , ๋ญ”๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค
  • ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์Šคํ”„๋ง!! ์Šคํ”„๋ง์€ DI๋ฅผ ํ†ตํ•ด ๋‹คํ˜•์„ฑ + OCP, DIP๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ง€์›ํ•œ๋‹ค.
๋ฐ˜์‘ํ˜•

'BackEnd' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์š”์ฆ˜ ๋– ์˜ค๋ฅด๋Š” gRPC ํ†บ์•„๋ณด๊ธฐ  (2) 2022.12.04
Nginx 403 (13 Permission denied) ํ•ด๊ฒฐํ•˜๊ธฐ  (0) 2021.10.30
JWT  (0) 2021.06.26
HTTP ๋ฉ”์„œ๋“œ  (0) 2021.05.28
HTTP ์ƒํƒœ์ฝ”๋“œ  (0) 2021.05.22