SpringπŸ€/Spring κΈ°λ³ΈπŸ€πŸ€

쒋은 객체 μ§€ν–₯ μ„€κ³„μ˜ 5κ°€μ§€ 원칙(SOLID)+객체지ν–₯섀계와 μŠ€ν”„λ§

@ENFJ 2022. 9. 24. 22:53

쒋은 객체 μ§€ν–₯ μ„€κ³„μ˜ 5κ°€μ§€ 원칙

solid λž€ 무엇인가

 γ„΄ ν΄λ¦°μ½”λ“œλ‘œ 유λͺ…ν•œ λ‘œλ²„νŠΈ λ§ˆν‹΄μ΄ 쒋은 객체 μ§€ν–₯μ„€κ³„μ˜ 5κ°€μ§€λ₯Ό 정리λ₯Ό ν–ˆλŠ”λ° 

μ•„λž˜μ™€ 같이 μ•žκΈ€μžλ§Œ λ”°μ„œ SOLID 라고 ν•œλ‹€ .

 

1. SRP : 단일 μ±…μž„ 원칙 (single resposibility principle)

2. OCP : 개발 -폐쇄 원칙 (open/closed principle)

3. LSP : λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 ( Liskov substitution Principle)

4. ISP : μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙 (interface segregation principle)

5. DIP : μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙 ( Dependency inversion principle)

 

 


1. SRP : 단일 μ±…μž„ 원칙 (single resposibility principle)

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

μ€‘μš”ν•œ 기쀀은 변경이닀. 변경이 μžˆμ„λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 잘 λ”°λ₯Έ 것.

ex) UI λ³€κ²½, 객체의 생성과 μ‚¬μš©μ„ 뢄리

 

2. OCP : 개발 -폐쇄 원칙 (open/closed principle)

정말 μ€‘μš”ν•œ 원칙이닀. 

μ†Œν”„νŠΈμ›¨μ–΄ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ € μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€. πŸ€”μ—₯.. 이게 λ¬΄μŠ¨λ§μ΄μ§€?

μ—΄λŸ¬μžˆμœΌλ‚˜? λ‹«ν˜€μžˆμ–΄μ•Όν•œλ‹€..?

 

λ‹€ν˜•μ„±μ— λŒ€ν•΄ λ‹€μ‹œ 보자.

μ—¬κΈ°μ„œ ν™•μž₯에 μ—΄λ €μžˆκ³  변경에 λ‹«ν˜€μžˆλ‹€ λΌλŠ” μ˜λ―ΈλŠ” λ‹€ν˜•μ„±μ˜ 의미λ₯Ό μƒκ°ν•˜λ©΄μ„œ μ΄ν•΄ν•˜λ©΄ λœλ‹€...?...

μΈν„°νŽ˜μ΄μŠ€κ°€ μžλ™μ°¨ μš΄μ „λ°©λ²• 이라고 κ°€μ •ν•œλ‹€λ©΄ κ°‘μžκΈ° λ³€κ²½λœλ‹€λ©΄ μœ„μ— k3 , μ•„λ°˜ν…Œ 든간에 μžλ™μ°¨ μš΄μ „μ— μžˆμ–΄ 영ν–₯을 λ―ΈμΉ  수 μžˆλ‹€...?....πŸ˜‘ 그치만 μ½”λ“œ μˆ˜μ •..λ³€κ²½...은 ν•΄μ•Όλ˜μ§€ μ•Šμ„κΉŒ..?

λΆ„λͺ… λ‹€ν˜•μ„±μ„ μ‚¬μš©ν–ˆμ§€λ§Œ OCP원칙을 지킬 수 μ—†λ‹€.

 μ΄ 문제λ₯Ό ν•΄κ²°ν•˜κΈ°μœ„ν•΄μ„œλŠ” 객체λ₯Ό μƒμ„±ν•˜κ³ , 연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”ν•˜λ‹€κ³  ν•œλ‹€.πŸ˜£πŸ€”

<일단 λ‚˜μ€‘μ— 이 λΆ€λΆ„μ—λŒ€ν•΄ μΆ”κ°€ μ„€λͺ…ν•œ 글을 μ˜¬λ €μ•Όκ² λ‹€. 일단 PASS>

 

3. LSP : λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 ( Liskov substitution Principle)

 

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

 

μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 엑셀은 μ•žμœΌλ‘œ κ°€λΌλŠ” κΈ°λŠ₯이닀.

그런데 λ§Œμ•½ 엑셀을 밟으면 λ’€λ‘œκ°€κ²Œ λœλ‹€λ©΄..λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜μ›μΉ™μ„ μœ„λ°°ν•˜κ²Œ λœλ‹€.느리게 가더라도 μ•žμœΌλ‘œ κ°€μ•Όν•œλ‹€λŠ” 것이 λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙이닀.

 

4. ISP : μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙 (interface segregation principle)

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

 

μžλ™μ°¨λΌλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€λ©΄ ,, 

(1)μš΄μ „ μΈν„°νŽ˜μ΄μŠ€ , (2)μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€ 둜 뢄리 ν•΄λ³΄μž

 

μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€ λŠ” λ„ˆλ¬΄ 크기 λ•Œλ¬Έμ— μœ„μ™€ 같이 λΆ„λ¦¬ν•œλ‹€.

그러면 μ‚¬μš©μž ν΄λΌμ΄μ–ΈνŠΈλŠ” (1)μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈ (2) 정비사 ν΄λΌμ΄μ–ΈνŠΈ 둜 ꡬ뢄할 수 μžˆλ‹€.

 

5. DIP : μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙 ( Dependency inversion principle)

ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 좔상화에 μ˜μ‘΄ν•΄μ•Όμ§€, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€. // μ˜μ‘΄μ„± μ£Όμž…μ€ 이 원칙을 λ”°λ₯΄λŠ” 방법쀑 ν•˜λ‚˜μ΄λ‹€.

=> κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고, μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” λœ»μ΄λ‹€.

λ‹€μ‹œ μœ„ 그림을 κ°€μ§€κ³  μ„€λͺ…ν•˜μžλ©΄  μš΄μ „μžλŠ” μžλ™μ°¨μ˜ 역할에 λŒ€ν•΄μ„œλ§Œ μ•Œμ•„μ•Όν•œλ‹€λŠ” 것이닀.

μš΄μ „μžκ°€ k3 , μ•„λ°˜λ–Όμ— λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μ—†λ‹€.

 

μ—¬κΈ°μ„œ MemberService λŠ” MemberRepository 만 μ•„λŠ” 것이 μ•„λ‹ˆλΌ MemorymemberRepository κΉŒμ§€ μ•„λŠ”κ²ƒμ΄λ‹€.

κ·Έλž˜μ„œ MemoryMemberRepositoryλ₯Ό λ”΄κ±Έλ‘œ λ°”κΎΈλ €κ³  ν• λ•Œ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Όν•œλ‹€.

πŸ€” DIP μœ„λ°˜..??   ν˜Όλž€μŠ€λŸ½λ‹€..😣😣

DIPλ₯Ό λ§Œμ‘±ν•˜κΈ° μœ„ν•΄μ„œλŠ” MemberService  κ°€ MemberRepository μΈν„°νŽ˜μ΄μŠ€μ—λ§Œ μ˜μ‘΄ν•˜λ„λ‘ 클래슀λ₯Ό μ„€κ³„ν•΄μ•Όν•˜λŠ”λ°..

 

이 ν•΄κ²° 방법은  <λ‹€μŒ 글에 정리>

 

정리:

- 객체 μ§€ν–₯의 핡심은 λ‹€ν˜•μ„±

- λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” μ‰½κ²Œ λΆ€ν’ˆμ„ κ°ˆμ•„ λΌμš°λ“―μ΄ κ°œλ°œν•  수 μ—†λ‹€.

- λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν• λ•Œ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ„ ν•¨κ»˜ λ³€κ²½λœλ‹€.

- λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” OCP DIPλ₯Ό 지킬 수 μ—†λ‹€. ===> λ­”κ°€ 더 ν•„μš”ν•¨!!


객체 μ§€ν–₯ 섀계와 μŠ€ν”„λ§

μ˜›λ‚ μ—λŠ” κ°œλ°œμžλ“€μ΄ 쒋은 객체 μ§€ν–₯ κ°œλ°œμ„ ν•˜κΈ°μœ„ν•΄ OCP(개발-폐쇄), DIP(μ˜μ‘΄κ΄€κ²Œ μ—­μ „)원칙을 μ§€ν‚€λ©΄μ„œ κ°œλ°œμ„ ν•΄λ³΄λ‹ˆ λ„ˆλ¬΄ 할일이 λ§Žμ•˜λ‹€.  ===> κ·Έλž˜μ„œ ν”„λ ˆμž„μ›Œν¬λ‘œ λ§Œλ“€μ–΄λ²„λ Έλ‹€.

 

μš°λ¦¬κ°€ 직접 μˆœμˆ˜ν•˜κ²Œ JAVA 둜 OCP,DIP 원칙듀을 μ§€ν‚€λ©΄μ„œ κ°œλ°œμ„ 해보면 κ²°κ΅­μ—λŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό λ§Œλ“€κ²Œ λœλ‹€.

(==DI μ»¨ν…Œμ΄λ„ˆ)  // 

 

정리

1. λͺ¨λ“ μ„€κ³„에 μ—­ν• κ³Ό κ΅¬ν˜„μ„ 뢄리

2. μ•žμ„œ μ •λ¦¬ν•œ κΈ€μ—μ„œ μžλ™μ°¨, 곡연을 λΉ„μœ λ‘œ ν–ˆλ˜κ²ƒμ„ λ– μ˜¬λ €λ³΄μž.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계도 곡연을 μ„€κ³„ν•˜λ“―μ΄ λ°°μ—­λ§Œ λ§Œλ“€μ–΄λ‘κ³ , λ°°μš°λŠ” μ–Έμ œλ“ μ§€ μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ„λ‘ λ§Œλ“œλŠ”κ²ƒμ΄ 쒋은 객체 μ§€ν–₯ 섀계이닀.

3. μ΄μƒμ μœΌλ‘œλŠ” λͺ¨λ“  섀계에 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ€μ—¬ν•˜μž

 

싀무 κ³ λ―Ό

-> μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•˜λ©΄ μΆ”μƒν™”λΌλŠ” λΉ„μš©μ΄ λ°œμƒν•œλ‹€. // 좔상화가 되면 λ‹€μ‹œ μ½”λ“œλ₯Ό λ“€μ—¬λ‹€ 보아야 함.

-> κΈ°λŠ₯을 ν™•μž₯ν•  κ°€λŠ₯성이 μ—†λ‹€λ©΄,  ꡬ체 클래슀λ₯Ό 직접 μ‚¬μš©ν•˜κ³ , ν–₯ν›„ κΌ­ ν•„μš”ν•  λ•Œ λ¦¬νŒ©ν„°λ§ν•΄μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•˜λŠ”κ²ƒλ„ 방법이닀.