ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [๋””์ž์ธํŒจํ„ด] ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ SOLID(feat: Spring)
    ๐Ÿ’ปProgramming/๋””์ž์ธํŒจํ„ด 2024. 3. 22. 18:45

    SOLID ์›์น™์„ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ 

    ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ๊ธฐ๋Šฅ๋“ค์ด ์˜ํ–ฅ์„ ์ ๊ฒŒ ๋ฐ›๋Š” ๊ฒƒ์ด ์ข‹์€ ์„ค๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ. ์ด ์ข‹์€ ์„ค๊ณ„๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜ํƒ€๋‚œ ๋‹ค์„ฏ๊ฐ€์ง€ ์›์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด SOLID์›์น™์ด๋‹ค.

    ์ด ์›์น™์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•˜๊ณ , ์œ ์ง€ ๋ณด์ˆ˜ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง€๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ์ œ๊ฑฐํ•ด ๊ฐœ๋ฐœ์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค

    ๋˜ํ•œ, ๋ฉด์ ‘ ๋‹จ๊ณจ ์งˆ๋ฌธ์ด๋ผ๊ณ  ํ•˜๋‹ˆ ์ž˜ ๊ธฐ์–ตํ•ด๋‘๋ฉด ์ข‹๊ฒ ๋‹ค. 

     

    1. SRP(Single Responsibility Principle): ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

    • ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผํ•œ๋‹ค. -> ํ•œ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ. 
    • ๋งŒ์•ฝ ํ•œ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ ์ˆ˜์ •ํ•ด์•ผํ•  ์ฝ”๋“œ๊ฐ€ ์ฆ๊ฐ€. ex. A๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋”๋‹ˆ B๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , C์ˆ˜์ •ํ•ด์•ผํ•˜๊ณ .. ์—ฐ์‡„์ ์œผ๋กœ ์ˆ˜์ • -> ํ•œ ์ฑ…์ž„์˜ ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์ฑ…์ž„์˜ ๋ณ€๊ฒฝ์œผ๋กœ์˜ ์—ฐ์‡„ ์ž‘์šฉ์„ ๊ทน๋ณต ๊ฐ€๋Šฅ.
    • ํ•œ ์ฑ…์ž„์ด๋ผ๋Š” ๊ธฐ์ค€์ด ๋ชจํ˜ธํ•˜์ง€๋งŒ, ์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ์ด๋‹ค. ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ๋‹ค๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

    2. OCP(Open/Closed Principle): ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™

    • ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. -> ๋‹คํ˜•์„ฑ์˜ ํ™œ์šฉ
    • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„. 
    • ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋™์ฐจ ๊ธฐ๋Šฅ์„ ๋ช…์‹œํ•ด๋†“์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๊ณ , ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ํ…Œ์Šฌ๋ผ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ œ๋„ค์‹œ์Šค๋กœ ๋ฐ”๊พธ๊ณ ์‹ถ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ œ๋„ค์‹œ์Šค ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์•ผ์ง€ ํ…Œ์Šฌ๋ผ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๊ณ ์ณ์„œ ์ œ๋„ค์‹œ์Šค ํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ์ง€ ๋ง๋ผ๋Š” ์ด์•ผ๊ธฐ์ด๋‹ค. -> ์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ.(์—ญํ• : ์ธํ„ฐํŽ˜์ด์Šค, ๊ตฌํ˜„: ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค)
    • ์ •๋ฆฌํ•˜์ž๋ฉด, ์ถ”์ƒํ™” ์‚ฌ์šฉ์„ ํ†ตํ•œ ๊ด€๊ณ„ ๊ตฌ์ถ•์„ ๊ถŒ์žฅ ์˜๋ฏธ

    OCP(Open/Closed Principle) ๋ฌธ์ œ์ 

    MemberService๊ฐ€ MemberRepository๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒํ•œ๋‹ค. 

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

    ์ด ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. -> ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 

    3. LSP(Liskov Substitution Principle): ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

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

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

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

    5. DIP(Dependency Inversion Principle): ์˜์กด ์—ญ์ „ ์›์น™

    • ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด๋ผ. <- ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค. 
    • ์ด๋ฅผ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ. ๊ตฌํ˜„์ฒด์˜ ์˜์กด์€ ๋ณ€๊ฒฝ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ฌ. 
    • ์•„๊นŒ OCP์—์„œ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์™€ ๊ฐ™๋‹ค.
    MebmerRepository memberRepository = new MemoryMemberRepository(); // ๊ธฐ์กด
    
    MemberRepository memberRepository = new JdbcMemberRepository(); // ๋ณ€๊ฒฝ

    ์ด๋ ‡๊ฒŒ ํ•˜์ง€๋ง๋ž€์–˜๊ธฐ. -> DIP ์œ„๋ฐ˜

     

    ์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…์˜ ๋‹จ์ 

    ์ถ”์ƒํ™”๋ผ๋Š” ๋น„์šฉ ๋ฐœ์ƒ

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

     

    References

    ์ธํ”„๋Ÿฐ - https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

     

    ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ ๊ฐ•์˜ - ์ธํ”„๋Ÿฐ

    ์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์„ฑ์žฅํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์„ธ์š”! ๐Ÿ“ข

    www.inflearn.com

    https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99-SOLID

     

    ๐Ÿ’  ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ - S.O.L.I.D

    ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5์›์น™ S.O.L.I.D ๋ชจ๋“  ์ฝ”๋“œ์—์„œ LSP๋ฅผ ์ง€ํ‚ค๊ธฐ์—๋Š” ์–ด๋ ค์›€. ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์— ๋”ฐ๋ฅด๋ฉด ์ž์‹ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€์‹ ํ•˜๋”๋ผ๋„ ์˜๋„์— ๋งž๊ฒŒ ์ž‘๋™๋˜์–ด

    inpa.tistory.com

     

Designed by Tistory.