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

2021. 9. 11. 08:00ใ†Back-End ์ž‘์—…์‹ค/Spring Framework

728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆํ•˜๋ž‘ ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ Spring์˜ SOLID์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ ํ•ด ๋ณด๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

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




 

๐Ÿ“‹ ๋ชฉ์ฐจ


01. [Spring] ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ
02. [Spring] ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ (SOLID)
03. 
[Spring] ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง   
04. [Spring] OCP์™€ DIP ๊ณ ๋ คํ•˜๊ธฐ
05. [Spring] ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ
06. 
[Spring] AppConfig ๋ฆฌํŒฉํ„ฐ๋ง    
07. [Spring] Ioc, DI Container  
08. [Spring] ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ  
09. [Spring] ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ  
10. [Spring] Component Scan And Auto wired Start
11. 
[Spring] ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•    
12. [Spring] Bean Life Cycle Call Back
13. 
[Spring] Bean Scope

 

 

 


 

 

 

๐Ÿ“Œ SOLID๋ž€?


    ๐Ÿ“Clean Code๋กœ ์œ ๋ช…ํ•œ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™์„ ์ œ์‹œ

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

 

 

 

         ๐Ÿ‘‰ SRP (Single Responsibility Principle) : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

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

 

๋ฐ˜์‘ํ˜•

 

         ๐Ÿ‘‰ OCP (Open/Closed Principle) : ๊ฐœ๋ฐฉ - ํ์‡„ ์›์น™ (๋งค์šฐ ์ค‘์š”)

  1. Software ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜, ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    [Spring] ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ์— ์ž‘์„ฑํ•ด ๋‘” ์ž๋™์ฐจ๊ฐ€ K3์—์„œ ํ…Œ์Šฌ๋ผ๋กœ ์šด์ „์ž๊ฐ€ ์ฐจ๋ฅผ ์ƒˆ๋กœ ์‚ฌ๋”๋ผ๋„ ์šด์ „์ž๋Š” ๊ทธ๋ƒฅ ์šด์ „ํ•  ์ˆ˜ ์žˆ๋‹ค. 
  2. ํ™•์žฅ์„ ํ•˜๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ์ˆ˜๊ฐ€ ์žˆ์„๊นŒ?
  3. ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉ
  4. Interface๋ฅผ ๊ตฌํ˜„ํ•œ ์ƒˆ๋กœ์šด Class๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„
  5. ์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ๋กœ ์ƒ๊ฐ. ์ฆ‰, Interface Code๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

public class MemberService {
	private MemberRepository memberRepository = new MemoryMemberRepository();
} // Class ๋






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

 

๋ฌธ์ œ์ 

  1. MemberService Client๊ฐ€ ๊ตฌํ˜„ Class๋ฅผ ์ง์ ‘ ์„ ํƒ
    • MemberRepository m = new MemberMemberRepository();   => ๊ธฐ์กด ์ฝ”๋“œ
    • MemberRepository m = new JdbcMemberRepository();   => ๋ณ€๊ฒฝ ์ฝ”๋“œ
  2. ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด Client Code๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.
  3. ๋ถ„๋ช… ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, OCP ์›์น™์„ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
    • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”
      ์ด๊ฒƒ์„ Spring Container๊ฐ€ DI๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ

 

 

 

         ๐Ÿ‘‰ LSP (Liskov Substitution Principle) : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

์–ด๋–ค Interface์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ์„ ๋•Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋™์ฐจ Interface๋ฅผ ๊ตฌํ˜„ํ•œ ์•„๋ฐ˜๋–ผ์— ์•…์…€ ๊ธฐ๋Šฅ์ด ์•ž์œผ๋กœ ๊ฐ„๋‹ค์ด์ง€๋งŒ, ๋’ค๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋ฌธ์ œ๋Š” ์—†์œผ๋‚˜, ์•…์…€์„ ๋ฐŸ์œผ๋ฉด ์•ž์œผ๋กœ ๊ฐ„๋‹ค๊ฐ€ ๊ทœ์•ฝ์ด๋ผ๋ฉด ์ด ๊ทœ์•ฝ์„ ๋ฌด์กฐ๊ฑด ์ง€์ผœ์•ผ ๋œ๋‹ค์— ๋Œ€ํ•œ ๊ฒƒ์ด์—์š”!

 

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

 

 

 

         ๐Ÿ‘‰ ISP (Interface Segregation Principle) : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

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

 

 

 

 

         ๐Ÿ‘‰DIP (Dependency Inversion Principle) : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (๋งค์šฐ ์ค‘์š”)

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

 

 

 

    ๐Ÿ“์ •๋ฆฌ

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

 

 

 

 


 

์ฃผ๋‹ˆํ•˜๋ž‘์˜ ๊ธ€์ด ๋งˆ์Œ์— ๋“œ์…จ๋‚˜์š”? ๊ตฌ๋…๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋Œ“๊ธ€ ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ช…๋ก์€ ์ฃผ๋‹ˆํ•˜๋ž‘์—๊ฒŒ ๋งŽ์€ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค


 

 

 

728x90
๋ฐ˜์‘ํ˜•