Spring/Spring Study

[Inflearn] 좋은 객체 지향 설계 원칙

모모토 2021. 6. 29. 11:15
반응형

※ 본 포스팅은 Inflearn - 김영한 강사님의 '스프링 핵심 원리 - 기본편' 을 참고,공부하여 만들었습니다.

 

 

1. 단일 책임 원칙( Single Responsibility Principle )

 

한 클래스는 하나의 책임만 가져야 한다.

 한 클래스가 하나의 책임만 가져야 한다는게 무슨뜻일까?

 

하나의 클래스(이하 A클래스)가 작동하기 위해서 필요한 객체를 A클래스에서 직접 생성하여 연결시키고

 

자기 자신을 실행시키는것들 이것들 각각이 하나의 책임이다(생성, 연결, 실행)

 

이 책임들을 덜어주어서 A클래스는 자기가 맡은 일만 실행할수 있도록 해주기 위한 원칙이 SRP이고

 

우리는 AppConfig라는 설정과 구성을 관장하는 클래스를 만들어 이를 해결해주었다.


 

2. 의존관계 역전 원칙 ( Dependency Inversion Principle ) 

 

프로그래머는 추상화에 의존해야지, 구체화에 의존해서는 안된다.

어렵게 생각하지말고 추상화에 의존 , 구체화에 의존한다는게 무슨의미일까?

 

추상화에 의존한다는것은 한껏 추상화한 인터페이스에 의존한다는 의미이고 ,

 

구체화에 의존한다는것은 이러한 인터페이스를 구현한 클래스에 의존한다는 의미이다.

 

다음 코드를 살펴보면서 이해해보자

 

public class MemberServiceImpl implements MemberService {
    //구현체가 하나밖에 없을경우 Impl을 붙이는게 관례
    private final MemberRepository memberRepository = new MemoryMemberRepository();
    
    // ... 생략 ... 
    
    }
    

위의 코드는 MemberRepository에 의존한것같은 알맞은 코드같아 보이지만 ,

 

new MemoryMemberRepository 구현체에 의존하고 있는 코드이다.

 

우리는 이렇게 코드 스스로 객체를 구현 생성 하는 과정을 AppConfig에 책임을 위임함으로써

 

AppConfig가 MemoryMemberRepository 객체 인스턴스를 클라이언트 코드 대신 생성해서

 

클라이언트 코드 에 의존관계를 주입했다. 이렇게해서 DIP 원칙을 따르면서 문제도 해결했다.


 

3.개방 폐쇄의 원칙 ( Open-Closed Principle )

소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다

위에서 했던 이야기들의 반복이지만 , AppConfig를 사용하여 구성과 설정을 담당하는 클래스를 따로 생성하였다.

 

따라서 MemoryMemberRepository로 사용하던 저장소를 다른 데이터베이스로 바꾸더라도

 

클라이언트 객체(MemberServiceImpl)의 코드는 수정할 필요없다.

 

수정할 필요는 없지만 새로운요소를 도입, 새롭게 확장이 가능하다는 의미이다.