Language/Java

[객체지ν–₯] SOLID μ›μΉ™μ΄λž€?

PgmJUN 2022. 3. 28. 02:10

 

🌳 SOLID 원칙

 

 

SOLID 원칙

 

 

μ˜€λŠ˜μ€ 객체지ν–₯ 개발의 5가지 원칙인 SOLID 원칙에 λŒ€ν•΄ κ³΅λΆ€ν•΄λ³΄μ•˜λ‹€.

 

S,O,L,I,D λŠ” 각각 λ‹¨μ–΄μ˜ 첫 κΈ€μžμ΄λ©° ν•©ν•˜μ—¬ μ†”λ¦¬λ“œ 원칙이라고 λΆ€λ₯Έλ‹€.

 

μ§€κΈˆλΆ€ν„° μ†”λ¦¬λ“œ 원칙에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

 

 


 

🌱 SRP ( Single Responsibility Principle )

 

SLP

 

SRPλŠ” Single Responsibility Principle 의 μ•½μžμ΄λ©° λ§κ·ΈλŒ€λ‘œ

단일 μ±…μž„ 원칙을 λœ»ν•œλ‹€.

 

ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€λŠ” 원칙이닀.

 

ν•˜λ‚˜μ˜ μ±…μž„μ΄λΌλŠ” 것은 ꡉμž₯히 λͺ¨ν˜Έν•œ ν‘œν˜„μ΄λ‹€.

 

"클 μˆ˜λ„ 있고 μž‘μ„ μˆ˜λ„" 있으며 "λ¬Έλ§₯κ³Ό 상황에 따라" λ‹€λ₯΄λ‹€.

 

μ€‘μš”ν•œ 기쀀은 변경이닀. 변경이 μžˆμ„ λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 크닀면 단일 μ±…μž„ 원칙을 μ œλŒ€λ‘œ 지킀지 λͺ»ν•œ 것이 λœλ‹€.

 

 


 

🌱 OCP ( Open Closed Principle )

 

OCP

 

OCPλŠ” Open Closed Principle 의 μ•½μžλ‘œ 개방 폐쇄 원칙을 λœ»ν•œλ‹€.

 

μ΄λŠ” "μ†Œν”„νŠΈμ›¨μ–΄λŠ” ν™•μž₯μ—λŠ” μ—΄λ €μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€" λŠ” 원칙이닀.

 

 


 

🌱 LSP ( Liskov Subsitution Principle )

LSP

 

LSPλŠ” Liskov Subsitution Principle μ˜ μ•½μžμ΄λ©° λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙을 λœ»ν•œλ‹€.

 

이 원칙이 μ˜λ―Έν•˜λŠ” λ°”λŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

 

- ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

 

- λ‹€ν˜•μ„±μ—μ„œ ν•˜μœ„ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ κ·œμ•½μ„ λ‹€ μ§€μΌœμ•Ό ν•œλ‹€.

 

EX) μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 엑셀은 μ•žμœΌλ‘œ κ°€λΌλŠ” κΈ°λŠ₯, λ’€λ‘œ κ°€κ²Œ κ΅¬ν˜„ν•˜λ©΄ LSP μœ„λ°˜

 

 


 

🌱 ISP ( Interface Segregation Principle )

 

ISP

 

ISPλŠ” Interface Segregation Principle  μ˜ μ•½μžλ‘œ μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙을 λœ»ν•œλ‹€.

 

이 κ·œμΉ™μ΄ μ˜λ―Έν•˜λŠ” λ°”λŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

 

- νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λŠ” ν•˜λ‚˜μ˜ λ²”μš© μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€ μ—¬λŸ¬ κ°œκ°€ λ‚«λ‹€.

 

- μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€ -> μš΄μ „, μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ 뢄리

 

- μ‚¬μš©μž ν΄λΌμ΄μ–ΈνŠΈ -> μš΄μ „μž, 정비사 ν΄λΌμ΄μ–ΈνŠΈλ‘œ 뢄리 

 

- λΆ„λ¦¬ν•˜λ©΄ μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄κ°€ 변해도 μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈμ— 영ν–₯을 주지 μ•ŠμŒ

 

- μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ…확해지고, λŒ€μ²΄ κ°€λŠ₯성이 높아진닀

 

 


 

🌱 DIP ( Dependency Inversion Principle )

 

DIP

 

DIPλŠ” Dependency Inversion Principle μ˜ μ•½μžλ‘œ μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙을 λœ»ν•œλ‹€.

 

이 원칙이 μ˜λ―Έν•˜λŠ” λ°”λŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” "ꡬ체화가 μ•„λ‹Œ 좔상화에 μ˜μ‘΄ν•΄μ•Όν•œλ‹€." 

 

μ‰½κ²Œ μ΄μ•ΌκΈ°ν•΄μ„œ κ΅¬ν˜„λœ ν΄λž˜μŠ€κ°€ μ•„λ‹Œ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” λœ»μ΄λ‹€.

 

예λ₯Ό λ“€μ–΄ λ§ν•˜λ©΄ λͺ¨λ‹, ν…ŒμŠ¬λΌ, μ œλ„€μ‹œμŠ€ λ“±μ˜ κ΅¬ν˜„μ²΄κ°€ μ•„λ‹Œ μžλ™μ°¨ λΌλŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” 것이닀.

 

 


 

🀷‍♂️ 문제점?

 

 

얼핏보면 μœ„μ˜ μ›μΉ™μœΌλ‘œ κ°œλ°œμ„ ν•˜λŠ” 데에 μ•„λ¬΄λŸ° λ¬Έμ œκ°€ μ—†μ–΄λ³΄μ΄μ§€λ§Œ 그렇지 μ•Šλ‹€.

 

OCPλŠ” ν™•μž₯μ—λŠ” μ—΄λ €μžˆμ§€λ§Œ λ³€κ²½μ—λŠ” λ‹«ν˜€μžˆλ‹€ λΌλŠ” 원칙이닀.

 

ν•˜μ§€λ§Œ

 

ν™•μž₯을 ν•˜λ €λ©΄ λ‹Ήμ—°νžˆ κΈ°μ‘΄ μ½”λ“œλ₯Ό λ³€κ²½ν•˜λŠ” 것 μ•„λ‹Œκ°€?

 

λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•œλ‹€κ³  해도

 

MemeberRepository m = new MemoryMemberRepository(); //κΈ°μ‘΄ μ½”λ“œ

MemberRepository m = new JdbcMemberRepository(); //λ³€κ²½ μ½”λ“œ

 

μ΄λ ‡κ²Œ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€λ§Œ κ΅¬ν˜„μ²΄μ—λ„ μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— 변경이 μΌμ–΄λ‚œλ‹€.

 

μ΄λ ‡κ²Œ 되면 OCP뿐만 μ•„λ‹ˆλΌ DIPκΉŒμ§€ μœ„λ°˜ν•˜κ²Œ λ˜λŠ” 꼴이닀.

 

 

"이λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•  수 μžˆμ„κΉŒ" 에 λŒ€ν•œ 뢀뢄은 μŠ€ν”„λ§μ˜ DI와 IoCκ°€ μ œκ³΅ν•œλ‹€.

 

λ‹€μŒ μ‹œκ°„μ—λŠ” μŠ€ν”„λ§μ˜ DI와 IoC에 λŒ€ν•΄ μ•Œμ•„λ³΄λŠ” μ‹œκ°„μ„ 갖도둝 ν•˜κ² λ‹€.

 

 

 

λ˜ν•œ μ•žμ„œ μœ„μ—μ„œ μ„€λͺ…ν•œ SOLID원칙은 객체지ν–₯을 κ³΅λΆ€ν•˜λŠ” 데에 μ€‘μš”ν•œ λ‚΄μš©μ΄λ―€λ‘œ 잘 μˆ™μ§€ν•˜λ„λ‘ ν•˜μž