๐ŸŒ Backend/๐Ÿƒ Spring

SOLID ์›์น™

DevPoong 2022. 7. 2. 13:24

2022.06.29

SOLID ์›์น™

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

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

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

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

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

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

- ๋ฌธ์ œ์ƒํ™ฉ

- MemberService ํด๋ž˜์Šค

MemberRepository m = new MemoryMemberRepository(); //๊ธฐ์กด
MemberRepository m = new JdbcMemberRepository(); //๋ณ€๊ฒฝ

(1) ๋ฌธ์ œ์ 

MemberService๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•ด์•ผ ํ•œ๋‹ค! => OCP์›์น™ X

(2) ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑฐ๋ฅผ ์Šคํ”„๋ง์—์„œ๋Š” Spring Container๊ฐ€ ๋Œ€์‹  ํ•ด์ฃผ๋ฉฐ OCP ์›์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ DI, IOC Container๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ž„.


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

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

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

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

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

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

6. ์ •๋ฆฌ

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