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

2025. 12. 10. 23:42ใ†์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

๋ฐ˜์‘ํ˜•

 

 

 

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

  • SRP: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(single responsibility 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 ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒ
    • ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
      • ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋‚˜?
      • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค. → Spring Container์˜ ์—ญํ• (DI)
public class MemberService { 
	private MemberRepository memberRepository = new MemoryMemberRepository(); 
} 

public class MemberService { 
	// private MemberRepository memberRepository = new MemoryMemberRepository(); 
    private MemberRepository memberRepository = new JdbcMemberRepository(); 
}

 

 

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

Liskov substitution principle

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

 

 

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

Interface segregation principle

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

 

 

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

Dependency inversion principle

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” “์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.” ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.
  • ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ, ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ผ๋Š” ๋œป
  • ์•ž์—์„œ ์ด์•ผ๊ธฐํ•œ ์—ญํ• (Role)์— ์˜์กดํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๊ฐ์ฒด ์„ธ์ƒ๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค! ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ์ด ์•„์ฃผ ์–ด๋ ค์›Œ์ง„๋‹ค.
  • ํ•˜๋‹จ์˜ MemberService๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€๋งŒ, ๊ตฌํ˜„ ํด๋ž˜์Šค๋„ ๋™์‹œ์— ์˜์กดํ•œ๋‹ค.
    • MemberService ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒ
    • MemberRepository m = new MemoryMemberRepository();
    • DIP ์œ„๋ฐ˜
public class MemberService { 
	private MemberRepository memberRepository = new MemoryMemberRepository(); 
} 

public class MemberService { 
	// private MemberRepository memberRepository = new MemoryMemberRepository(); 
    private MemberRepository memberRepository = new JdbcMemberRepository(); 
}

 

 

์ฆ‰!

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

 

์Šคํ”„๋ง ์ด์•ผ๊ธฐ์— ์™œ ๊ฐ์ฒด ์ง€ํ–ฅ์ด ๊ณ„์† ๋‚˜์˜ค๋Š”๊ฐ€?

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

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

 

์ •๋ฆฌ

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